From e323f8a1097072eb53f809aaa905b104f74b44b3 Mon Sep 17 00:00:00 2001 From: xiaokai <2485423036@qq.com> Date: Tue, 27 Jun 2023 19:28:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=80=E7=BB=88=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RTL分析代码/cv32e40p_controller.sv | 1589 -- .../RTL分析代码/cv32e40p_cs_registers.sv | 1587 -- .../RTL分析代码/cv32e40p_decoder.sv | 3048 --- .../SGI STL源码/SGI STL源码/algo.h | 114 + .../SGI STL源码/SGI STL源码/algobase.h | 71 + .../SGI STL源码/SGI STL源码/algorithm | 40 + .../SGI STL源码/SGI STL源码/alloc.h | 46 + .../SGI STL源码/SGI STL源码/bitset | 1074 + .../SGI STL源码/SGI STL源码/bvector.h | 52 + .../SGI STL源码/SGI STL源码/char_traits.h | 152 + .../SGI STL源码/concept_checks.h | 811 + .../SGI STL源码/container_concepts.h | 247 + .../SGI STL源码/SGI STL源码/defalloc.h | 87 + .../SGI STL源码/SGI STL源码/deque | 41 + .../SGI STL源码/SGI STL源码/deque.h | 43 + .../SGI STL源码/SGI STL源码/function.h | 118 + .../SGI STL源码/SGI STL源码/functional | 26 + .../SGI STL源码/SGI STL源码/hash_map | 40 + .../SGI STL源码/SGI STL源码/hash_map.h | 49 + .../SGI STL源码/SGI STL源码/hash_set | 40 + .../SGI STL源码/SGI STL源码/hash_set.h | 44 + .../SGI STL源码/SGI STL源码/hashtable.h | 48 + .../SGI STL源码/SGI STL源码/heap.h | 46 + .../SGI STL源码/SGI STL源码/iterator | 47 + .../SGI STL源码/SGI STL源码/iterator.h | 113 + .../SGI STL源码/SGI STL源码/limits | 537 + .../SGI STL源码/SGI STL源码/list | 40 + .../SGI STL源码/SGI STL源码/list.h | 42 + .../SGI STL源码/SGI STL源码/map | 40 + .../SGI STL源码/SGI STL源码/map.h | 46 + .../SGI STL源码/SGI STL源码/memory | 134 + .../SGI STL源码/SGI STL源码/multimap.h | 46 + .../SGI STL源码/SGI STL源码/multiset.h | 46 + .../SGI STL源码/SGI STL源码/numeric | 49 + .../SGI STL源码/SGI STL源码/pair.h | 51 + .../SGI STL源码/SGI STL源码/pthread_alloc | 495 + .../SGI STL源码/pthread_alloc.h | 31 + .../SGI STL源码/SGI STL源码/queue | 45 + .../SGI STL源码/SGI STL源码/rope | 32 + .../SGI STL源码/SGI STL源码/rope.h | 34 + .../SGI STL源码/SGI STL源码/ropeimpl.h | 1587 ++ .../SGI STL源码/sequence_concepts.h | 204 + .../SGI STL源码/SGI STL源码/set | 40 + .../SGI STL源码/SGI STL源码/set.h | 46 + .../SGI STL源码/SGI STL源码/slist | 28 + .../SGI STL源码/SGI STL源码/slist.h | 30 + .../SGI STL源码/SGI STL源码/stack | 41 + .../SGI STL源码/SGI STL源码/stack.h | 46 + .../SGI STL源码/SGI STL源码/stdexcept | 96 + .../SGI STL源码/SGI STL源码/stl_algo.h | 3297 +++ .../SGI STL源码/stl_algobase.h | 696 + .../SGI STL源码/SGI STL源码/stl_alloc.h | 897 + .../SGI STL源码/SGI STL源码/stl_bvector.h | 896 + .../SGI STL源码/SGI STL源码/stl_config.h | 576 + .../SGI STL源码/stl_construct.h | 124 + .../SGI STL源码/stl_ctraits_fns.h | 69 + .../SGI STL源码/SGI STL源码/stl_deque.h | 1652 ++ .../SGI STL源码/stl_exception.h | 57 + .../SGI STL源码/stl_function.h | 725 + .../SGI STL源码/stl_hash_fun.h | 93 + .../SGI STL源码/stl_hash_map.h | 532 + .../SGI STL源码/stl_hash_set.h | 514 + .../SGI STL源码/stl_hashtable.h | 1054 + .../SGI STL源码/SGI STL源码/stl_heap.h | 297 + .../SGI STL源码/stl_iterator.h | 964 + .../SGI STL源码/stl_iterator_base.h | 367 + .../SGI STL源码/SGI STL源码/stl_list.h | 885 + .../SGI STL源码/SGI STL源码/stl_map.h | 295 + .../SGI STL源码/stl_multimap.h | 282 + .../SGI STL源码/stl_multiset.h | 274 + .../SGI STL源码/SGI STL源码/stl_numeric.h | 255 + .../SGI STL源码/SGI STL源码/stl_pair.h | 101 + .../SGI STL源码/SGI STL源码/stl_queue.h | 243 + .../SGI STL源码/stl_range_errors.h | 71 + .../SGI STL源码/stl_raw_storage_iter.h | 81 + .../SGI STL源码/SGI STL源码/stl_relops.h | 62 + .../SGI STL源码/SGI STL源码/stl_rope.h | 2714 +++ .../SGI STL源码/SGI STL源码/stl_set.h | 268 + .../SGI STL源码/SGI STL源码/stl_slist.h | 1048 + .../SGI STL源码/SGI STL源码/stl_stack.h | 143 + .../SGI STL源码/stl_string_fwd.h | 40 + .../SGI STL源码/SGI STL源码/stl_tempbuf.h | 162 + .../SGI STL源码/SGI STL源码/stl_threads.h | 374 + .../SGI STL源码/SGI STL源码/stl_tree.h | 1366 ++ .../SGI STL源码/stl_uninitialized.h | 279 + .../SGI STL源码/SGI STL源码/stl_vector.h | 869 + .../SGI STL源码/SGI STL源码/string | 2413 ++ .../SGI STL源码/SGI STL源码/tempbuf.h | 61 + .../SGI STL源码/SGI STL源码/tree.h | 46 + .../SGI STL源码/SGI STL源码/type_traits.h | 373 + .../SGI STL源码/SGI STL源码/utility | 38 + .../SGI STL源码/SGI STL源码/valarray | 1773 ++ .../SGI STL源码/SGI STL源码/vector | 42 + .../SGI STL源码/SGI STL源码/vector.h | 43 + .../Tcls/Tcls/.formality.tcl.swp | Bin 0 -> 16384 bytes src/UWE_projectCode/Tcls/Tcls/formality.tcl | 138 + src/UWE_projectCode/Tcls/Tcls/lib_to_db.tcl | 9 + src/UWE_projectCode/Tcls/Tcls/pt.tcl | 86 + src/UWE_projectCode/Tcls/Tcls/syn_main.tcl | 348 + .../finddialog查找搜索代码/UWE_file.pro | 26 - .../UWE_file.pro.user | 427 - .../finddialog.cpp | 135 - .../finddialog查找搜索代码/finddialog.h | 53 - .../finddialog查找搜索代码/main.cpp | 11 - .../mainwindow.cpp | 116 - .../finddialog查找搜索代码/mainwindow.h | 49 - .../mainwindow.ui | 109 - .../finddialog查找搜索代码/widget.cpp | 63 - .../finddialog查找搜索代码/widget.h | 24 - src/UWE_projectCode/tmp/tmp/.Makefile.swl | Bin 0 -> 16384 bytes src/UWE_projectCode/tmp/tmp/.Makefile.swm | Bin 0 -> 16384 bytes src/UWE_projectCode/tmp/tmp/.Makefile.swn | Bin 0 -> 16384 bytes src/UWE_projectCode/tmp/tmp/.Makefile.swo | Bin 0 -> 16384 bytes src/UWE_projectCode/tmp/tmp/.Makefile.swp | Bin 0 -> 20480 bytes src/UWE_projectCode/tmp/tmp/.dc.log.swo | Bin 0 -> 16384 bytes .../tmp/tmp/.setModuleName.tcl.swp | Bin 0 -> 12288 bytes src/UWE_projectCode/tmp/tmp/Makefile | 440 + src/UWE_projectCode/tmp/tmp/Makefile (copy) | 440 + src/UWE_projectCode/tmp/tmp/Makefile~ | 440 + .../tmp/tmp/ProjectPathSetting.tcl | 2 + .../tmp/tmp/Scripts/R0_check.result | 7 + .../tmp/tmp/Scripts/SVNSubmit.sh | 30 + .../tmp/tmp/Scripts/auto_eco.sh | 85 + .../tmp/tmp/Scripts/calc_dff_count.sh | 14 + src/UWE_projectCode/tmp/tmp/Scripts/cds_gen | 26 + src/UWE_projectCode/tmp/tmp/Scripts/check.sh | 11 + .../tmp/tmp/Scripts/check_R0.sh | 65 + .../tmp/tmp/Scripts/check_SRC_ID.sh | 44 + .../tmp/tmp/Scripts/check_Skeyword | 6 + .../tmp/tmp/Scripts/check_code.sh | 75 + .../tmp/tmp/Scripts/check_code_auto.sh | 108 + .../tmp/tmp/Scripts/check_file_occupy | 10 + .../tmp/tmp/Scripts/check_files.sh | 15 + src/UWE_projectCode/tmp/tmp/Scripts/check_han | 3 + .../tmp/tmp/Scripts/check_timescale | 3 + .../tmp/tmp/Scripts/clock_cross.pl | 18 + .../tmp/tmp/Scripts/copy_sdc.sh | 32 + .../tmp/tmp/Scripts/create_dummy.py | 200 + .../custom_methodology/.submethodology_help | 9 + .../adv_lint/.submethodology_help | 3 + .../adv_lint/adv_lint_setup.spq | 34 + .../adv_lint/adv_lint_setup_debug_help.htm | 65 + .../adv_lint/adv_lint_struct.spq | 43 + .../adv_lint/adv_lint_struct_debug_help.htm | 72 + .../adv_lint/adv_lint_verify.spq | 41 + .../adv_lint/adv_lint_verify_debug_help.htm | 72 + .../adv_lint/lint_functional_rtl.spq | 81 + .../lint_functional_rtl_debug_help.htm | 72 + .../cdc/.submethodology_help | 3 + .../custom_methodology/cdc/cdc_abstract.spq | 93 + .../cdc/cdc_abstract_debug_help.htm | 67 + .../custom_methodology/cdc/cdc_setup.spq | 69 + .../cdc/cdc_setup_check.spq | 137 + .../cdc/cdc_setup_check_debug_help.htm | 82 + .../cdc/cdc_setup_debug_help.htm | 68 + .../custom_methodology/cdc/cdc_verify.spq | 245 + .../cdc/cdc_verify_debug_help.htm | 85 + .../cdc/cdc_verify_struct.spq | 244 + .../cdc/cdc_verify_struct_debug_help.htm | 80 + .../cdc/clock_reset_integrity.spq | 117 + .../cdc/clock_reset_integrity_debug_help.htm | 79 + .../connectivity_verification.spq | 94 + .../constraints/.submethodology_help | 10 + .../constraints/sdc_abstract.spq | 41 + .../constraints/sdc_abstract_debug_help.htm | 14 + .../constraints/sdc_audit-setup.sgs | 121 + .../constraints/sdc_audit.spq | 52 + .../constraints/sdc_audit_debug_help.htm | 68 + .../constraints/sdc_check.spq | 108 + .../constraints/sdc_check_debug_help.htm | 16 + .../constraints/sdc_check_setup.sgs | 17 + .../constraints/sdc_equiv.spq | 41 + .../constraints/sdc_equiv_debug_help.htm | 85 + .../constraints/sdc_equiv_setup.sgs | 96 + .../constraints/sdc_exception_struct.spq | 53 + .../sdc_exception_struct_debug_help.htm | 68 + .../sdc_exception_struct_setup.sgs | 16 + .../constraints/sdc_gen.spq | 48 + .../constraints/sdc_gen_debug_help.htm | 15 + .../constraints/sdc_gen_setup.sgs | 234 + .../constraints/sdc_hier_equiv.spq | 42 + .../constraints/sdc_hier_equiv_debug_help.htm | 85 + .../constraints/sdc_hier_equiv_setup.sgs | 96 + .../constraints/sdc_redundancy.spq | 63 + .../constraints/sdc_redundancy_debug_help.htm | 71 + .../constraints/sdc_redundancy_setup.sgs | 16 + .../dft/.submethodology_help | 8 + .../custom_methodology/dft/dft_abstract.spq | 57 + .../dft/dft_abstract_debug_help.htm | 69 + .../dft/dft_best_practice-01.jpg | Bin 0 -> 19406 bytes .../dft/dft_best_practice.spq | 200 + .../dft/dft_best_practice_debug_help.htm | 79 + .../custom_methodology/dft/dft_bist_ready.spq | 39 + .../dft/dft_dsm_best_practice.spq | 151 + .../dft/dft_dsm_best_practice_debug_help.htm | 204 + .../dft/dft_dsm_random_resistance.spq | 58 + .../dft/dft_scan_ready-08.jpg | Bin 0 -> 73154 bytes .../dft/dft_scan_ready-09.jpg | Bin 0 -> 70428 bytes .../dft/dft_scan_ready-10.jpg | Bin 0 -> 27013 bytes .../dft/dft_scan_ready-11.jpg | Bin 0 -> 79593 bytes .../dft/dft_scan_ready-12.jpg | Bin 0 -> 53185 bytes .../dft/dft_scan_ready-13.jpg | Bin 0 -> 49023 bytes .../custom_methodology/dft/dft_scan_ready.spq | 101 + .../dft/dft_scan_ready_debug_help.htm | 151 + .../dft/dft_scan_ready_setup.sgs | 5 + .../lint/.submethodology_help | 23 + .../custom_methodology/lint/design_audit.spq | 126 + .../lint/design_audit_debug_help.htm | 65 + .../custom_methodology/lint/lint_abstract.spq | 46 + .../lint/lint_abstract_debug_help.htm | 69 + .../lint/lint_functional_rtl.spq | 81 + .../custom_methodology/lint/lint_rtl.spq | 611 + .../lint/lint_rtl_custom.tcl | 114 + .../lint/lint_rtl_debug_help.htm | 68 + .../lint/lint_turbo_rtl.spq | 566 + .../lint/lint_turbo_rtl_custom.tcl | 114 + .../mbist_dft/mbist_dft.spq | 25 + .../tmp/tmp/Scripts/custom_methodology/order | 95 + .../physical/lint_physical.spq | 104 + .../physical/physical_analysis_congestion.spq | 170 + ...hysical_analysis_congestion_debug_help.htm | 73 + .../physical_analysis_congestion_setup.sgs | 89 + .../physical/physical_analysis_signoff.spq | 197 + .../physical_analysis_signoff_debug_help.htm | 73 + .../physical_analysis_signoff_setup.sgs | 89 + .../physical_aware_power/.submethodology_help | 9 + .../doc/power_est_average.htm | 5 + .../physical_power_postfloorplan.spq | 62 + .../physical_power_postfloorplan_setup.sgs | 204 + .../power_est_average.spq | 34 + .../power_est_average_debug_help.htm | 68 + .../pppf_1_introduction.htm | 109 + .../pppf_2_select_techlib.htm | 101 + .../pppf_3_select_sdc.htm | 109 + .../pppf_4_select_fp1.htm | 112 + .../pppf_5_setup_powerest.htm | 109 + .../physical_aware_power/regression_run.tcl | 1 + .../power/.submethodology_help | 1 + .../power/power_activity_check.spq | 44 + .../power/power_activity_check_debug_help.htm | 65 + .../power/power_activity_check_setup.sgs | 34 + .../custom_methodology/power/power_atd.htm | 666 + .../custom_methodology/power/power_atd.spq | 48 + .../power/power_atd_debug_help.htm | 69 + .../power/power_atd_setup.sgs | 34 + .../custom_methodology/power/power_audit.spq | 50 + .../power/power_audit_debug_help.htm | 65 + .../power/power_audit_setup.sgs | 50 + .../power/power_calibration.spq | 63 + .../power/power_calibration_debug_help.htm | 65 + .../power/power_cge_profiling.spq | 75 + .../power/power_cge_profiling_est.spq | 61 + .../power/power_cge_profiling_save.spq | 46 + .../power/power_est_average.spq | 48 + .../power/power_est_average_debug_help.htm | 68 + .../power/power_est_average_setup.sgs | 50 + .../power/power_est_profiling.spq | 58 + .../power/power_est_profiling_save.spq | 46 + .../power/power_factor_conditions.spq | 49 + .../power/power_factor_values.spq | 47 + .../power/power_fix_verify.spq | 45 + .../power/power_fix_verify_debug_help.htm | 65 + .../power/power_fix_verify_setup.sgs | 17 + .../power/power_gen_pesd.spq | 53 + .../power/power_guidance.spq | 58 + .../power/power_mem_reduction.spq | 70 + .../power/power_mem_reduction_debug_help.htm | 65 + .../power/power_mem_reduction_setup.sgs | 47 + .../power/power_mode_detection-mixed.spq | 28 + .../power/power_mode_detection-verilog.spq | 28 + .../power/power_mode_detection-vhdl.spq | 28 + .../power/power_mode_detection_debug_help.htm | 68 + .../power/power_reduction_adv.spq | 73 + .../power/power_reduction_adv_debug_help.htm | 65 + .../power/power_reduction_adv_setup.sgs | 57 + .../custom_methodology/power/power_sec.spq | 55 + .../power/power_sec_debug_help.htm | 68 + .../power/power_sec_setup.sgs | 26 + .../power/power_selective_autofix.spq | 42 + .../power_selective_autofix_debug_help.htm | 65 + .../power/power_selective_autofix_setup.sgs | 17 + .../power/power_wtc_model.spq | 41 + .../power/power_wtc_profiler.spq | 41 + .../power/power_wtc_virtualizer.spq | 52 + .../custom_methodology/power/red_opt.tcl | 3 + .../power_verification/.submethodology_help | 5 + .../power_verif_abstract.spq | 28 + .../power_verif_abstract_setup.sgs | 19 + .../power_verification/power_verif_audit.spq | 73 + .../power_verif_audit_debug_help.htm | 65 + .../power_verif_instr_rtl.spq | 109 + .../power_verif_instr_rtl_debug_help.htm | 65 + .../power_verif_instr_rtl_setup.sgs | 20 + .../power_verif_noninstr.spq | 92 + .../power_verif_noninstr_debug_help.htm | 65 + .../power_verif_noninstr_setup.sgs | 20 + .../rdc/rdc_verify_struct.spq | 110 + .../rdc/rdc_verify_struct_setup.sgs | 4 + .../custom_methodology/regression_run.tcl | 49 + .../rtl2netlist/rtl2netlist_migration.spq | 50 + .../rtl2netlist_migration_debug_help.htm | 66 + .../txv_verification/.submethodology_help | 5 + .../txv_verification/fp_mcp_verification.spq | 72 + .../fp_mcp_verification_debug_help.htm | 95 + .../txv_verification/fp_verification.spq | 69 + .../fp_verification_debug_help.htm | 95 + .../txv_verification/mcp_verification.spq | 71 + .../mcp_verification_debug_help.htm | 95 + .../txv_verification/txv_glitch.spq | 23 + .../txv_verification/txv_rtl_gen.spq | 26 + .../txv_verification/txv_run_audit.spq | 78 + .../txv_run_audit_debug_help.htm | 63 + .../txv_verification/txv_sdc_migration.spq | 49 + .../tmp/tmp/Scripts/del_tmp_files.sh | 17 + .../tmp/tmp/Scripts/error_find.perl | 9 + .../tmp/tmp/Scripts/ezeco_setup.sh | 101 + src/UWE_projectCode/tmp/tmp/Scripts/ezlec.sh | 75 + .../tmp/tmp/Scripts/filelist_gen.sh | 58 + .../tmp/tmp/Scripts/get_CURRENT_DESIGN.sh | 3 + .../tmp/tmp/Scripts/get_DBs_info.sh | 23 + .../tmp/tmp/Scripts/get_PROJECT_PATH.sh | 3 + .../tmp/tmp/Scripts/quick_start | 70 + .../tmp/tmp/Scripts/report_dc_summary.sh | 74 + src/UWE_projectCode/tmp/tmp/Scripts/runAll.sh | 108 + src/UWE_projectCode/tmp/tmp/Scripts/setPP.sh | 12 + .../tmp/tmp/Scripts/tab_change | 20 + .../tmp/tmp/Scripts/temp_files_cleaner.sh | 41 + .../numberbox.css => tmp/tmp/Scripts/tmp.log} | 0 .../tmp/tmp/Scripts/warning_find.perl | 9 + .../tmp/tmp/Tcls/#syn_main.tcl# | 345 + .../tmp/tmp/Tcls/.syn_main.tcl.swm | Bin 0 -> 16384 bytes .../tmp/tmp/Tcls/.syn_main.tcl.swn | Bin 0 -> 16384 bytes .../tmp/tmp/Tcls/.syn_main.tcl.swo | Bin 0 -> 16384 bytes .../tmp/tmp/Tcls/.syn_main.tcl.swp | Bin 0 -> 16384 bytes .../tmp/tmp/Tcls/M6672_syn.tcl | 206 + src/UWE_projectCode/tmp/tmp/Tcls/cdc_goal.tcl | 120 + .../tmp/tmp/Tcls/common_options.tcl | 22 + src/UWE_projectCode/tmp/tmp/Tcls/compile.tcl | 34 + src/UWE_projectCode/tmp/tmp/Tcls/copyLib.tcl | 25 + .../tmp/tmp/Tcls/custom_options.tcl | 48 + .../tmp/tmp/Tcls/formality.tcl | 136 + .../tmp/tmp/Tcls/genus_flow.tcl | 644 + .../tmp/tmp/Tcls/lib_to_db.tcl | 7 + .../tmp/tmp/Tcls/lint_goal.tcl | 25 + .../tmp/tmp/Tcls/power_goal.tcl | 113 + src/UWE_projectCode/tmp/tmp/Tcls/pt.tcl | 84 + src/UWE_projectCode/tmp/tmp/Tcls/rdc_goal.tcl | 59 + src/UWE_projectCode/tmp/tmp/Tcls/sdc_goal.tcl | 42 + .../tmp/tmp/Tcls/spyglass_lint_rules.tcl | 140 + src/UWE_projectCode/tmp/tmp/Tcls/syn_main.tcl | 347 + .../tmp/tmp/Tcls/synth_options.tcl | 12 + src/UWE_projectCode/tmp/tmp/Tcls/txv_goal.tcl | 34 + .../tmp/tmp/Template/command.log | 6627 ++++++ .../Template/dc.work/dont_touch_filelist.v | 3 + .../Template/dc.work/specific_filelist.tcl | 32 + .../tmp/tmp/Template/dc.work/syn_specific.tcl | 4 + .../Template/dc.work/syn_specific_after.tcl | 8 + .../tmp/tmp/Template/filenames.log | 83 + .../tmp/tmp/Template/nc.work/sim_specific.sh | 2 + .../spyglass.work/constraints/cdc.sgdc | 30 + .../spyglass.work/constraints/lint.sgdc} | 0 .../spyglass.work/constraints/power.sgdc | 333 + .../spyglass.work/constraints/rdc.sgdc | 15 + .../spyglass.work/constraints/sdc.sgdc} | 0 .../spyglass.work/constraints/txv.sgdc} | 0 .../tmp/tmp/Template/spyglass.work/demo.prj | 86 + .../Template/spyglass.work/waiver/demo.awl} | 0 .../Template/spyglass.work/waiver/lint.awl} | 0 .../tmp/Template/vcs.work} | 0 src/UWE_projectCode/tmp/tmp/command.log | 6824 ++++++ src/UWE_projectCode/tmp/tmp/dc.log | 258 + .../tmp/dc.work/Logs/dc_2022_1004_0820.log | 258 + .../tmp/dc.work/Logs/pt_2023_0324_2136.log | 74 + .../report/cv32e40p_core.svf | Bin 0 -> 8448 bytes .../tmp/tmp/dc.work/dont_touch_filelist.v | 3 + .../tmp/tmp/dc.work/filelist.v | 1 + .../tmp/tmp/dc.work/specific_filelist.tcl | 32 + .../tmp/tmp/dc.work/syn_specific.tcl | 4 + .../tmp/tmp/dc.work/syn_specific_after.tcl | 8 + src/UWE_projectCode/tmp/tmp/filenames.log | 91 + .../tmp/tmp/nc.work/sim_filelist.f | 4 + .../tmp/tmp/nc.work/sim_specific.sh | 2 + src/UWE_projectCode/tmp/tmp/pt.log | 612 + .../tmp/tmp/pt_2023_0324_2131.log | 65 + .../tmp/tmp/pt_shell_command.log | 923 + .../tmp/spyglass.work/constraints/cdc.sgdc | 30 + .../tmp/spyglass.work/constraints/lint.sgdc} | 0 .../tmp/spyglass.work/constraints/power.sgdc | 333 + .../tmp/spyglass.work/constraints/rdc.sgdc | 15 + .../tmp/spyglass.work/constraints/sdc.sgdc | 0 .../tmp/spyglass.work/constraints/txv.sgdc | 0 .../tmp/tmp/spyglass.work/cv32e40p_core.prj | 86 + .../spyglass.work/waiver/cv32e40p_core.awl | 0 .../tmp/tmp/spyglass.work/waiver/lint.awl | 0 src/UWE_projectCode/tmp/tmp/tmp.log | 1 + src/UWE_projectCode/tmp/tmp/vcs.work | 0 .../changelog.txt | 714 - .../demo-mobile/accordion/_content.html | 18 - .../demo-mobile/accordion/basic.html | 1 - .../demo-mobile/accordion/header.html | 1 - .../demo-mobile/animation/basic.html | 1 - .../demo-mobile/animation/fade.html | 1 - .../demo-mobile/animation/pop.html | 1 - .../demo-mobile/animation/slide.html | 1 - .../demo-mobile/badge/basic.html | 1 - .../demo-mobile/badge/button.html | 1 - .../demo-mobile/badge/list.html | 1 - .../demo-mobile/badge/tabs.html | 1 - .../demo-mobile/button/basic.html | 1 - .../demo-mobile/button/group.html | 1 - .../demo-mobile/button/style.html | 1 - .../demo-mobile/button/switch.html | 1 - .../demo-mobile/datagrid/basic.html | 1 - .../demo-mobile/datagrid/rowediting.html | 104 - .../demo-mobile/datalist/basic.html | 1 - .../demo-mobile/datalist/group.html | 1 - .../demo-mobile/datalist/selection.html | 1 - .../demo-mobile/dialog/basic.html | 46 - .../demo-mobile/dialog/message.html | 41 - .../demo-mobile/form/basic.html | 44 - .../demo-mobile/images/login1.jpg | Bin 25789 -> 0 bytes .../demo-mobile/images/modem.png | Bin 1633 -> 0 bytes .../demo-mobile/images/more.png | Bin 110 -> 0 bytes .../demo-mobile/images/pda.png | Bin 1787 -> 0 bytes .../demo-mobile/images/scanner.png | Bin 2600 -> 0 bytes .../demo-mobile/images/tablet.png | Bin 2505 -> 0 bytes .../demo-mobile/input/numberspinner.html | 1 - .../demo-mobile/input/textbox.html | 1 - .../demo-mobile/layout/basic.html | 32 - .../demo-mobile/menu/basic.html | 39 - .../demo-mobile/menu/menubar.html | 45 - .../demo-mobile/panel/_content.html | 18 - .../demo-mobile/panel/ajax.html | 1 - .../demo-mobile/panel/basic.html | 1 - .../demo-mobile/panel/nav.html | 39 - .../demo-mobile/simplelist/basic.html | 1 - .../demo-mobile/simplelist/button.html | 1 - .../demo-mobile/simplelist/group.html | 1 - .../demo-mobile/simplelist/image.html | 1 - .../demo-mobile/simplelist/link.html | 1 - .../demo-mobile/tabs/basic.html | 1 - .../demo-mobile/tabs/nav.html | 1 - .../demo-mobile/tabs/pill.html | 1 - .../demo-mobile/toolbar/basic.html | 63 - .../demo-mobile/toolbar/button.html | 45 - .../demo-mobile/toolbar/menu.html | 76 - .../demo-mobile/tree/basic.html | 56 - .../demo-mobile/tree/dnd.html | 56 - .../demo/accordion/_content.html | 18 - .../demo/accordion/actions.html | 51 - .../demo/accordion/ajax.html | 28 - .../demo/accordion/basic.html | 52 - .../demo/accordion/datagrid_data1.json | 12 - .../demo/accordion/expandable.html | 33 - .../demo/accordion/fluid.html | 33 - .../demo/accordion/horizontal.html | 52 - .../demo/accordion/multiple.html | 34 - .../demo/accordion/tools.html | 48 - .../demo/calendar/basic.html | 19 - .../demo/calendar/custom.html | 46 - .../demo/calendar/disabledate.html | 28 - .../demo/calendar/firstday.html | 30 - .../demo/calendar/fluid.html | 23 - .../demo/calendar/weeknumber.html | 19 - .../demo/checkbox/basic.html | 26 - .../demo/checkgroup/basic.html | 42 - .../demo/combo/animation.html | 41 - .../demo/combo/basic.html | 48 - .../demo/combobox/actions.html | 88 - .../demo/combobox/basic.html | 73 - .../demo/combobox/combobox_data1.json | 22 - .../demo/combobox/combobox_data2.json | 47 - .../demo/combobox/customformat.html | 39 - .../demo/combobox/dynamicdata.html | 31 - .../demo/combobox/fluid.html | 43 - .../demo/combobox/group.html | 33 - .../demo/combobox/icons.html | 36 - .../demo/combobox/itemicon.html | 35 - .../demo/combobox/multiline.html | 75 - .../demo/combobox/multiple.html | 32 - .../demo/combobox/navigation.html | 77 - .../demo/combobox/remotedata.html | 30 - .../demo/combobox/remotejsonp.html | 54 - .../demo/combogrid/actions.html | 60 - .../demo/combogrid/basic.html | 40 - .../demo/combogrid/datagrid_data1.json | 12 - .../demo/combogrid/fluid.html | 63 - .../demo/combogrid/initvalue.html | 41 - .../demo/combogrid/multiple.html | 42 - .../demo/combogrid/navigation.html | 43 - .../demo/combogrid/setvalue.html | 59 - .../demo/combotree/actions.html | 43 - .../demo/combotree/basic.html | 22 - .../demo/combotree/fluid.html | 25 - .../demo/combotree/initvalue.html | 22 - .../demo/combotree/multiple.html | 26 - .../demo/combotree/test.html | 37 - .../demo/combotree/tree_data1.json | 49 - .../demo/combotreegrid/basic.html | 34 - .../demo/combotreegrid/multiple.html | 36 - .../demo/combotreegrid/treegrid_data1.json | 73 - .../demo/datagrid/aligncolumns.html | 32 - .../demo/datagrid/basic.html | 32 - .../demo/datagrid/cacheeditor.html | 149 - .../demo/datagrid/cellediting.html | 94 - .../demo/datagrid/cellstyle.html | 42 - .../demo/datagrid/checkbox.html | 42 - .../demo/datagrid/clientpagination.html | 160 - .../demo/datagrid/columngroup.html | 34 - .../demo/datagrid/complextoolbar.html | 50 - .../demo/datagrid/contextmenu.html | 89 - .../demo/datagrid/custompager.html | 53 - .../demo/datagrid/datagrid_data1.json | 12 - .../demo/datagrid/datagrid_data2.json | 15 - .../demo/datagrid/fluid.html | 32 - .../demo/datagrid/footer.html | 38 - .../demo/datagrid/formatcolumns.html | 39 - .../demo/datagrid/frozencolumns.html | 35 - .../demo/datagrid/frozenrows.html | 44 - .../demo/datagrid/mergecells.html | 58 - .../demo/datagrid/multisorting.html | 43 - .../demo/datagrid/products.json | 9 - .../demo/datagrid/rowborder.html | 60 - .../demo/datagrid/rowediting.html | 125 - .../demo/datagrid/rowstyle.html | 41 - .../demo/datagrid/selection.html | 57 - .../demo/datagrid/simpletoolbar.html | 45 - .../demo/datagrid/transform.html | 46 - .../demo/datalist/basic.html | 69 - .../demo/datalist/checkbox.html | 25 - .../demo/datalist/datalist_data1.json | 18 - .../demo/datalist/group.html | 23 - .../demo/datalist/multiselect.html | 23 - .../demo/datalist/remotedata.html | 22 - .../demo/datebox/basic.html | 25 - .../demo/datebox/buttons.html | 34 - .../demo/datebox/clone.html | 31 - .../demo/datebox/dateformat.html | 45 - .../demo/datebox/events.html | 31 - .../demo/datebox/fluid.html | 25 - .../demo/datebox/restrict.html | 34 - .../demo/datebox/sharedcalendar.html | 26 - .../demo/datebox/validate.html | 37 - .../demo/datetimebox/basic.html | 25 - .../demo/datetimebox/fluid.html | 25 - .../demo/datetimebox/initvalue.html | 22 - .../demo/datetimebox/showseconds.html | 25 - .../demo/datetimespinner/basic.html | 25 - .../demo/datetimespinner/clearicon.html | 33 - .../demo/datetimespinner/fluid.html | 25 - .../demo/datetimespinner/format.html | 55 - .../demo/demo.css | 24 - .../demo/dialog/basic.html | 23 - .../demo/dialog/complextoolbar.html | 46 - .../demo/dialog/fluid.html | 24 - .../demo/dialog/toolbarbuttons.html | 52 - .../demo/draggable/basic.html | 21 - .../demo/draggable/constrain.html | 35 - .../demo/draggable/snap.html | 37 - .../demo/drawer/basic.html | 21 - .../demo/drawer/headerfooter.html | 28 - .../demo/drawer/region.html | 35 - .../demo/droppable/accept.html | 78 - .../demo/droppable/basic.html | 77 - .../demo/droppable/sort.html | 71 - .../demo/easyloader/basic.html | 75 - .../demo/filebox/basic.html | 31 - .../demo/filebox/buttonalign.html | 32 - .../demo/filebox/fluid.html | 25 - .../demo/form/basic.html | 48 - .../demo/form/floatinglabel.html | 58 - .../demo/form/form_data1.json | 8 - .../demo/form/load.html | 62 - .../demo/form/validateonsubmit.html | 52 - .../demo/layout/_content.html | 18 - .../demo/layout/addremove.html | 53 - .../demo/layout/autoheight.html | 59 - .../demo/layout/basic.html | 39 - .../demo/layout/collapsetitle.html | 39 - .../demo/layout/complex.html | 57 - .../demo/layout/customcollapsetitle.html | 51 - .../demo/layout/datagrid_data1.json | 12 - .../demo/layout/fluid.html | 24 - .../demo/layout/full.html | 19 - .../demo/layout/nestedlayout.html | 31 - .../demo/layout/nocollapsible.html | 34 - .../demo/layout/propertygrid_data1.json | 20 - .../demo/layout/tree_data1.json | 49 - .../demo/linkbutton/basic.html | 33 - .../demo/linkbutton/fluid.html | 33 - .../demo/linkbutton/group.html | 33 - .../demo/linkbutton/iconalign.html | 32 - .../demo/linkbutton/plain.html | 28 - .../demo/linkbutton/size.html | 34 - .../demo/linkbutton/style.html | 31 - .../demo/linkbutton/toggle.html | 25 - .../demo/maskedbox/basic.html | 30 - .../demo/menu/basic.html | 68 - .../demo/menu/customitem.html | 50 - .../demo/menu/events.html | 40 - .../demo/menu/inline.html | 59 - .../demo/menu/nav.html | 146 - .../demo/menubutton/actions.html | 58 - .../demo/menubutton/alignment.html | 69 - .../demo/menubutton/basic.html | 54 - .../demo/menubutton/nav.html | 166 - .../demo/messager/alert.html | 40 - .../demo/messager/basic.html | 56 - .../demo/messager/interactive.html | 36 - .../demo/messager/position.html | 140 - .../demo/messager/tip.html | 51 - .../demo/numberbox/basic.html | 29 - .../demo/numberbox/fluid.html | 26 - .../demo/numberbox/format.html | 34 - .../demo/numberbox/range.html | 28 - .../demo/numberspinner/align.html | 31 - .../demo/numberspinner/basic.html | 27 - .../demo/numberspinner/fluid.html | 25 - .../demo/numberspinner/increment.html | 28 - .../demo/numberspinner/range.html | 25 - .../demo/pagination/attaching.html | 32 - .../demo/pagination/basic.html | 20 - .../demo/pagination/custombuttons.html | 38 - .../demo/pagination/layout.html | 62 - .../demo/pagination/links.html | 23 - .../demo/pagination/simple.html | 25 - .../demo/panel/_content.html | 18 - .../demo/panel/basic.html | 31 - .../demo/panel/customtools.html | 35 - .../demo/panel/fluid.html | 21 - .../demo/panel/footer.html | 22 - .../demo/panel/halign.html | 26 - .../demo/panel/loadcontent.html | 27 - .../demo/panel/nestedpanel.html | 30 - .../demo/panel/paneltools.html | 37 - .../demo/passwordbox/basic.html | 25 - .../demo/passwordbox/flash.html | 48 - .../demo/passwordbox/test.html | 46 - .../demo/passwordbox/validatepassword.html | 40 - .../demo/progressbar/basic.html | 30 - .../demo/progressbar/fluid.html | 21 - .../demo/propertygrid/basic.html | 61 - .../demo/propertygrid/customcolumns.html | 31 - .../demo/propertygrid/groupformat.html | 30 - .../demo/propertygrid/propertygrid_data1.json | 20 - .../demo/radiobutton/basic.html | 26 - .../demo/radiogroup/basic.html | 42 - .../demo/resizable/basic.html | 24 - .../demo/searchbox/basic.html | 25 - .../demo/searchbox/category.html | 30 - .../demo/searchbox/fluid.html | 29 - .../demo/sidemenu/basic.html | 58 - .../demo/sidemenu/sidemenu_style.css | 63 - .../demo/sidemenu/style.html | 70 - .../demo/slider/basic.html | 18 - .../demo/slider/fluid.html | 21 - .../demo/slider/formattip.html | 28 - .../demo/slider/nonlinear.html | 58 - .../demo/slider/range.html | 23 - .../demo/slider/rule.html | 21 - .../demo/slider/vertical.html | 25 - .../demo/splitbutton/actions.html | 64 - .../demo/splitbutton/basic.html | 61 - .../demo/switchbutton/action.html | 24 - .../demo/switchbutton/basic.html | 27 - .../demo/tabs/_content.html | 18 - .../demo/tabs/autoheight.html | 36 - .../demo/tabs/basic.html | 36 - .../demo/tabs/dropdown.html | 55 - .../demo/tabs/fixedwidth.html | 37 - .../demo/tabs/fluid.html | 24 - .../demo/tabs/hover.html | 46 - .../demo/tabs/images/modem.png | Bin 1633 -> 0 bytes .../demo/tabs/images/pda.png | Bin 1787 -> 0 bytes .../demo/tabs/images/scanner.png | Bin 2600 -> 0 bytes .../demo/tabs/images/tablet.png | Bin 2505 -> 0 bytes .../demo/tabs/nestedtabs.html | 54 - .../demo/tabs/striptools.html | 39 - .../demo/tabs/style.html | 51 - .../demo/tabs/tabimage.html | 41 - .../demo/tabs/tabposition.html | 45 - .../demo/tabs/tabstools.html | 41 - .../demo/tabs/tree_data1.json | 49 - .../demo/tagbox/autocomplete.html | 29 - .../demo/tagbox/basic.html | 20 - .../demo/tagbox/button.html | 25 - .../demo/tagbox/format.html | 24 - .../demo/tagbox/style.html | 35 - .../demo/tagbox/tagbox_data1.json | 21 - .../demo/tagbox/validate.html | 34 - .../demo/textbox/basic.html | 35 - .../demo/textbox/button.html | 25 - .../demo/textbox/clearicon.html | 68 - .../demo/textbox/custom.html | 34 - .../demo/textbox/fluid.html | 25 - .../demo/textbox/icons.html | 51 - .../demo/textbox/multiline.html | 25 - .../demo/textbox/size.html | 31 - .../demo/timepicker/basic.html | 25 - .../demo/timepicker/hour24.html | 26 - .../demo/timespinner/actions.html | 42 - .../demo/timespinner/basic.html | 25 - .../demo/timespinner/fluid.html | 25 - .../demo/timespinner/hour12.html | 25 - .../demo/timespinner/range.html | 24 - .../demo/tooltip/_content.html | 18 - .../demo/tooltip/_dialog.html | 23 - .../demo/tooltip/ajax.html | 32 - .../demo/tooltip/basic.html | 20 - .../demo/tooltip/customcontent.html | 32 - .../demo/tooltip/customstyle.html | 52 - .../demo/tooltip/position.html | 34 - .../demo/tooltip/toolbar.html | 40 - .../demo/tooltip/tooltipdialog.html | 44 - .../demo/tree/actions.html | 47 - .../demo/tree/animation.html | 20 - .../demo/tree/basic.html | 53 - .../demo/tree/checkbox.html | 37 - .../demo/tree/contextmenu.html | 65 - .../demo/tree/customcheckbox.html | 29 - .../demo/tree/dnd.html | 20 - .../demo/tree/editable.html | 27 - .../demo/tree/formatting.html | 32 - .../demo/tree/icons.html | 20 - .../demo/tree/lazyload.html | 82 - .../demo/tree/lines.html | 20 - .../demo/tree/tree_data1.json | 49 - .../demo/tree/tree_data2.json | 61 - .../demo/treegrid/actions.html | 64 - .../demo/treegrid/basic.html | 34 - .../demo/treegrid/checkbox.html | 35 - .../demo/treegrid/clientpagination.html | 189 - .../demo/treegrid/contextmenu.html | 106 - .../demo/treegrid/customcheckbox.html | 40 - .../demo/treegrid/editable.html | 93 - .../demo/treegrid/fluid.html | 33 - .../demo/treegrid/footer.html | 55 - .../demo/treegrid/lines.html | 35 - .../demo/treegrid/reports.html | 49 - .../demo/treegrid/treegrid_data1.json | 73 - .../demo/treegrid/treegrid_data2.json | 11 - .../demo/treegrid/treegrid_data3.json | 13 - .../demo/validatebox/basic.html | 45 - .../demo/validatebox/customtooltip.html | 56 - .../demo/validatebox/errorplacement.html | 62 - .../demo/validatebox/validateonblur.html | 45 - .../demo/window/basic.html | 23 - .../demo/window/borderstyle.html | 53 - .../demo/window/customtools.html | 30 - .../demo/window/fluid.html | 24 - .../demo/window/footer.html | 24 - .../demo/window/inlinewindow.html | 26 - .../demo/window/modalwindow.html | 24 - .../demo/window/windowlayout.html | 33 - .../easyloader.js | 194 - .../jquery.easyui.min.js | 18147 ---------------- .../jquery.easyui.mobile.js | 141 - .../jquery.min.js | 2 - .../license_freeware.txt | 14 - .../locale/easyui-lang-af.js | 44 - .../locale/easyui-lang-am.js | 46 - .../locale/easyui-lang-ar.js | 45 - .../locale/easyui-lang-bg.js | 44 - .../locale/easyui-lang-ca.js | 44 - .../locale/easyui-lang-cs.js | 44 - .../locale/easyui-lang-cz.js | 44 - .../locale/easyui-lang-da.js | 44 - .../locale/easyui-lang-de.js | 63 - .../locale/easyui-lang-el.js | 45 - .../locale/easyui-lang-en.js | 45 - .../locale/easyui-lang-es.js | 45 - .../locale/easyui-lang-fa.js | 45 - .../locale/easyui-lang-fr.js | 62 - .../locale/easyui-lang-it.js | 64 - .../locale/easyui-lang-jp.js | 45 - .../locale/easyui-lang-ko.js | 45 - .../locale/easyui-lang-nl.js | 44 - .../locale/easyui-lang-pl.js | 45 - .../locale/easyui-lang-pt_BR.js | 45 - .../locale/easyui-lang-ru.js | 46 - .../locale/easyui-lang-sv_SE.js | 45 - .../locale/easyui-lang-tr.js | 59 - .../locale/easyui-lang-ua.js | 46 - .../locale/easyui-lang-zh_CN.js | 66 - .../locale/easyui-lang-zh_TW.js | 48 - .../plugins/jquery.accordion.js | 350 - .../plugins/jquery.calendar.js | 403 - .../plugins/jquery.checkbox.js | 190 - .../plugins/jquery.checkgroup.js | 98 - .../plugins/jquery.combo.js | 414 - .../plugins/jquery.combobox.js | 612 - .../plugins/jquery.combogrid.js | 355 - .../plugins/jquery.combotree.js | 239 - .../plugins/jquery.combotreegrid.js | 328 - .../plugins/jquery.datagrid.js | 2667 --- .../plugins/jquery.datalist.js | 136 - .../plugins/jquery.datebox.js | 232 - .../plugins/jquery.datetimebox.js | 182 - .../plugins/jquery.datetimespinner.js | 61 - .../plugins/jquery.dialog.js | 136 - .../plugins/jquery.draggable.js | 306 - .../plugins/jquery.drawer.js | 90 - .../plugins/jquery.droppable.js | 62 - .../plugins/jquery.filebox.js | 100 - .../plugins/jquery.form.js | 429 - .../plugins/jquery.layout.js | 530 - .../plugins/jquery.linkbutton.js | 185 - .../plugins/jquery.maskedbox.js | 221 - .../plugins/jquery.menu.js | 519 - .../plugins/jquery.menubutton.js | 123 - .../plugins/jquery.messager.js | 218 - .../plugins/jquery.mobile.js | 141 - .../plugins/jquery.numberbox.js | 187 - .../plugins/jquery.numberspinner.js | 58 - .../plugins/jquery.pagination.js | 304 - .../plugins/jquery.panel.js | 694 - .../plugins/jquery.parser.js | 393 - .../plugins/jquery.passwordbox.js | 164 - .../plugins/jquery.progressbar.js | 84 - .../plugins/jquery.propertygrid.js | 427 - .../plugins/jquery.radiobutton.js | 204 - .../plugins/jquery.radiogroup.js | 83 - .../plugins/jquery.resizable.js | 173 - .../plugins/jquery.searchbox.js | 132 - .../plugins/jquery.sidemenu.js | 245 - .../plugins/jquery.slider.js | 355 - .../plugins/jquery.spinner.js | 128 - .../plugins/jquery.splitbutton.js | 49 - .../plugins/jquery.switchbutton.js | 234 - .../plugins/jquery.tabs.js | 716 - .../plugins/jquery.tagbox.js | 223 - .../plugins/jquery.textbox.js | 634 - .../plugins/jquery.timepicker.js | 289 - .../plugins/jquery.timespinner.js | 199 - .../plugins/jquery.tooltip.js | 238 - .../plugins/jquery.tree.js | 1265 -- .../plugins/jquery.treegrid.js | 1359 -- .../plugins/jquery.validatebox.js | 321 - .../plugins/jquery.window.js | 323 - .../前后端信息交互引用库/readme.txt | 4 - .../src/easyloader.js | 462 - .../src/jquery.accordion.js | 494 - .../src/jquery.calendar.js | 456 - .../src/jquery.combobox.js | 739 - .../src/jquery.datebox.js | 307 - .../src/jquery.draggable.js | 399 - .../src/jquery.droppable.js | 81 - .../src/jquery.form.js | 509 - .../src/jquery.linkbutton.js | 235 - .../src/jquery.menu.js | 694 - .../src/jquery.parser.js | 438 - .../src/jquery.progressbar.js | 107 - .../src/jquery.propertygrid.js | 526 - .../src/jquery.resizable.js | 228 - .../src/jquery.slider.js | 463 - .../src/jquery.tabs.js | 934 - .../src/jquery.window.js | 437 - .../themes/angular.css | 639 - .../themes/black/accordion.css | 89 - .../themes/black/calendar.css | 213 - .../themes/black/checkbox.css | 31 - .../themes/black/combo.css | 35 - .../themes/black/combobox.css | 40 - .../themes/black/datagrid.css | 305 - .../themes/black/datalist.css | 95 - .../themes/black/datebox.css | 36 - .../themes/black/dialog.css | 47 - .../themes/black/drawer.css | 15 - .../themes/black/easyui.css | 3706 ---- .../themes/black/filebox.css | 20 - .../themes/black/flex.css | 52 - .../themes/black/images/accordion_arrows.png | Bin 122 -> 0 bytes .../themes/black/images/blank.gif | Bin 43 -> 0 bytes .../themes/black/images/calendar_arrows.png | Bin 173 -> 0 bytes .../themes/black/images/combo_arrow.png | Bin 100 -> 0 bytes .../themes/black/images/datagrid_icons.png | Bin 300 -> 0 bytes .../themes/black/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/black/images/layout_arrows.png | Bin 179 -> 0 bytes .../themes/black/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../themes/black/images/loading.gif | Bin 1737 -> 0 bytes .../themes/black/images/menu_arrows.png | Bin 134 -> 0 bytes .../themes/black/images/messager_icons.png | Bin 2224 -> 0 bytes .../themes/black/images/messager_icons16.png | Bin 3871 -> 0 bytes .../themes/black/images/pagination_icons.png | Bin 339 -> 0 bytes .../themes/black/images/panel_tools.png | Bin 184 -> 0 bytes .../themes/black/images/passwordbox_close.png | Bin 149 -> 0 bytes .../themes/black/images/passwordbox_open.png | Bin 160 -> 0 bytes .../themes/black/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/black/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/black/images/spinner_arrows.png | Bin 140 -> 0 bytes .../themes/black/images/tabs_icons.png | Bin 144 -> 0 bytes .../themes/black/images/tagbox_icons.png | Bin 133 -> 0 bytes .../themes/black/images/tree_icons.png | Bin 3086 -> 0 bytes .../black/images/validatebox_warning.png | Bin 921 -> 0 bytes .../themes/black/layout.css | 150 - .../themes/black/linkbutton.css | 203 - .../themes/black/menu.css | 119 - .../themes/black/menubutton.css | 94 - .../themes/black/messager.css | 74 - .../themes/black/pagination.css | 77 - .../themes/black/panel.css | 276 - .../themes/black/passwordbox.css | 6 - .../themes/black/progressbar.css | 33 - .../themes/black/propertygrid.css | 27 - .../themes/black/radiobutton.css | 25 - .../themes/black/searchbox.css | 61 - .../themes/black/sidemenu.css | 78 - .../themes/black/slider.css | 101 - .../themes/black/spinner.css | 114 - .../themes/black/splitbutton.css | 12 - .../themes/black/switchbutton.css | 83 - .../themes/black/tabs.css | 415 - .../themes/black/tagbox.css | 44 - .../themes/black/textbox.css | 173 - .../themes/black/timepicker.css | 93 - .../themes/black/tooltip.css | 101 - .../themes/black/tree.css | 168 - .../themes/black/validatebox.css | 13 - .../themes/black/window.css | 188 - .../themes/bootstrap/accordion.css | 89 - .../themes/bootstrap/calendar.css | 213 - .../themes/bootstrap/checkbox.css | 31 - .../themes/bootstrap/combo.css | 35 - .../themes/bootstrap/combobox.css | 40 - .../themes/bootstrap/datagrid.css | 305 - .../themes/bootstrap/datalist.css | 95 - .../themes/bootstrap/datebox.css | 36 - .../themes/bootstrap/dialog.css | 47 - .../themes/bootstrap/drawer.css | 15 - .../themes/bootstrap/easyui.css | 3725 ---- .../themes/bootstrap/filebox.css | 20 - .../themes/bootstrap/flex.css | 52 - .../bootstrap/images/accordion_arrows.png | Bin 184 -> 0 bytes .../themes/bootstrap/images/blank.gif | Bin 43 -> 0 bytes .../bootstrap/images/calendar_arrows.png | Bin 173 -> 0 bytes .../themes/bootstrap/images/combo_arrow.png | Bin 117 -> 0 bytes .../bootstrap/images/datagrid_icons.png | Bin 307 -> 0 bytes .../themes/bootstrap/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/bootstrap/images/down_green.png | Bin 610 -> 0 bytes .../themes/bootstrap/images/layout_arrows.png | Bin 319 -> 0 bytes .../themes/bootstrap/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../themes/bootstrap/images/loading.gif | Bin 1737 -> 0 bytes .../themes/bootstrap/images/menu_arrows.png | Bin 160 -> 0 bytes .../bootstrap/images/messager_icons.png | Bin 2224 -> 0 bytes .../bootstrap/images/messager_icons16.png | Bin 3871 -> 0 bytes .../themes/bootstrap/images/middle.png | Bin 375 -> 0 bytes .../bootstrap/images/pagination_icons.png | Bin 628 -> 0 bytes .../themes/bootstrap/images/panel_tools.png | Bin 194 -> 0 bytes .../bootstrap/images/passwordbox_close.png | Bin 159 -> 0 bytes .../bootstrap/images/passwordbox_open.png | Bin 165 -> 0 bytes .../bootstrap/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/bootstrap/images/slider_handle.png | Bin 863 -> 0 bytes .../bootstrap/images/spinner_arrows.png | Bin 149 -> 0 bytes .../themes/bootstrap/images/tabs_icons.png | Bin 150 -> 0 bytes .../themes/bootstrap/images/tagbox_icons.png | Bin 134 -> 0 bytes .../themes/bootstrap/images/tree_icons.png | Bin 3115 -> 0 bytes .../themes/bootstrap/images/up_red.png | Bin 464 -> 0 bytes .../bootstrap/images/validatebox_warning.png | Bin 921 -> 0 bytes .../themes/bootstrap/layout.css | 150 - .../themes/bootstrap/linkbutton.css | 203 - .../themes/bootstrap/menu.css | 119 - .../themes/bootstrap/menubutton.css | 94 - .../themes/bootstrap/messager.css | 74 - .../themes/bootstrap/pagination.css | 77 - .../themes/bootstrap/panel.css | 276 - .../themes/bootstrap/passwordbox.css | 6 - .../themes/bootstrap/progressbar.css | 33 - .../themes/bootstrap/propertygrid.css | 27 - .../themes/bootstrap/radiobutton.css | 25 - .../themes/bootstrap/searchbox.css | 61 - .../themes/bootstrap/sidemenu.css | 78 - .../themes/bootstrap/slider.css | 101 - .../themes/bootstrap/spinner.css | 114 - .../themes/bootstrap/splitbutton.css | 12 - .../themes/bootstrap/switchbutton.css | 83 - .../themes/bootstrap/tabs.css | 415 - .../themes/bootstrap/tagbox.css | 44 - .../themes/bootstrap/textbox.css | 173 - .../themes/bootstrap/timepicker.css | 93 - .../themes/bootstrap/tooltip.css | 101 - .../themes/bootstrap/tree.css | 168 - .../themes/bootstrap/validatebox.css | 13 - .../themes/bootstrap/window.css | 188 - .../themes/color.css | 210 - .../themes/default/accordion.css | 89 - .../themes/default/calendar.css | 213 - .../themes/default/checkbox.css | 31 - .../themes/default/combo.css | 35 - .../themes/default/combobox.css | 40 - .../themes/default/datagrid.css | 305 - .../themes/default/datalist.css | 95 - .../themes/default/datebox.css | 36 - .../themes/default/dialog.css | 47 - .../themes/default/drawer.css | 15 - .../themes/default/easyui.css | 3706 ---- .../themes/default/filebox.css | 20 - .../themes/default/flex.css | 52 - .../default/images/accordion_arrows.png | Bin 184 -> 0 bytes .../themes/default/images/blank.gif | Bin 43 -> 0 bytes .../themes/default/images/calendar_arrows.png | Bin 173 -> 0 bytes .../themes/default/images/combo_arrow.png | Bin 117 -> 0 bytes .../themes/default/images/datagrid_icons.png | Bin 307 -> 0 bytes .../themes/default/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/default/images/layout_arrows.png | Bin 319 -> 0 bytes .../themes/default/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../themes/default/images/loading.gif | Bin 1737 -> 0 bytes .../themes/default/images/menu_arrows.png | Bin 160 -> 0 bytes .../themes/default/images/messager_icons.png | Bin 2224 -> 0 bytes .../default/images/messager_icons16.png | Bin 3871 -> 0 bytes .../default/images/pagination_icons.png | Bin 628 -> 0 bytes .../themes/default/images/panel_tools.png | Bin 852 -> 0 bytes .../default/images/passwordbox_close.png | Bin 159 -> 0 bytes .../default/images/passwordbox_open.png | Bin 165 -> 0 bytes .../default/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/default/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/default/images/spinner_arrows.png | Bin 149 -> 0 bytes .../themes/default/images/tabs_icons.png | Bin 150 -> 0 bytes .../themes/default/images/tagbox_icons.png | Bin 134 -> 0 bytes .../themes/default/images/tree_icons.png | Bin 3115 -> 0 bytes .../default/images/validatebox_warning.png | Bin 921 -> 0 bytes .../themes/default/layout.css | 150 - .../themes/default/linkbutton.css | 203 - .../themes/default/menu.css | 119 - .../themes/default/menubutton.css | 94 - .../themes/default/messager.css | 74 - .../themes/default/pagination.css | 77 - .../themes/default/panel.css | 276 - .../themes/default/passwordbox.css | 6 - .../themes/default/progressbar.css | 33 - .../themes/default/propertygrid.css | 27 - .../themes/default/radiobutton.css | 25 - .../themes/default/searchbox.css | 61 - .../themes/default/sidemenu.css | 78 - .../themes/default/slider.css | 101 - .../themes/default/spinner.css | 114 - .../themes/default/splitbutton.css | 12 - .../themes/default/switchbutton.css | 83 - .../themes/default/tabs.css | 415 - .../themes/default/tagbox.css | 44 - .../themes/default/textbox.css | 173 - .../themes/default/timepicker.css | 93 - .../themes/default/tooltip.css | 101 - .../themes/default/tree.css | 168 - .../themes/default/validatebox.css | 13 - .../themes/default/window.css | 188 - .../themes/gray/accordion.css | 89 - .../themes/gray/calendar.css | 213 - .../themes/gray/checkbox.css | 31 - .../themes/gray/combo.css | 35 - .../themes/gray/combobox.css | 40 - .../themes/gray/datagrid.css | 305 - .../themes/gray/datalist.css | 95 - .../themes/gray/datebox.css | 36 - .../themes/gray/dialog.css | 47 - .../themes/gray/drawer.css | 15 - .../themes/gray/easyui.css | 3706 ---- .../themes/gray/filebox.css | 20 - .../themes/gray/flex.css | 52 - .../themes/gray/images/accordion_arrows.png | Bin 125 -> 0 bytes .../themes/gray/images/blank.gif | Bin 43 -> 0 bytes .../themes/gray/images/calendar_arrows.png | Bin 173 -> 0 bytes .../themes/gray/images/combo_arrow.png | Bin 103 -> 0 bytes .../themes/gray/images/datagrid_icons.png | Bin 330 -> 0 bytes .../themes/gray/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/gray/images/layout_arrows.png | Bin 181 -> 0 bytes .../themes/gray/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../themes/gray/images/loading.gif | Bin 1737 -> 0 bytes .../themes/gray/images/menu_arrows.png | Bin 160 -> 0 bytes .../themes/gray/images/messager_icons.png | Bin 2224 -> 0 bytes .../themes/gray/images/messager_icons16.png | Bin 3871 -> 0 bytes .../themes/gray/images/pagination_icons.png | Bin 466 -> 0 bytes .../themes/gray/images/panel_tools.png | Bin 191 -> 0 bytes .../themes/gray/images/passwordbox_close.png | Bin 149 -> 0 bytes .../themes/gray/images/passwordbox_open.png | Bin 160 -> 0 bytes .../themes/gray/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/gray/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/gray/images/spinner_arrows.png | Bin 149 -> 0 bytes .../themes/gray/images/tabs_icons.png | Bin 144 -> 0 bytes .../themes/gray/images/tagbox_icons.png | Bin 133 -> 0 bytes .../themes/gray/images/tree_icons.png | Bin 3115 -> 0 bytes .../gray/images/validatebox_warning.png | Bin 921 -> 0 bytes .../themes/gray/layout.css | 150 - .../themes/gray/linkbutton.css | 203 - .../themes/gray/menu.css | 119 - .../themes/gray/menubutton.css | 94 - .../themes/gray/messager.css | 74 - .../themes/gray/pagination.css | 77 - .../themes/gray/panel.css | 276 - .../themes/gray/passwordbox.css | 6 - .../themes/gray/progressbar.css | 33 - .../themes/gray/propertygrid.css | 27 - .../themes/gray/radiobutton.css | 25 - .../themes/gray/searchbox.css | 61 - .../themes/gray/sidemenu.css | 78 - .../themes/gray/slider.css | 101 - .../themes/gray/spinner.css | 114 - .../themes/gray/splitbutton.css | 12 - .../themes/gray/switchbutton.css | 83 - .../themes/gray/tabs.css | 415 - .../themes/gray/tagbox.css | 44 - .../themes/gray/textbox.css | 173 - .../themes/gray/timepicker.css | 93 - .../themes/gray/tooltip.css | 101 - .../themes/gray/tree.css | 168 - .../themes/gray/validatebox.css | 13 - .../themes/gray/window.css | 188 - .../themes/icon.css | 96 - .../themes/icons/back.png | Bin 912 -> 0 bytes .../themes/icons/blank.gif | Bin 43 -> 0 bytes .../themes/icons/cancel.png | Bin 1133 -> 0 bytes .../themes/icons/clear.png | Bin 779 -> 0 bytes .../themes/icons/cut.png | Bin 1024 -> 0 bytes .../themes/icons/down_green.png | Bin 610 -> 0 bytes .../themes/icons/edit_add.png | Bin 1088 -> 0 bytes .../themes/icons/edit_remove.png | Bin 625 -> 0 bytes .../themes/icons/filesave.png | Bin 898 -> 0 bytes .../themes/icons/filter.png | Bin 305 -> 0 bytes .../themes/icons/help.png | Bin 1187 -> 0 bytes .../themes/icons/large_chart.png | Bin 1669 -> 0 bytes .../themes/icons/large_clipart.png | Bin 1727 -> 0 bytes .../themes/icons/large_picture.png | Bin 1667 -> 0 bytes .../themes/icons/large_shapes.png | Bin 1318 -> 0 bytes .../themes/icons/large_smartart.png | Bin 1336 -> 0 bytes .../themes/icons/lock.png | Bin 311 -> 0 bytes .../themes/icons/man.png | Bin 375 -> 0 bytes .../themes/icons/man0.png | Bin 244 -> 0 bytes .../themes/icons/mini_add.png | Bin 244 -> 0 bytes .../themes/icons/mini_edit.png | Bin 161 -> 0 bytes .../themes/icons/mini_refresh.png | Bin 160 -> 0 bytes .../themes/icons/more.png | Bin 110 -> 0 bytes .../themes/icons/no.png | Bin 922 -> 0 bytes .../themes/icons/ok.png | Bin 883 -> 0 bytes .../themes/icons/pencil.png | Bin 713 -> 0 bytes .../themes/icons/print.png | Bin 1057 -> 0 bytes .../themes/icons/redo.png | Bin 708 -> 0 bytes .../themes/icons/reload.png | Bin 1045 -> 0 bytes .../themes/icons/search.png | Bin 813 -> 0 bytes .../themes/icons/sum.png | Bin 289 -> 0 bytes .../themes/icons/tip.png | Bin 743 -> 0 bytes .../themes/icons/undo.png | Bin 707 -> 0 bytes .../themes/icons/up_red.png | Bin 464 -> 0 bytes .../themes/material-blue/accordion.css | 89 - .../themes/material-blue/calendar.css | 213 - .../themes/material-blue/checkbox.css | 31 - .../themes/material-blue/combo.css | 35 - .../themes/material-blue/combobox.css | 40 - .../themes/material-blue/datagrid.css | 299 - .../themes/material-blue/datalist.css | 95 - .../themes/material-blue/datebox.css | 36 - .../themes/material-blue/dialog.css | 47 - .../themes/material-blue/drawer.css | 15 - .../themes/material-blue/easyui.css | 3973 ---- .../themes/material-blue/filebox.css | 20 - .../themes/material-blue/flex.css | 52 - .../material-blue/images/accordion_arrows.png | Bin 121 -> 0 bytes .../themes/material-blue/images/blank.gif | Bin 43 -> 0 bytes .../material-blue/images/calendar_arrows.png | Bin 139 -> 0 bytes .../material-blue/images/combo_arrow.png | Bin 103 -> 0 bytes .../material-blue/images/datagrid_icons.png | Bin 330 -> 0 bytes .../material-blue/images/datebox_arrow.png | Bin 327 -> 0 bytes .../material-blue/images/layout_arrows.png | Bin 170 -> 0 bytes .../material-blue/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../themes/material-blue/images/loading.gif | Bin 1737 -> 0 bytes .../material-blue/images/menu_arrows.png | Bin 160 -> 0 bytes .../material-blue/images/menu_arrows1.png | Bin 140 -> 0 bytes .../material-blue/images/menu_arrows2.png | Bin 134 -> 0 bytes .../material-blue/images/messager_icons.png | Bin 2224 -> 0 bytes .../material-blue/images/messager_icons16.png | Bin 3871 -> 0 bytes .../material-blue/images/pagination_icons.png | Bin 453 -> 0 bytes .../material-blue/images/panel_tools.png | Bin 191 -> 0 bytes .../images/passwordbox_close.png | Bin 149 -> 0 bytes .../material-blue/images/passwordbox_open.png | Bin 160 -> 0 bytes .../material-blue/images/searchbox_button.png | Bin 545 -> 0 bytes .../material-blue/images/slider_handle.png | Bin 863 -> 0 bytes .../material-blue/images/spinner_arrows.png | Bin 149 -> 0 bytes .../material-blue/images/tabs_icons.png | Bin 143 -> 0 bytes .../material-blue/images/tagbox_icons.png | Bin 133 -> 0 bytes .../material-blue/images/tree_icons.png | Bin 2728 -> 0 bytes .../images/validatebox_warning.png | Bin 921 -> 0 bytes .../themes/material-blue/layout.css | 150 - .../themes/material-blue/linkbutton.css | 191 - .../themes/material-blue/menu.css | 119 - .../themes/material-blue/menubutton.css | 94 - .../themes/material-blue/messager.css | 74 - .../themes/material-blue/pagination.css | 77 - .../themes/material-blue/panel.css | 270 - .../themes/material-blue/passwordbox.css | 6 - .../themes/material-blue/progressbar.css | 33 - .../themes/material-blue/propertygrid.css | 27 - .../themes/material-blue/radiobutton.css | 25 - .../themes/material-blue/searchbox.css | 61 - .../themes/material-blue/sidemenu.css | 78 - .../themes/material-blue/slider.css | 101 - .../themes/material-blue/spinner.css | 114 - .../themes/material-blue/splitbutton.css | 12 - .../themes/material-blue/switchbutton.css | 83 - .../themes/material-blue/tabs.css | 379 - .../themes/material-blue/tagbox.css | 44 - .../themes/material-blue/textbox.css | 173 - .../themes/material-blue/timepicker.css | 93 - .../themes/material-blue/tooltip.css | 101 - .../themes/material-blue/tree.css | 168 - .../themes/material-blue/validatebox.css | 13 - .../themes/material-blue/window.css | 182 - .../themes/material-teal/accordion.css | 89 - .../themes/material-teal/calendar.css | 213 - .../themes/material-teal/checkbox.css | 31 - .../themes/material-teal/combo.css | 35 - .../themes/material-teal/combobox.css | 40 - .../themes/material-teal/datagrid.css | 299 - .../themes/material-teal/datalist.css | 95 - .../themes/material-teal/datebox.css | 36 - .../themes/material-teal/dialog.css | 47 - .../themes/material-teal/drawer.css | 15 - .../themes/material-teal/easyui.css | 3857 ---- .../themes/material-teal/filebox.css | 20 - .../themes/material-teal/flex.css | 52 - .../themes/material-teal/images/Thumbs.db | Bin 35328 -> 0 bytes .../material-teal/images/accordion_arrows.png | Bin 121 -> 0 bytes .../themes/material-teal/images/blank.gif | Bin 43 -> 0 bytes .../material-teal/images/calendar_arrows.png | Bin 173 -> 0 bytes .../material-teal/images/combo_arrow.png | Bin 103 -> 0 bytes .../material-teal/images/datagrid_icons.png | Bin 330 -> 0 bytes .../material-teal/images/datebox_arrow.png | Bin 626 -> 0 bytes .../material-teal/images/layout_arrows.png | Bin 170 -> 0 bytes .../material-teal/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../themes/material-teal/images/loading.gif | Bin 1737 -> 0 bytes .../material-teal/images/menu_arrows.png | Bin 160 -> 0 bytes .../material-teal/images/messager_icons.png | Bin 2224 -> 0 bytes .../material-teal/images/messager_icons16.png | Bin 3871 -> 0 bytes .../material-teal/images/pagination_icons.png | Bin 466 -> 0 bytes .../material-teal/images/panel_tools.png | Bin 191 -> 0 bytes .../images/passwordbox_close.png | Bin 149 -> 0 bytes .../material-teal/images/passwordbox_open.png | Bin 160 -> 0 bytes .../material-teal/images/searchbox_button.png | Bin 813 -> 0 bytes .../material-teal/images/slider_handle.png | Bin 863 -> 0 bytes .../material-teal/images/spinner_arrows.png | Bin 149 -> 0 bytes .../material-teal/images/tabs_icons.png | Bin 143 -> 0 bytes .../material-teal/images/tagbox_icons.png | Bin 133 -> 0 bytes .../material-teal/images/tree_icons.png | Bin 3115 -> 0 bytes .../images/validatebox_warning.png | Bin 921 -> 0 bytes .../themes/material-teal/layout.css | 150 - .../themes/material-teal/linkbutton.css | 191 - .../themes/material-teal/menu.css | 119 - .../themes/material-teal/menubutton.css | 94 - .../themes/material-teal/messager.css | 74 - .../themes/material-teal/pagination.css | 77 - .../themes/material-teal/panel.css | 270 - .../themes/material-teal/passwordbox.css | 6 - .../themes/material-teal/progressbar.css | 33 - .../themes/material-teal/propertygrid.css | 27 - .../themes/material-teal/radiobutton.css | 25 - .../themes/material-teal/searchbox.css | 61 - .../themes/material-teal/sidemenu.css | 78 - .../themes/material-teal/slider.css | 101 - .../themes/material-teal/spinner.css | 114 - .../themes/material-teal/splitbutton.css | 12 - .../themes/material-teal/switchbutton.css | 83 - .../themes/material-teal/tabs.css | 379 - .../themes/material-teal/tagbox.css | 44 - .../themes/material-teal/textbox.css | 173 - .../themes/material-teal/timepicker.css | 93 - .../themes/material-teal/tooltip.css | 101 - .../themes/material-teal/tree.css | 168 - .../themes/material-teal/validatebox.css | 13 - .../themes/material-teal/window.css | 182 - .../themes/material/accordion.css | 89 - .../themes/material/calendar.css | 213 - .../themes/material/checkbox.css | 31 - .../themes/material/combo.css | 35 - .../themes/material/combobox.css | 40 - .../themes/material/datagrid.css | 299 - .../themes/material/datalist.css | 95 - .../themes/material/datebox.css | 36 - .../themes/material/dialog.css | 47 - .../themes/material/drawer.css | 15 - .../themes/material/easyui.css | 3715 ---- .../themes/material/filebox.css | 20 - .../themes/material/flex.css | 52 - .../themes/material/images/Thumbs.db | Bin 35328 -> 0 bytes .../material/images/accordion_arrows.png | Bin 121 -> 0 bytes .../themes/material/images/blank.gif | Bin 43 -> 0 bytes .../material/images/calendar_arrows.png | Bin 173 -> 0 bytes .../themes/material/images/combo_arrow.png | Bin 103 -> 0 bytes .../themes/material/images/datagrid_icons.png | Bin 330 -> 0 bytes .../themes/material/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/material/images/layout_arrows.png | Bin 170 -> 0 bytes .../themes/material/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../themes/material/images/loading.gif | Bin 1737 -> 0 bytes .../themes/material/images/menu_arrows.png | Bin 160 -> 0 bytes .../themes/material/images/messager_icons.png | Bin 2224 -> 0 bytes .../material/images/messager_icons16.png | Bin 3871 -> 0 bytes .../material/images/pagination_icons.png | Bin 466 -> 0 bytes .../themes/material/images/panel_tools.png | Bin 191 -> 0 bytes .../material/images/passwordbox_close.png | Bin 149 -> 0 bytes .../material/images/passwordbox_open.png | Bin 160 -> 0 bytes .../material/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/material/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/material/images/spinner_arrows.png | Bin 149 -> 0 bytes .../themes/material/images/tabs_icons.png | Bin 143 -> 0 bytes .../themes/material/images/tagbox_icons.png | Bin 133 -> 0 bytes .../themes/material/images/tree_icons.png | Bin 3115 -> 0 bytes .../material/images/validatebox_warning.png | Bin 921 -> 0 bytes .../themes/material/layout.css | 150 - .../themes/material/linkbutton.css | 191 - .../themes/material/menu.css | 119 - .../themes/material/menubutton.css | 94 - .../themes/material/messager.css | 74 - .../themes/material/pagination.css | 77 - .../themes/material/panel.css | 270 - .../themes/material/passwordbox.css | 6 - .../themes/material/progressbar.css | 33 - .../themes/material/propertygrid.css | 27 - .../themes/material/radiobutton.css | 25 - .../themes/material/searchbox.css | 61 - .../themes/material/sidemenu.css | 78 - .../themes/material/slider.css | 101 - .../themes/material/spinner.css | 114 - .../themes/material/splitbutton.css | 12 - .../themes/material/switchbutton.css | 83 - .../themes/material/tabs.css | 379 - .../themes/material/tagbox.css | 44 - .../themes/material/textbox.css | 173 - .../themes/material/timepicker.css | 93 - .../themes/material/tooltip.css | 101 - .../themes/material/tree.css | 168 - .../themes/material/validatebox.css | 13 - .../themes/material/window.css | 182 - .../themes/metro/accordion.css | 89 - .../themes/metro/calendar.css | 213 - .../themes/metro/checkbox.css | 31 - .../themes/metro/combo.css | 35 - .../themes/metro/combobox.css | 40 - .../themes/metro/datagrid.css | 299 - .../themes/metro/datalist.css | 95 - .../themes/metro/datebox.css | 36 - .../themes/metro/dialog.css | 47 - .../themes/metro/drawer.css | 15 - .../themes/metro/easyui.css | 3652 ---- .../themes/metro/filebox.css | 20 - .../themes/metro/flex.css | 52 - .../themes/metro/images/accordion_arrows.png | Bin 184 -> 0 bytes .../themes/metro/images/blank.gif | Bin 43 -> 0 bytes .../themes/metro/images/calendar_arrows.png | Bin 173 -> 0 bytes .../themes/metro/images/combo_arrow.png | Bin 117 -> 0 bytes .../themes/metro/images/datagrid_icons.png | Bin 307 -> 0 bytes .../themes/metro/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/metro/images/layout_arrows.png | Bin 319 -> 0 bytes .../themes/metro/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../themes/metro/images/loading.gif | Bin 1737 -> 0 bytes .../themes/metro/images/menu_arrows.png | Bin 160 -> 0 bytes .../themes/metro/images/messager_icons.png | Bin 2224 -> 0 bytes .../themes/metro/images/messager_icons16.png | Bin 3871 -> 0 bytes .../themes/metro/images/pagination_icons.png | Bin 628 -> 0 bytes .../themes/metro/images/panel_tools.png | Bin 194 -> 0 bytes .../themes/metro/images/passwordbox_close.png | Bin 159 -> 0 bytes .../themes/metro/images/passwordbox_open.png | Bin 165 -> 0 bytes .../themes/metro/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/metro/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/metro/images/spinner_arrows.png | Bin 149 -> 0 bytes .../themes/metro/images/tabs_icons.png | Bin 150 -> 0 bytes .../themes/metro/images/tagbox_icons.png | Bin 134 -> 0 bytes .../themes/metro/images/tree_icons.png | Bin 3115 -> 0 bytes .../metro/images/validatebox_warning.png | Bin 921 -> 0 bytes .../themes/metro/layout.css | 150 - .../themes/metro/linkbutton.css | 203 - .../themes/metro/menu.css | 119 - .../themes/metro/menubutton.css | 94 - .../themes/metro/messager.css | 74 - .../themes/metro/pagination.css | 77 - .../themes/metro/panel.css | 270 - .../themes/metro/passwordbox.css | 6 - .../themes/metro/progressbar.css | 33 - .../themes/metro/propertygrid.css | 27 - .../themes/metro/radiobutton.css | 25 - .../themes/metro/searchbox.css | 61 - .../themes/metro/sidemenu.css | 78 - .../themes/metro/slider.css | 101 - .../themes/metro/spinner.css | 114 - .../themes/metro/splitbutton.css | 12 - .../themes/metro/switchbutton.css | 83 - .../themes/metro/tabs.css | 379 - .../themes/metro/tagbox.css | 44 - .../themes/metro/textbox.css | 173 - .../themes/metro/timepicker.css | 93 - .../themes/metro/tooltip.css | 101 - .../themes/metro/tree.css | 168 - .../themes/metro/validatebox.css | 13 - .../themes/metro/window.css | 182 - .../themes/mobile.css | 355 - .../themes/react.css | 704 - .../themes/vue.css | 758 - 1392 files changed, 69948 insertions(+), 129229 deletions(-) delete mode 100644 src/UWE_projectCode/RTL分析代码/cv32e40p_controller.sv delete mode 100644 src/UWE_projectCode/RTL分析代码/cv32e40p_cs_registers.sv delete mode 100644 src/UWE_projectCode/RTL分析代码/cv32e40p_decoder.sv create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/algo.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/algobase.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/algorithm create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/alloc.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/bitset create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/bvector.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/char_traits.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/concept_checks.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/container_concepts.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/defalloc.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/deque create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/deque.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/function.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/functional create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_map create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_map.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_set create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_set.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/hashtable.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/heap.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/iterator create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/iterator.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/limits create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/list create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/list.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/map create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/map.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/memory create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/multimap.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/multiset.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/numeric create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/pair.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/pthread_alloc create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/pthread_alloc.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/queue create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/rope create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/rope.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/ropeimpl.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/sequence_concepts.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/set create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/set.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/slist create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/slist.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stack create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stack.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stdexcept create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_algo.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_algobase.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_alloc.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_bvector.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_config.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_construct.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_ctraits_fns.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_deque.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_exception.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_function.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_fun.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_map.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_set.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hashtable.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_heap.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_iterator.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_iterator_base.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_list.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_map.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_multimap.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_multiset.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_numeric.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_pair.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_queue.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_range_errors.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_raw_storage_iter.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_relops.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_rope.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_set.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_slist.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_stack.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_string_fwd.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_tempbuf.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_threads.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_tree.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_uninitialized.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_vector.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/string create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/tempbuf.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/tree.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/type_traits.h create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/utility create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/valarray create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/vector create mode 100644 src/UWE_projectCode/SGI STL源码/SGI STL源码/vector.h create mode 100644 src/UWE_projectCode/Tcls/Tcls/.formality.tcl.swp create mode 100644 src/UWE_projectCode/Tcls/Tcls/formality.tcl create mode 100644 src/UWE_projectCode/Tcls/Tcls/lib_to_db.tcl create mode 100644 src/UWE_projectCode/Tcls/Tcls/pt.tcl create mode 100644 src/UWE_projectCode/Tcls/Tcls/syn_main.tcl delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/UWE_file.pro delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/UWE_file.pro.user delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/finddialog.cpp delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/finddialog.h delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/main.cpp delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/mainwindow.cpp delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/mainwindow.h delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/mainwindow.ui delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/widget.cpp delete mode 100644 src/UWE_projectCode/finddialog查找搜索代码/widget.h create mode 100644 src/UWE_projectCode/tmp/tmp/.Makefile.swl create mode 100644 src/UWE_projectCode/tmp/tmp/.Makefile.swm create mode 100644 src/UWE_projectCode/tmp/tmp/.Makefile.swn create mode 100644 src/UWE_projectCode/tmp/tmp/.Makefile.swo create mode 100644 src/UWE_projectCode/tmp/tmp/.Makefile.swp create mode 100644 src/UWE_projectCode/tmp/tmp/.dc.log.swo create mode 100644 src/UWE_projectCode/tmp/tmp/.setModuleName.tcl.swp create mode 100644 src/UWE_projectCode/tmp/tmp/Makefile create mode 100644 src/UWE_projectCode/tmp/tmp/Makefile (copy) create mode 100644 src/UWE_projectCode/tmp/tmp/Makefile~ create mode 100644 src/UWE_projectCode/tmp/tmp/ProjectPathSetting.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/R0_check.result create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/SVNSubmit.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/auto_eco.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/calc_dff_count.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/cds_gen create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check_R0.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check_SRC_ID.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check_Skeyword create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check_code.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check_code_auto.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check_file_occupy create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check_files.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check_han create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/check_timescale create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/clock_cross.pl create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/copy_sdc.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/create_dummy.py create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_setup.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_setup_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_struct.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_struct_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_verify.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_verify_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/lint_functional_rtl.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/lint_functional_rtl_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_abstract.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_abstract_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_check.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_check_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_struct.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_struct_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/clock_reset_integrity.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/clock_reset_integrity_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/connectivity_verify/connectivity_verification.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_abstract.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_abstract_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit-setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_abstract.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_abstract_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice-01.jpg create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_bist_ready.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_best_practice.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_best_practice_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_random_resistance.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-08.jpg create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-09.jpg create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-10.jpg create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-11.jpg create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-12.jpg create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-13.jpg create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/design_audit.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/design_audit_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_abstract.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_abstract_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_functional_rtl.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl_custom.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_turbo_rtl.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_turbo_rtl_custom.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/mbist_dft/mbist_dft.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/order create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/lint_physical.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/doc/power_est_average.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/physical_power_postfloorplan.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/physical_power_postfloorplan_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/power_est_average.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/power_est_average_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_1_introduction.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_2_select_techlib.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_3_select_sdc.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_4_select_fp1.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_5_setup_powerest.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/regression_run.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_calibration.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_calibration_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling_est.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling_save.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_profiling.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_profiling_save.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_factor_conditions.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_factor_values.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_gen_pesd.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_guidance.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-mixed.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-verilog.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-vhdl.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_model.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_profiler.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_virtualizer.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/red_opt.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_abstract.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_abstract_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_audit.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_audit_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rdc/rdc_verify_struct.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rdc/rdc_verify_struct_setup.sgs create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/regression_run.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rtl2netlist/rtl2netlist_migration.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rtl2netlist/rtl2netlist_migration_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/.submethodology_help create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_mcp_verification.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_mcp_verification_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_verification.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_verification_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/mcp_verification.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/mcp_verification_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_glitch.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_rtl_gen.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_run_audit.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_run_audit_debug_help.htm create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_sdc_migration.spq create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/del_tmp_files.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/error_find.perl create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/ezeco_setup.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/ezlec.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/filelist_gen.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/get_CURRENT_DESIGN.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/get_DBs_info.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/get_PROJECT_PATH.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/quick_start create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/report_dc_summary.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/runAll.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/setPP.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/tab_change create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/temp_files_cleaner.sh rename src/UWE_projectCode/{前后端信息交互引用库/themes/black/numberbox.css => tmp/tmp/Scripts/tmp.log} (100%) create mode 100644 src/UWE_projectCode/tmp/tmp/Scripts/warning_find.perl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/#syn_main.tcl# create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swm create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swn create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swo create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swp create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/M6672_syn.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/cdc_goal.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/common_options.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/compile.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/copyLib.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/custom_options.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/formality.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/genus_flow.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/lib_to_db.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/lint_goal.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/power_goal.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/pt.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/rdc_goal.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/sdc_goal.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/spyglass_lint_rules.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/syn_main.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/synth_options.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Tcls/txv_goal.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Template/command.log create mode 100644 src/UWE_projectCode/tmp/tmp/Template/dc.work/dont_touch_filelist.v create mode 100644 src/UWE_projectCode/tmp/tmp/Template/dc.work/specific_filelist.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Template/dc.work/syn_specific.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Template/dc.work/syn_specific_after.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/Template/filenames.log create mode 100644 src/UWE_projectCode/tmp/tmp/Template/nc.work/sim_specific.sh create mode 100644 src/UWE_projectCode/tmp/tmp/Template/spyglass.work/constraints/cdc.sgdc rename src/UWE_projectCode/{前后端信息交互引用库/themes/bootstrap/numberbox.css => tmp/tmp/Template/spyglass.work/constraints/lint.sgdc} (100%) create mode 100644 src/UWE_projectCode/tmp/tmp/Template/spyglass.work/constraints/power.sgdc create mode 100644 src/UWE_projectCode/tmp/tmp/Template/spyglass.work/constraints/rdc.sgdc rename src/UWE_projectCode/{前后端信息交互引用库/themes/default/numberbox.css => tmp/tmp/Template/spyglass.work/constraints/sdc.sgdc} (100%) rename src/UWE_projectCode/{前后端信息交互引用库/themes/gray/numberbox.css => tmp/tmp/Template/spyglass.work/constraints/txv.sgdc} (100%) create mode 100644 src/UWE_projectCode/tmp/tmp/Template/spyglass.work/demo.prj rename src/UWE_projectCode/{前后端信息交互引用库/themes/material-blue/numberbox.css => tmp/tmp/Template/spyglass.work/waiver/demo.awl} (100%) rename src/UWE_projectCode/{前后端信息交互引用库/themes/material-teal/numberbox.css => tmp/tmp/Template/spyglass.work/waiver/lint.awl} (100%) rename src/UWE_projectCode/{前后端信息交互引用库/themes/material/numberbox.css => tmp/tmp/Template/vcs.work} (100%) create mode 100644 src/UWE_projectCode/tmp/tmp/command.log create mode 100644 src/UWE_projectCode/tmp/tmp/dc.log create mode 100644 src/UWE_projectCode/tmp/tmp/dc.work/Logs/dc_2022_1004_0820.log create mode 100644 src/UWE_projectCode/tmp/tmp/dc.work/Logs/pt_2023_0324_2136.log create mode 100644 src/UWE_projectCode/tmp/tmp/dc.work/cv32e40p_core_2022_1004_0820/report/cv32e40p_core.svf create mode 100644 src/UWE_projectCode/tmp/tmp/dc.work/dont_touch_filelist.v create mode 100644 src/UWE_projectCode/tmp/tmp/dc.work/filelist.v create mode 100644 src/UWE_projectCode/tmp/tmp/dc.work/specific_filelist.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/dc.work/syn_specific.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/dc.work/syn_specific_after.tcl create mode 100644 src/UWE_projectCode/tmp/tmp/filenames.log create mode 100644 src/UWE_projectCode/tmp/tmp/nc.work/sim_filelist.f create mode 100644 src/UWE_projectCode/tmp/tmp/nc.work/sim_specific.sh create mode 100644 src/UWE_projectCode/tmp/tmp/pt.log create mode 100644 src/UWE_projectCode/tmp/tmp/pt_2023_0324_2131.log create mode 100644 src/UWE_projectCode/tmp/tmp/pt_shell_command.log create mode 100644 src/UWE_projectCode/tmp/tmp/spyglass.work/constraints/cdc.sgdc rename src/UWE_projectCode/{前后端信息交互引用库/themes/metro/numberbox.css => tmp/tmp/spyglass.work/constraints/lint.sgdc} (100%) create mode 100644 src/UWE_projectCode/tmp/tmp/spyglass.work/constraints/power.sgdc create mode 100644 src/UWE_projectCode/tmp/tmp/spyglass.work/constraints/rdc.sgdc create mode 100644 src/UWE_projectCode/tmp/tmp/spyglass.work/constraints/sdc.sgdc create mode 100644 src/UWE_projectCode/tmp/tmp/spyglass.work/constraints/txv.sgdc create mode 100644 src/UWE_projectCode/tmp/tmp/spyglass.work/cv32e40p_core.prj create mode 100644 src/UWE_projectCode/tmp/tmp/spyglass.work/waiver/cv32e40p_core.awl create mode 100644 src/UWE_projectCode/tmp/tmp/spyglass.work/waiver/lint.awl create mode 100644 src/UWE_projectCode/tmp/tmp/tmp.log create mode 100644 src/UWE_projectCode/tmp/tmp/vcs.work delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/changelog.txt delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/accordion/_content.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/accordion/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/accordion/header.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/animation/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/animation/fade.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/animation/pop.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/animation/slide.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/badge/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/badge/button.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/badge/list.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/badge/tabs.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/button/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/button/group.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/button/style.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/button/switch.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/datagrid/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/datagrid/rowediting.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/datalist/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/datalist/group.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/datalist/selection.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/dialog/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/dialog/message.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/form/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/login1.jpg delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/modem.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/more.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/pda.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/scanner.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/tablet.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/input/numberspinner.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/input/textbox.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/layout/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/menu/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/menu/menubar.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/_content.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/ajax.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/nav.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/button.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/group.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/image.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/link.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/nav.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/pill.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/button.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/menu.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tree/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tree/dnd.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/_content.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/actions.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/ajax.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/datagrid_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/expandable.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/horizontal.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/multiple.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/accordion/tools.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/calendar/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/calendar/custom.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/calendar/disabledate.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/calendar/firstday.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/calendar/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/calendar/weeknumber.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/checkbox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/checkgroup/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combo/animation.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combo/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/actions.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/combobox_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/combobox_data2.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/customformat.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/dynamicdata.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/group.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/icons.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/itemicon.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/multiline.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/multiple.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/navigation.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/remotedata.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combobox/remotejsonp.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/actions.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/datagrid_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/initvalue.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/multiple.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/navigation.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/setvalue.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotree/actions.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotree/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotree/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotree/initvalue.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotree/multiple.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotree/test.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotree/tree_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/multiple.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/treegrid_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/aligncolumns.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cacheeditor.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cellediting.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cellstyle.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/checkbox.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/clientpagination.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/columngroup.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/complextoolbar.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/contextmenu.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/custompager.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/datagrid_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/datagrid_data2.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/footer.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/formatcolumns.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/frozencolumns.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/frozenrows.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/mergecells.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/multisorting.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/products.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowborder.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowediting.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowstyle.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/selection.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/simpletoolbar.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/transform.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datalist/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datalist/checkbox.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datalist/datalist_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datalist/group.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datalist/multiselect.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datalist/remotedata.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datebox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datebox/buttons.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datebox/clone.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datebox/dateformat.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datebox/events.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datebox/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datebox/restrict.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datebox/sharedcalendar.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datebox/validate.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/initvalue.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/showseconds.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/clearicon.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/format.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/demo.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/dialog/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/dialog/complextoolbar.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/dialog/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/dialog/toolbarbuttons.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/draggable/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/draggable/constrain.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/draggable/snap.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/drawer/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/drawer/headerfooter.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/drawer/region.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/droppable/accept.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/droppable/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/droppable/sort.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/easyloader/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/filebox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/filebox/buttonalign.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/filebox/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/form/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/form/floatinglabel.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/form/form_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/form/load.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/form/validateonsubmit.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/_content.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/addremove.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/autoheight.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/collapsetitle.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/complex.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/customcollapsetitle.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/datagrid_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/full.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/nestedlayout.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/nocollapsible.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/propertygrid_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/layout/tree_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/group.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/iconalign.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/plain.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/size.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/style.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/toggle.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/maskedbox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/menu/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/menu/customitem.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/menu/events.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/menu/inline.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/menu/nav.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/actions.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/alignment.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/nav.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/messager/alert.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/messager/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/messager/interactive.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/messager/position.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/messager/tip.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/format.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/range.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/align.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/increment.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/range.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/pagination/attaching.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/pagination/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/pagination/custombuttons.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/pagination/layout.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/pagination/links.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/pagination/simple.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/panel/_content.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/panel/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/panel/customtools.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/panel/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/panel/footer.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/panel/halign.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/panel/loadcontent.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/panel/nestedpanel.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/panel/paneltools.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/flash.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/test.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/validatepassword.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/progressbar/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/progressbar/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/customcolumns.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/groupformat.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/propertygrid_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/radiobutton/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/radiogroup/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/resizable/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/category.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/sidemenu_style.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/style.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/slider/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/slider/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/slider/formattip.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/slider/nonlinear.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/slider/range.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/slider/rule.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/slider/vertical.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/splitbutton/actions.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/splitbutton/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/switchbutton/action.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/switchbutton/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/_content.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/autoheight.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/dropdown.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/fixedwidth.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/hover.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/images/modem.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/images/pda.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/images/scanner.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/images/tablet.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/nestedtabs.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/striptools.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/style.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabimage.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabposition.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabstools.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tree_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/autocomplete.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/button.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/format.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/style.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/tagbox_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/validate.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/textbox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/textbox/button.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/textbox/clearicon.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/textbox/custom.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/textbox/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/textbox/icons.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/textbox/multiline.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/textbox/size.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/timepicker/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/timepicker/hour24.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/actions.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/hour12.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/range.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/_content.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/_dialog.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/ajax.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/customcontent.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/customstyle.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/position.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/toolbar.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/tooltipdialog.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/actions.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/animation.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/checkbox.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/contextmenu.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/customcheckbox.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/dnd.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/editable.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/formatting.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/icons.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/lazyload.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/lines.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/tree_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/tree/tree_data2.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/actions.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/checkbox.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/clientpagination.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/contextmenu.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/customcheckbox.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/editable.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/footer.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/lines.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/reports.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data1.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data2.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data3.json delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/customtooltip.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/errorplacement.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/validateonblur.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/window/basic.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/window/borderstyle.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/window/customtools.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/window/fluid.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/window/footer.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/window/inlinewindow.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/window/modalwindow.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/demo/window/windowlayout.html delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/easyloader.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/jquery.easyui.min.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/jquery.easyui.mobile.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/jquery.min.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/license_freeware.txt delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-af.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-am.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-ar.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-bg.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-ca.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-cs.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-cz.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-da.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-de.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-el.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-en.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-es.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-fa.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-fr.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-it.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-jp.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-ko.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-nl.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-pl.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-pt_BR.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-ru.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-sv_SE.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-tr.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-ua.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-zh_CN.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/locale/easyui-lang-zh_TW.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.accordion.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.calendar.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.checkbox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.checkgroup.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.combo.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.combobox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.combogrid.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.combotree.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.combotreegrid.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.datagrid.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.datalist.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.datebox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.datetimebox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.datetimespinner.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.dialog.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.draggable.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.drawer.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.droppable.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.filebox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.form.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.layout.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.linkbutton.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.maskedbox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.menu.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.menubutton.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.messager.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.mobile.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.numberbox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.numberspinner.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.pagination.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.panel.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.parser.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.passwordbox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.progressbar.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.propertygrid.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.radiobutton.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.radiogroup.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.resizable.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.searchbox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.sidemenu.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.slider.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.spinner.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.splitbutton.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.switchbutton.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.tabs.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.tagbox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.textbox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.timepicker.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.timespinner.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.tooltip.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.tree.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.treegrid.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.validatebox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/plugins/jquery.window.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/readme.txt delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/easyloader.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.accordion.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.calendar.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.combobox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.datebox.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.draggable.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.droppable.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.form.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.linkbutton.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.menu.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.parser.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.progressbar.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.propertygrid.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.resizable.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.slider.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.tabs.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/src/jquery.window.js delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/angular.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/accordion.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/calendar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/checkbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/combo.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/combobox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/datagrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/datalist.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/datebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/dialog.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/drawer.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/easyui.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/filebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/flex.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/accordion_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/blank.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/calendar_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/combo_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/datagrid_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/datebox_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/layout_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/linkbutton_bg.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/loading.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/menu_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/messager_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/messager_icons16.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/pagination_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/panel_tools.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/passwordbox_close.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/passwordbox_open.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/searchbox_button.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/slider_handle.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/spinner_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/tabs_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/tagbox_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/tree_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/images/validatebox_warning.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/layout.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/linkbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/menu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/menubutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/messager.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/pagination.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/panel.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/passwordbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/progressbar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/propertygrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/radiobutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/searchbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/sidemenu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/slider.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/spinner.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/splitbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/switchbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/tabs.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/tagbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/textbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/timepicker.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/tooltip.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/tree.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/validatebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/black/window.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/accordion.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/calendar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/checkbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/combo.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/combobox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/datagrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/datalist.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/datebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/dialog.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/drawer.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/easyui.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/filebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/flex.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/accordion_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/blank.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/calendar_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/combo_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/datagrid_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/datebox_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/down_green.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/layout_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/linkbutton_bg.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/loading.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/menu_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/messager_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/messager_icons16.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/middle.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/pagination_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/panel_tools.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/passwordbox_close.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/passwordbox_open.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/searchbox_button.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/slider_handle.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/spinner_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/tabs_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/tagbox_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/tree_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/up_red.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/images/validatebox_warning.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/layout.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/linkbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/menu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/menubutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/messager.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/pagination.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/panel.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/passwordbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/progressbar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/propertygrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/radiobutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/searchbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/sidemenu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/slider.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/spinner.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/splitbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/switchbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/tabs.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/tagbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/textbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/timepicker.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/tooltip.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/tree.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/validatebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/bootstrap/window.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/color.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/accordion.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/calendar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/checkbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/combo.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/combobox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/datagrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/datalist.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/datebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/dialog.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/drawer.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/easyui.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/filebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/flex.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/accordion_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/blank.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/calendar_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/combo_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/datagrid_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/datebox_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/layout_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/linkbutton_bg.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/loading.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/menu_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/messager_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/messager_icons16.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/pagination_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/panel_tools.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/passwordbox_close.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/passwordbox_open.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/searchbox_button.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/slider_handle.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/spinner_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/tabs_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/tagbox_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/tree_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/images/validatebox_warning.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/layout.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/linkbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/menu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/menubutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/messager.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/pagination.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/panel.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/passwordbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/progressbar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/propertygrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/radiobutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/searchbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/sidemenu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/slider.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/spinner.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/splitbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/switchbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/tabs.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/tagbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/textbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/timepicker.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/tooltip.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/tree.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/validatebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/default/window.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/accordion.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/calendar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/checkbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/combo.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/combobox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/datagrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/datalist.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/datebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/dialog.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/drawer.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/easyui.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/filebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/flex.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/accordion_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/blank.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/calendar_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/combo_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/datagrid_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/datebox_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/layout_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/linkbutton_bg.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/loading.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/menu_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/messager_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/messager_icons16.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/pagination_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/panel_tools.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/passwordbox_close.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/passwordbox_open.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/searchbox_button.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/slider_handle.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/spinner_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/tabs_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/tagbox_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/tree_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/images/validatebox_warning.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/layout.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/linkbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/menu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/menubutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/messager.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/pagination.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/panel.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/passwordbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/progressbar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/propertygrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/radiobutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/searchbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/sidemenu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/slider.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/spinner.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/splitbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/switchbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/tabs.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/tagbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/textbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/timepicker.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/tooltip.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/tree.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/validatebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/gray/window.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icon.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/back.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/blank.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/cancel.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/clear.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/cut.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/down_green.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/edit_add.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/edit_remove.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/filesave.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/filter.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/help.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/large_chart.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/large_clipart.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/large_picture.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/large_shapes.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/large_smartart.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/lock.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/man.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/man0.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/mini_add.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/mini_edit.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/mini_refresh.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/more.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/no.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/ok.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/pencil.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/print.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/redo.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/reload.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/search.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/sum.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/tip.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/undo.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/icons/up_red.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/accordion.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/calendar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/checkbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/combo.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/combobox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/datagrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/datalist.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/datebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/dialog.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/drawer.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/easyui.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/filebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/flex.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/accordion_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/blank.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/calendar_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/combo_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/datagrid_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/datebox_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/layout_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/linkbutton_bg.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/loading.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/menu_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/menu_arrows1.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/menu_arrows2.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/messager_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/messager_icons16.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/pagination_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/panel_tools.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/passwordbox_close.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/passwordbox_open.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/searchbox_button.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/slider_handle.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/spinner_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/tabs_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/tagbox_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/tree_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/images/validatebox_warning.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/layout.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/linkbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/menu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/menubutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/messager.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/pagination.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/panel.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/passwordbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/progressbar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/propertygrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/radiobutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/searchbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/sidemenu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/slider.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/spinner.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/splitbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/switchbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/tabs.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/tagbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/textbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/timepicker.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/tooltip.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/tree.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/validatebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-blue/window.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/accordion.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/calendar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/checkbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/combo.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/combobox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/datagrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/datalist.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/datebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/dialog.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/drawer.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/easyui.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/filebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/flex.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/Thumbs.db delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/accordion_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/blank.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/calendar_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/combo_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/datagrid_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/datebox_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/layout_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/linkbutton_bg.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/loading.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/menu_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/messager_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/messager_icons16.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/pagination_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/panel_tools.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/passwordbox_close.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/passwordbox_open.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/searchbox_button.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/slider_handle.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/spinner_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/tabs_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/tagbox_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/tree_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/images/validatebox_warning.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/layout.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/linkbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/menu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/menubutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/messager.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/pagination.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/panel.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/passwordbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/progressbar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/propertygrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/radiobutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/searchbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/sidemenu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/slider.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/spinner.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/splitbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/switchbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/tabs.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/tagbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/textbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/timepicker.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/tooltip.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/tree.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/validatebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material-teal/window.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/accordion.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/calendar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/checkbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/combo.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/combobox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/datagrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/datalist.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/datebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/dialog.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/drawer.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/easyui.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/filebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/flex.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/Thumbs.db delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/accordion_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/blank.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/calendar_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/combo_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/datagrid_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/datebox_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/layout_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/linkbutton_bg.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/loading.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/menu_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/messager_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/messager_icons16.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/pagination_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/panel_tools.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/passwordbox_close.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/passwordbox_open.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/searchbox_button.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/slider_handle.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/spinner_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/tabs_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/tagbox_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/tree_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/images/validatebox_warning.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/layout.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/linkbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/menu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/menubutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/messager.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/pagination.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/panel.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/passwordbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/progressbar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/propertygrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/radiobutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/searchbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/sidemenu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/slider.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/spinner.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/splitbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/switchbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/tabs.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/tagbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/textbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/timepicker.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/tooltip.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/tree.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/validatebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/material/window.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/accordion.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/calendar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/checkbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/combo.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/combobox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/datagrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/datalist.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/datebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/dialog.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/drawer.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/easyui.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/filebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/flex.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/accordion_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/blank.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/calendar_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/combo_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/datagrid_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/datebox_arrow.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/layout_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/linkbutton_bg.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/loading.gif delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/menu_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/messager_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/messager_icons16.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/pagination_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/panel_tools.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/passwordbox_close.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/passwordbox_open.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/searchbox_button.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/slider_handle.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/spinner_arrows.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/tabs_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/tagbox_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/tree_icons.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/images/validatebox_warning.png delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/layout.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/linkbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/menu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/menubutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/messager.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/pagination.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/panel.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/passwordbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/progressbar.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/propertygrid.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/radiobutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/searchbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/sidemenu.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/slider.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/spinner.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/splitbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/switchbutton.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/tabs.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/tagbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/textbox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/timepicker.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/tooltip.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/tree.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/validatebox.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/metro/window.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/mobile.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/react.css delete mode 100644 src/UWE_projectCode/前后端信息交互引用库/themes/vue.css diff --git a/src/UWE_projectCode/RTL分析代码/cv32e40p_controller.sv b/src/UWE_projectCode/RTL分析代码/cv32e40p_controller.sv deleted file mode 100644 index 4c3295c..0000000 --- a/src/UWE_projectCode/RTL分析代码/cv32e40p_controller.sv +++ /dev/null @@ -1,1589 +0,0 @@ -// Copyright 2018 ETH Zurich and University of Bologna. -// Copyright and related rights are licensed under the Solderpad Hardware -// License, Version 0.51 (the "License"); you may not use this file except in -// compliance with the License. You may obtain a copy of the License at -// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law -// or agreed to in writing, software, hardware and materials distributed under -// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -//////////////////////////////////////////////////////////////////////////////// -// Engineer: Matthias Baer - baermatt@student.ethz.ch // -// // -// Additional contributions by: // -// Igor Loi - igor.loi@unibo.it // -// Andreas Traber - atraber@student.ethz.ch // -// Sven Stucki - svstucki@student.ethz.ch // -// Michael Gautschi - gautschi@iis.ee.ethz.ch // -// Davide Schiavone - pschiavo@iis.ee.ethz.ch // -// Robert Balas - balasr@iis.ee.ethz.ch // -// Andrea Bettati - andrea.bettati@studenti.unipr.it // -// // -// Design Name: Main controller // -// Project Name: RI5CY // -// Language: SystemVerilog // -// // -// Description: Main CPU controller of the processor // -// // -//////////////////////////////////////////////////////////////////////////////// - -module cv32e40p_controller import cv32e40p_pkg::*; -#( - parameter PULP_CLUSTER = 0, - parameter PULP_XPULP = 1 -) -( - input logic clk, // Gated clock - input logic clk_ungated_i, // Ungated clock - input logic rst_n, - - input logic fetch_enable_i, // Start the decoding - output logic ctrl_busy_o, // Core is busy processing instructions - output logic is_decoding_o, // Core is in decoding state - input logic is_fetch_failed_i, - - // decoder related signals - output logic deassert_we_o, // deassert write enable for next instruction - - input logic illegal_insn_i, // decoder encountered an invalid instruction - input logic ecall_insn_i, // decoder encountered an ecall instruction - input logic mret_insn_i, // decoder encountered an mret instruction - input logic uret_insn_i, // decoder encountered an uret instruction - - input logic dret_insn_i, // decoder encountered an dret instruction - - input logic mret_dec_i, - input logic uret_dec_i, - input logic dret_dec_i, - - input logic wfi_i, // decoder wants to execute a WFI - input logic ebrk_insn_i, // decoder encountered an ebreak instruction - input logic fencei_insn_i, // decoder encountered an fence.i instruction - input logic csr_status_i, // decoder encountered an csr status instruction - - output logic hwlp_mask_o, // prevent writes on the hwloop instructions in case interrupt are taken - - // from IF/ID pipeline - input logic instr_valid_i, // instruction coming from IF/ID pipeline is valid - - // from prefetcher - output logic instr_req_o, // Start fetching instructions - - // to prefetcher - output logic pc_set_o, // jump to address set by pc_mux - output logic [3:0] pc_mux_o, // Selector in the Fetch stage to select the rigth PC (normal, jump ...) - output logic [2:0] exc_pc_mux_o, // Selects target PC for exception - output logic [1:0] trap_addr_mux_o, // Selects trap address base - - // HWLoop signls - input logic [31:0] pc_id_i, - input logic is_compressed_i, - - // from hwloop_regs - input logic [1:0] [31:0] hwlp_start_addr_i, - input logic [1:0] [31:0] hwlp_end_addr_i, - input logic [1:0] [31:0] hwlp_counter_i, - - // to hwloop_regs - output logic [1:0] hwlp_dec_cnt_o, - - output logic hwlp_jump_o, - output logic [31:0] hwlp_targ_addr_o, - - // LSU - input logic data_req_ex_i, // data memory access is currently performed in EX stage - input logic data_we_ex_i, - input logic data_misaligned_i, - input logic data_load_event_i, - input logic data_err_i, - output logic data_err_ack_o, - - // from ALU - input logic mult_multicycle_i, // multiplier is taken multiple cycles and uses op c as storage - - // APU dependency checks - input logic apu_en_i, - input logic apu_read_dep_i, - input logic apu_write_dep_i, - - output logic apu_stall_o, - - // jump/branch signals - input logic branch_taken_ex_i, // branch taken signal from EX ALU - input logic [1:0] ctrl_transfer_insn_in_id_i, // jump is being calculated in ALU - input logic [1:0] ctrl_transfer_insn_in_dec_i, // jump is being calculated in ALU - - // Interrupt Controller Signals - input logic irq_req_ctrl_i, - input logic irq_sec_ctrl_i, - input logic [4:0] irq_id_ctrl_i, - input logic irq_wu_ctrl_i, - input PrivLvl_t current_priv_lvl_i, - - output logic irq_ack_o, - output logic [4:0] irq_id_o, - - output logic [4:0] exc_cause_o, - - // Debug Signal - output logic debug_mode_o, - output logic [2:0] debug_cause_o, - output logic debug_csr_save_o, - input logic debug_req_i, - input logic debug_single_step_i, - input logic debug_ebreakm_i, - input logic debug_ebreaku_i, - input logic trigger_match_i, - output logic debug_p_elw_no_sleep_o, - output logic debug_wfi_no_sleep_o, - output logic debug_havereset_o, - output logic debug_running_o, - output logic debug_halted_o, - - // Wakeup Signal - output logic wake_from_sleep_o, - - output logic csr_save_if_o, - output logic csr_save_id_o, - output logic csr_save_ex_o, - output logic [5:0] csr_cause_o, - output logic csr_irq_sec_o, - output logic csr_restore_mret_id_o, - output logic csr_restore_uret_id_o, - - output logic csr_restore_dret_id_o, - - output logic csr_save_cause_o, - - - // Regfile target - input logic regfile_we_id_i, // currently decoded we enable - input logic [5:0] regfile_alu_waddr_id_i, // currently decoded target address - - // Forwarding signals from regfile - input logic regfile_we_ex_i, // FW: write enable from EX stage - input logic [5:0] regfile_waddr_ex_i, // FW: write address from EX stage - input logic regfile_we_wb_i, // FW: write enable from WB stage - input logic regfile_alu_we_fw_i, // FW: ALU/MUL write enable from EX stage - - // forwarding signals - output logic [1:0] operand_a_fw_mux_sel_o, // regfile ra data selector form ID stage - output logic [1:0] operand_b_fw_mux_sel_o, // regfile rb data selector form ID stage - output logic [1:0] operand_c_fw_mux_sel_o, // regfile rc data selector form ID stage - - // forwarding detection signals - input logic reg_d_ex_is_reg_a_i, - input logic reg_d_ex_is_reg_b_i, - input logic reg_d_ex_is_reg_c_i, - input logic reg_d_wb_is_reg_a_i, - input logic reg_d_wb_is_reg_b_i, - input logic reg_d_wb_is_reg_c_i, - input logic reg_d_alu_is_reg_a_i, - input logic reg_d_alu_is_reg_b_i, - input logic reg_d_alu_is_reg_c_i, - - // stall signals - output logic halt_if_o, - output logic halt_id_o, - - output logic misaligned_stall_o, - output logic jr_stall_o, - output logic load_stall_o, - - input logic id_ready_i, // ID stage is ready - input logic id_valid_i, // ID stage is valid - - input logic ex_valid_i, // EX stage is done - - input logic wb_ready_i, // WB stage is ready - - // Performance Counters - output logic perf_pipeline_stall_o // stall due to elw extra cycles -); - - // FSM state encoding - ctrl_state_e ctrl_fsm_cs, ctrl_fsm_ns; - - // Debug state - debug_state_e debug_fsm_cs, debug_fsm_ns; - - logic jump_done, jump_done_q, jump_in_dec, branch_in_id_dec, branch_in_id; - - logic data_err_q; - - logic debug_mode_q, debug_mode_n; - logic ebrk_force_debug_mode; - logic is_hwlp_illegal, is_hwlp_body; - logic illegal_insn_q, illegal_insn_n; - logic debug_req_entry_q, debug_req_entry_n; - logic debug_force_wakeup_q, debug_force_wakeup_n; - - logic hwlp_end0_eq_pc; - logic hwlp_end1_eq_pc; - logic hwlp_counter0_gt_1; - logic hwlp_counter1_gt_1; - logic hwlp_end0_eq_pc_plus4; - logic hwlp_end1_eq_pc_plus4; - logic hwlp_start0_leq_pc; - logic hwlp_start1_leq_pc; - logic hwlp_end0_geq_pc; - logic hwlp_end1_geq_pc; - // Auxiliary signals to make hwlp_jump_o last only one cycle (converting it into a pulse) - logic hwlp_end_4_id_d, hwlp_end_4_id_q; - - logic debug_req_q; - logic debug_req_pending; - - // qualify wfi vs nosleep locally - logic wfi_active; - - - //////////////////////////////////////////////////////////////////////////////////////////// - // ____ ___ ____ _____ ____ ___ _ _ _____ ____ ___ _ _ _____ ____ // - // / ___/ _ \| _ \| ____| / ___/ _ \| \ | |_ _| _ \ / _ \| | | | | ____| _ \ // - // | | | | | | |_) | _| | | | | | | \| | | | | |_) | | | | | | | | _| | |_) | // - // | |__| |_| | _ <| |___ | |__| |_| | |\ | | | | _ <| |_| | |___| |___| |___| _ < // - // \____\___/|_| \_\_____| \____\___/|_| \_| |_| |_| \_\\___/|_____|_____|_____|_| \_\ // - // // - //////////////////////////////////////////////////////////////////////////////////////////// - - always_comb - begin - // Default values - - instr_req_o = 1'b1; - - data_err_ack_o = 1'b0; - - csr_save_if_o = 1'b0; - csr_save_id_o = 1'b0; - csr_save_ex_o = 1'b0; - csr_restore_mret_id_o = 1'b0; - csr_restore_uret_id_o = 1'b0; - - csr_restore_dret_id_o = 1'b0; - - csr_save_cause_o = 1'b0; - - exc_cause_o = '0; - exc_pc_mux_o = EXC_PC_IRQ; - trap_addr_mux_o = TRAP_MACHINE; - - csr_cause_o = '0; - csr_irq_sec_o = 1'b0; - - pc_mux_o = PC_BOOT; - pc_set_o = 1'b0; - jump_done = jump_done_q; - - ctrl_fsm_ns = ctrl_fsm_cs; - - ctrl_busy_o = 1'b1; - - halt_if_o = 1'b0; - halt_id_o = 1'b0; - is_decoding_o = 1'b0; - irq_ack_o = 1'b0; - irq_id_o = 5'b0; - - jump_in_dec = ctrl_transfer_insn_in_dec_i == BRANCH_JALR || ctrl_transfer_insn_in_dec_i == BRANCH_JAL; - - branch_in_id = ctrl_transfer_insn_in_id_i == BRANCH_COND; - branch_in_id_dec = ctrl_transfer_insn_in_dec_i == BRANCH_COND; - - ebrk_force_debug_mode = (debug_ebreakm_i && current_priv_lvl_i == PRIV_LVL_M) || - (debug_ebreaku_i && current_priv_lvl_i == PRIV_LVL_U); - debug_csr_save_o = 1'b0; - debug_cause_o = DBG_CAUSE_EBREAK; - debug_mode_n = debug_mode_q; - - illegal_insn_n = illegal_insn_q; - // a trap towards the debug unit is generated when one of the - // following conditions are true: - // - ebreak instruction encountered - // - single-stepping mode enabled - // - illegal instruction exception and IIE bit is set - // - IRQ and INTE bit is set and no exception is currently running - // - Debuger requests halt - - debug_req_entry_n = debug_req_entry_q; - - debug_force_wakeup_n = debug_force_wakeup_q; - - perf_pipeline_stall_o = 1'b0; - - hwlp_mask_o = 1'b0; - - is_hwlp_illegal = 1'b0; - - hwlp_dec_cnt_o = '0; - hwlp_end_4_id_d = 1'b0; - - // When the controller tells to hwlp-jump, the prefetcher does not always jump immediately, - // but the aligner immediately modifies pc_id to HWLP_BEGIN. This condition on hwlp_targ_addr_o - // ensures that the target is kept constant even if pc_id is no more HWLP_END - hwlp_targ_addr_o = ((hwlp_start1_leq_pc && hwlp_end1_geq_pc) && !(hwlp_start0_leq_pc && hwlp_end0_geq_pc)) ? hwlp_start_addr_i[1] : hwlp_start_addr_i[0]; - - unique case (ctrl_fsm_cs) - // We were just reset, wait for fetch_enable - RESET: - begin - is_decoding_o = 1'b0; - instr_req_o = 1'b0; - if (fetch_enable_i == 1'b1) - begin - ctrl_fsm_ns = BOOT_SET; - end - end - - // copy boot address to instr fetch address - BOOT_SET: - begin - is_decoding_o = 1'b0; - instr_req_o = 1'b1; - pc_mux_o = PC_BOOT; - pc_set_o = 1'b1; - if (debug_req_pending) begin - ctrl_fsm_ns = DBG_TAKEN_IF; - debug_force_wakeup_n = 1'b1; - end else begin - ctrl_fsm_ns = FIRST_FETCH; - end - end - - WAIT_SLEEP: - begin - is_decoding_o = 1'b0; - ctrl_busy_o = 1'b0; - instr_req_o = 1'b0; - halt_if_o = 1'b1; - halt_id_o = 1'b1; - ctrl_fsm_ns = SLEEP; - end - - // instruction in if_stage is already valid - SLEEP: - begin - // we begin execution when an - // interrupt has arrived - is_decoding_o = 1'b0; - instr_req_o = 1'b0; - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - // normal execution flow - // in debug mode or single step mode we leave immediately (wfi=nop) - if (wake_from_sleep_o) begin - if (debug_req_pending) begin - ctrl_fsm_ns = DBG_TAKEN_IF; - debug_force_wakeup_n = 1'b1; - end else begin - ctrl_fsm_ns = FIRST_FETCH; - end - end else begin - ctrl_busy_o = 1'b0; - end - end - - FIRST_FETCH: - begin - is_decoding_o = 1'b0; - - // ID stage is always ready - ctrl_fsm_ns = DECODE; - - // handle interrupts - if (irq_req_ctrl_i && ~(debug_req_pending || debug_mode_q)) begin - // This assumes that the pipeline is always flushed before - // going to sleep. - // Debug mode takes precedence over irq (see DECODE:) - - // Taken IRQ - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - pc_set_o = 1'b1; - pc_mux_o = PC_EXCEPTION; - exc_pc_mux_o = EXC_PC_IRQ; - exc_cause_o = irq_id_ctrl_i; - csr_irq_sec_o = irq_sec_ctrl_i; - - // IRQ interface - irq_ack_o = 1'b1; - irq_id_o = irq_id_ctrl_i; - - if (irq_sec_ctrl_i) - trap_addr_mux_o = TRAP_MACHINE; - else - trap_addr_mux_o = current_priv_lvl_i == PRIV_LVL_U ? TRAP_USER : TRAP_MACHINE; - - csr_save_cause_o = 1'b1; - csr_cause_o = {1'b1,irq_id_ctrl_i}; - csr_save_if_o = 1'b1; - end - end - - DECODE: - begin - - if (branch_taken_ex_i) - begin //taken branch - // there is a branch in the EX stage that is taken - - is_decoding_o = 1'b0; - - pc_mux_o = PC_BRANCH; - pc_set_o = 1'b1; - - // if we want to debug, flush the pipeline - // the current_pc_if will take the value of the next instruction to - // be executed (NPC) - - end //taken branch - - else if (data_err_i) - begin //data error - // the current LW or SW have been blocked by the PMP - - is_decoding_o = 1'b0; - halt_if_o = 1'b1; - halt_id_o = 1'b1; - csr_save_ex_o = 1'b1; - csr_save_cause_o = 1'b1; - data_err_ack_o = 1'b1; - //no jump in this stage as we have to wait one cycle to go to Machine Mode - - csr_cause_o = {1'b0, data_we_ex_i ? EXC_CAUSE_STORE_FAULT : EXC_CAUSE_LOAD_FAULT}; - ctrl_fsm_ns = FLUSH_WB; - - end //data error - - else if (is_fetch_failed_i) - begin - - // the current instruction has been blocked by the PMP - - is_decoding_o = 1'b0; - halt_id_o = 1'b1; - halt_if_o = 1'b1; - csr_save_if_o = 1'b1; - csr_save_cause_o = !debug_mode_q; - - //no jump in this stage as we have to wait one cycle to go to Machine Mode - - csr_cause_o = {1'b0, EXC_CAUSE_INSTR_FAULT}; - ctrl_fsm_ns = FLUSH_WB; - - - end - // decode and execute instructions only if the current conditional - // branch in the EX stage is either not taken, or there is no - // conditional branch in the EX stage - else if (instr_valid_i) //valid block - begin: blk_decode_level1 // now analyze the current instruction in the ID stage - - is_decoding_o = 1'b1; - illegal_insn_n = 1'b0; - - if ( (debug_req_pending || trigger_match_i) & ~debug_mode_q ) - begin - //Serving the debug - halt_if_o = 1'b1; - halt_id_o = 1'b1; - ctrl_fsm_ns = DBG_FLUSH; - debug_req_entry_n = 1'b1; - end - else if (irq_req_ctrl_i && ~debug_mode_q) - begin - // Taken IRQ - hwlp_mask_o = PULP_XPULP ? 1'b1 : 1'b0; - - is_decoding_o = 1'b0; - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - pc_set_o = 1'b1; - pc_mux_o = PC_EXCEPTION; - exc_pc_mux_o = EXC_PC_IRQ; - exc_cause_o = irq_id_ctrl_i; - csr_irq_sec_o = irq_sec_ctrl_i; - - // IRQ interface - irq_ack_o = 1'b1; - irq_id_o = irq_id_ctrl_i; - - if (irq_sec_ctrl_i) - trap_addr_mux_o = TRAP_MACHINE; - else - trap_addr_mux_o = current_priv_lvl_i == PRIV_LVL_U ? TRAP_USER : TRAP_MACHINE; - - csr_save_cause_o = 1'b1; - csr_cause_o = {1'b1,irq_id_ctrl_i}; - csr_save_id_o = 1'b1; - end - else - begin - - is_hwlp_illegal = is_hwlp_body & (jump_in_dec || branch_in_id_dec || mret_insn_i || uret_insn_i || dret_insn_i || is_compressed_i || fencei_insn_i || wfi_active); - - if(illegal_insn_i || is_hwlp_illegal) begin - - halt_if_o = 1'b1; - halt_id_o = 1'b0; - ctrl_fsm_ns = id_ready_i ? FLUSH_EX : DECODE; - illegal_insn_n = 1'b1; - - end else begin - - //decoding block - unique case (1'b1) - - jump_in_dec: begin - // handle unconditional jumps - // we can jump directly since we know the address already - // we don't need to worry about conditional branches here as they - // will be evaluated in the EX stage - pc_mux_o = PC_JUMP; - // if there is a jr stall, wait for it to be gone - if ((~jr_stall_o) && (~jump_done_q)) begin - pc_set_o = 1'b1; - jump_done = 1'b1; - end - end - - ebrk_insn_i: begin - halt_if_o = 1'b1; - halt_id_o = 1'b0; - - if (debug_mode_q) - // we got back to the park loop in the debug rom - ctrl_fsm_ns = DBG_FLUSH; - - else if (ebrk_force_debug_mode) begin - // debug module commands us to enter debug mode anyway - ctrl_fsm_ns = DBG_FLUSH; - end else begin - // otherwise just a normal ebreak exception - ctrl_fsm_ns = id_ready_i ? FLUSH_EX : DECODE; - end - - end - - wfi_active: begin - halt_if_o = 1'b1; - halt_id_o = 1'b0; - ctrl_fsm_ns = id_ready_i ? FLUSH_EX : DECODE; - end - - ecall_insn_i: begin - halt_if_o = 1'b1; - halt_id_o = 1'b0; - ctrl_fsm_ns = id_ready_i ? FLUSH_EX : DECODE; - end - - fencei_insn_i: begin - halt_if_o = 1'b1; - halt_id_o = 1'b0; - ctrl_fsm_ns = id_ready_i ? FLUSH_EX : DECODE; - end - - mret_insn_i | uret_insn_i | dret_insn_i: begin - halt_if_o = 1'b1; - halt_id_o = 1'b0; - ctrl_fsm_ns = id_ready_i ? FLUSH_EX : DECODE; - end - - csr_status_i: begin - halt_if_o = 1'b1; - ctrl_fsm_ns = id_ready_i ? FLUSH_EX : DECODE; - end - - data_load_event_i: begin - ctrl_fsm_ns = id_ready_i ? ELW_EXE : DECODE; - halt_if_o = 1'b1; - end - - default: begin - - if(is_hwlp_body) begin - //we are at the inside of an HWloop, thus change state - - //We stay here in case we returned from the second last instruction, otherwise the next cycle - //in DECODE_HWLOOP we miss to jump, we jump at PC_END. - //This way looses a cycle but it's a corner case of returning from exceptions or interrupts - - ctrl_fsm_ns = hwlp_end0_eq_pc_plus4 || hwlp_end1_eq_pc_plus4 ? DECODE : DECODE_HWLOOP; - - // we can be at the end of HWloop due to a return from interrupt or ecall or ebreak or exceptions - if(hwlp_end0_eq_pc && hwlp_counter0_gt_1) begin - pc_mux_o = PC_HWLOOP; - if (~jump_done_q) begin - pc_set_o = 1'b1; - // Keep the instruction and the related address in the Aligner if - // ID is stalled during a jump - jump_done = 1'b1; - hwlp_dec_cnt_o[0] = 1'b1; - end - end - if(hwlp_end1_eq_pc && hwlp_counter1_gt_1) begin - pc_mux_o = PC_HWLOOP; - if (~jump_done_q) begin - pc_set_o = 1'b1; - // Keep the instruction and the related address in the Aligner if - // ID is stalled during a jump - jump_done = 1'b1; - hwlp_dec_cnt_o[1] = 1'b1; - end - end - end - end - - endcase // unique case (1'b1) - end - - if (debug_single_step_i & ~debug_mode_q) begin - // prevent any more instructions from executing - halt_if_o = 1'b1; - - // we don't handle dret here because its should be illegal - // anyway in this context - - // illegal, ecall, ebrk and xrettransition to later to a DBG - // state since we need the return address which is - // determined later - - if (id_ready_i) begin - // make sure the current instruction has been executed - unique case(1'b1) - - illegal_insn_i | ecall_insn_i: - begin - ctrl_fsm_ns = FLUSH_EX; - end - - (~ebrk_force_debug_mode & ebrk_insn_i): - begin - ctrl_fsm_ns = FLUSH_EX; - end - - mret_insn_i | uret_insn_i: - begin - ctrl_fsm_ns = FLUSH_EX; - end - - branch_in_id: - begin - ctrl_fsm_ns = DBG_WAIT_BRANCH; - end - - default: - // regular instruction or ebrk force debug - ctrl_fsm_ns = DBG_FLUSH; - endcase // unique case (1'b1) - end - end - - end // else: !if (irq_req_ctrl_i && ~debug_mode_q) - - end //valid block - else begin - is_decoding_o = 1'b0; - perf_pipeline_stall_o = data_load_event_i; - end - end - - DECODE_HWLOOP: - begin - if (PULP_XPULP) begin - if (instr_valid_i) // valid block - begin // now analyze the current instruction in the ID stage - - is_decoding_o = 1'b1; - - if ( (debug_req_pending || trigger_match_i) & ~debug_mode_q ) - begin - //Serving the debug - halt_if_o = 1'b1; - halt_id_o = 1'b1; - ctrl_fsm_ns = DBG_FLUSH; - debug_req_entry_n = 1'b1; - end - else if (irq_req_ctrl_i && ~debug_mode_q) - begin - // Taken IRQ - hwlp_mask_o = PULP_XPULP ? 1'b1 : 1'b0; - - is_decoding_o = 1'b0; - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - pc_set_o = 1'b1; - pc_mux_o = PC_EXCEPTION; - exc_pc_mux_o = EXC_PC_IRQ; - exc_cause_o = irq_id_ctrl_i; - csr_irq_sec_o = irq_sec_ctrl_i; - - // IRQ interface - irq_ack_o = 1'b1; - irq_id_o = irq_id_ctrl_i; - - if (irq_sec_ctrl_i) - trap_addr_mux_o = TRAP_MACHINE; - else - trap_addr_mux_o = current_priv_lvl_i == PRIV_LVL_U ? TRAP_USER : TRAP_MACHINE; - - csr_save_cause_o = 1'b1; - csr_cause_o = {1'b1,irq_id_ctrl_i}; - csr_save_id_o = 1'b1; - - ctrl_fsm_ns = DECODE; - end - else - begin - - is_hwlp_illegal = (jump_in_dec || branch_in_id_dec || mret_insn_i || uret_insn_i || dret_insn_i || is_compressed_i || fencei_insn_i || wfi_active); - - if(illegal_insn_i || is_hwlp_illegal) begin - - halt_if_o = 1'b1; - halt_id_o = 1'b1; - ctrl_fsm_ns = FLUSH_EX; - illegal_insn_n = 1'b1; - - end else begin - - //decoding block - unique case (1'b1) - - ebrk_insn_i: begin - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - if (debug_mode_q) - // we got back to the park loop in the debug rom - ctrl_fsm_ns = DBG_FLUSH; - - else if (ebrk_force_debug_mode) - // debug module commands us to enter debug mode anyway - ctrl_fsm_ns = DBG_FLUSH; - - else begin - // otherwise just a normal ebreak exception - ctrl_fsm_ns = FLUSH_EX; - end - - end - - ecall_insn_i: begin - halt_if_o = 1'b1; - halt_id_o = 1'b1; - ctrl_fsm_ns = FLUSH_EX; - end - - csr_status_i: begin - halt_if_o = 1'b1; - ctrl_fsm_ns = id_ready_i ? FLUSH_EX : DECODE_HWLOOP; - end - - data_load_event_i: begin - ctrl_fsm_ns = id_ready_i ? ELW_EXE : DECODE_HWLOOP; - halt_if_o = 1'b1; - end - - default: begin - - // we can be at the end of HWloop due to a return from interrupt or ecall or ebreak or exceptions - if(hwlp_end1_eq_pc_plus4) begin - if(hwlp_counter1_gt_1) begin - hwlp_end_4_id_d = 1'b1; - hwlp_targ_addr_o = hwlp_start_addr_i[1]; - ctrl_fsm_ns = DECODE_HWLOOP; - end else - ctrl_fsm_ns = is_hwlp_body ? DECODE_HWLOOP : DECODE; - end - - if(hwlp_end0_eq_pc_plus4) begin - if(hwlp_counter0_gt_1) begin - hwlp_end_4_id_d = 1'b1; - hwlp_targ_addr_o = hwlp_start_addr_i[0]; - ctrl_fsm_ns = DECODE_HWLOOP; - end else - ctrl_fsm_ns = is_hwlp_body ? DECODE_HWLOOP : DECODE; - end - - hwlp_dec_cnt_o[0] = hwlp_end0_eq_pc; - hwlp_dec_cnt_o[1] = hwlp_end1_eq_pc; - - end - endcase // unique case (1'b1) - end // else: !if(illegal_insn_i) - - if (debug_single_step_i & ~debug_mode_q) begin - // prevent any more instructions from executing - halt_if_o = 1'b1; - - // we don't handle dret here because its should be illegal - // anyway in this context - - // illegal, ecall, ebrk and xrettransition to later to a DBG - // state since we need the return address which is - // determined later - - if (id_ready_i) begin - // make sure the current instruction has been executed - unique case(1'b1) - - illegal_insn_i | ecall_insn_i: - begin - ctrl_fsm_ns = FLUSH_EX; - end - - (~ebrk_force_debug_mode & ebrk_insn_i): - begin - ctrl_fsm_ns = FLUSH_EX; - end - - mret_insn_i | uret_insn_i: - begin - ctrl_fsm_ns = FLUSH_EX; - end - - branch_in_id: - begin - ctrl_fsm_ns = DBG_WAIT_BRANCH; - end - - default: - // regular instruction or ebrk force debug - ctrl_fsm_ns = DBG_FLUSH; - endcase // unique case (1'b1) - end - end // if (debug_single_step_i & ~debug_mode_q) - - end // else: !if (irq_req_ctrl_i && ~debug_mode_q) - - end // block: blk_decode_level1 : valid block - else begin - is_decoding_o = 1'b0; - perf_pipeline_stall_o = data_load_event_i; - end - end - end - - // flush the pipeline, insert NOP into EX stage - FLUSH_EX: - begin - is_decoding_o = 1'b0; - - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - if (data_err_i) - begin //data error - // the current LW or SW have been blocked by the PMP - csr_save_ex_o = 1'b1; - csr_save_cause_o = 1'b1; - data_err_ack_o = 1'b1; - //no jump in this stage as we have to wait one cycle to go to Machine Mode - csr_cause_o = {1'b0, data_we_ex_i ? EXC_CAUSE_STORE_FAULT : EXC_CAUSE_LOAD_FAULT}; - ctrl_fsm_ns = FLUSH_WB; - //putting illegal to 0 as if it was 1, the core is going to jump to the exception of the EX stage, - //so the illegal was never executed - illegal_insn_n = 1'b0; - end //data erro - else if (ex_valid_i) begin - //check done to prevent data harzard in the CSR registers - ctrl_fsm_ns = FLUSH_WB; - - if(illegal_insn_q) begin - csr_save_id_o = 1'b1; - csr_save_cause_o = !debug_mode_q; - csr_cause_o = {1'b0, EXC_CAUSE_ILLEGAL_INSN}; - end else begin - unique case (1'b1) - ebrk_insn_i: begin - csr_save_id_o = 1'b1; - csr_save_cause_o = 1'b1; - csr_cause_o = {1'b0, EXC_CAUSE_BREAKPOINT}; - end - ecall_insn_i: begin - csr_save_id_o = 1'b1; - csr_save_cause_o = !debug_mode_q; - csr_cause_o = {1'b0, current_priv_lvl_i == PRIV_LVL_U ? EXC_CAUSE_ECALL_UMODE : EXC_CAUSE_ECALL_MMODE}; - end - default:; - endcase // unique case (1'b1) - end - - end - end - - IRQ_FLUSH_ELW: - begin - if (PULP_CLUSTER == 1'b1) begin - is_decoding_o = 1'b0; - - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - ctrl_fsm_ns = DECODE; - - perf_pipeline_stall_o = data_load_event_i; - - if (irq_req_ctrl_i && ~(debug_req_pending || debug_mode_q)) begin - // Taken IRQ - is_decoding_o = 1'b0; - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - pc_set_o = 1'b1; - pc_mux_o = PC_EXCEPTION; - exc_pc_mux_o = EXC_PC_IRQ; - exc_cause_o = irq_id_ctrl_i; - csr_irq_sec_o = irq_sec_ctrl_i; - - // IRQ interface - irq_ack_o = 1'b1; - irq_id_o = irq_id_ctrl_i; - - if (irq_sec_ctrl_i) - trap_addr_mux_o = TRAP_MACHINE; - else - trap_addr_mux_o = current_priv_lvl_i == PRIV_LVL_U ? TRAP_USER : TRAP_MACHINE; - - csr_save_cause_o = 1'b1; - csr_cause_o = {1'b1,irq_id_ctrl_i}; - csr_save_id_o = 1'b1; - end - end - end - - ELW_EXE: - begin - if (PULP_CLUSTER == 1'b1) begin - is_decoding_o = 1'b0; - - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - //if we are here, a elw is executing now in the EX stage - //or if an interrupt has been received - //the ID stage contains the PC_ID of the elw, therefore halt_id is set to invalid the instruction - //If an interrupt occurs, we replay the ELW - //No needs to check irq_int_req_i since in the EX stage there is only the elw, no CSR pendings - if(id_ready_i) - ctrl_fsm_ns = ((debug_req_pending || trigger_match_i) & ~debug_mode_q) ? DBG_FLUSH : IRQ_FLUSH_ELW; - // if from the ELW EXE we go to IRQ_FLUSH_ELW, it is assumed that if there was an IRQ req together with the grant and IE was valid, then - // there must be no hazard due to xIE - else - ctrl_fsm_ns = ELW_EXE; - - perf_pipeline_stall_o = data_load_event_i; - end - end - - // flush the pipeline, insert NOP into EX and WB stage - FLUSH_WB: - begin - is_decoding_o = 1'b0; - - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - ctrl_fsm_ns = DECODE; - - if(data_err_q) begin - //PMP data_error - pc_mux_o = PC_EXCEPTION; - pc_set_o = 1'b1; - trap_addr_mux_o = TRAP_MACHINE; - //little hack during testing - exc_pc_mux_o = EXC_PC_EXCEPTION; - exc_cause_o = data_we_ex_i ? EXC_CAUSE_LOAD_FAULT : EXC_CAUSE_STORE_FAULT; - - end - else if (is_fetch_failed_i) begin - //instruction fetch error - pc_mux_o = PC_EXCEPTION; - pc_set_o = 1'b1; - trap_addr_mux_o = TRAP_MACHINE; - exc_pc_mux_o = debug_mode_q ? EXC_PC_DBE : EXC_PC_EXCEPTION; - exc_cause_o = EXC_CAUSE_INSTR_FAULT; - - end - else begin - if(illegal_insn_q) begin - //exceptions - pc_mux_o = PC_EXCEPTION; - pc_set_o = 1'b1; - trap_addr_mux_o = TRAP_MACHINE; - exc_pc_mux_o = debug_mode_q ? EXC_PC_DBE : EXC_PC_EXCEPTION; - illegal_insn_n = 1'b0; - if (debug_single_step_i && ~debug_mode_q) - ctrl_fsm_ns = DBG_TAKEN_IF; - end else begin - unique case(1'b1) - ebrk_insn_i: begin - //ebreak - pc_mux_o = PC_EXCEPTION; - pc_set_o = 1'b1; - trap_addr_mux_o = TRAP_MACHINE; - exc_pc_mux_o = EXC_PC_EXCEPTION; - - if (debug_single_step_i && ~debug_mode_q) - ctrl_fsm_ns = DBG_TAKEN_IF; - end - ecall_insn_i: begin - //ecall - pc_mux_o = PC_EXCEPTION; - pc_set_o = 1'b1; - trap_addr_mux_o = TRAP_MACHINE; - exc_pc_mux_o = debug_mode_q ? EXC_PC_DBE : EXC_PC_EXCEPTION; - - if (debug_single_step_i && ~debug_mode_q) - ctrl_fsm_ns = DBG_TAKEN_IF; - end - - mret_insn_i: begin - csr_restore_mret_id_o = !debug_mode_q; - ctrl_fsm_ns = XRET_JUMP; - end - uret_insn_i: begin - csr_restore_uret_id_o = !debug_mode_q; - ctrl_fsm_ns = XRET_JUMP; - end - dret_insn_i: begin - csr_restore_dret_id_o = 1'b1; - ctrl_fsm_ns = XRET_JUMP; - end - - csr_status_i: begin - - if(hwlp_end0_eq_pc && hwlp_counter0_gt_1) begin - pc_mux_o = PC_HWLOOP; - pc_set_o = 1'b1; - hwlp_dec_cnt_o[0] = 1'b1; - end - if(hwlp_end1_eq_pc && hwlp_counter1_gt_1) begin - pc_mux_o = PC_HWLOOP; - pc_set_o = 1'b1; - hwlp_dec_cnt_o[1] = 1'b1; - end - end - - wfi_i: begin - if ( debug_req_pending) begin - ctrl_fsm_ns = DBG_TAKEN_IF; - debug_force_wakeup_n = 1'b1; - end else begin - ctrl_fsm_ns = WAIT_SLEEP; - end - end - fencei_insn_i: begin - // we just jump to instruction after the fence.i since that - // forces the instruction cache to refetch - pc_mux_o = PC_FENCEI; - pc_set_o = 1'b1; - end - default:; - endcase - end - end - - end - - XRET_JUMP: - begin - is_decoding_o = 1'b0; - ctrl_fsm_ns = DECODE; - unique case(1'b1) - mret_dec_i: begin - //mret - pc_mux_o = debug_mode_q ? PC_EXCEPTION : PC_MRET; - pc_set_o = 1'b1; - exc_pc_mux_o = EXC_PC_DBE; // only used if in debug_mode - end - uret_dec_i: begin - //uret - pc_mux_o = debug_mode_q ? PC_EXCEPTION : PC_URET; - pc_set_o = 1'b1; - exc_pc_mux_o = EXC_PC_DBE; // only used if in debug_mode - end - dret_dec_i: begin - //dret - // this case is only reachable while in debug_mode - pc_mux_o = PC_DRET; - pc_set_o = 1'b1; - debug_mode_n = 1'b0; - end - default:; - endcase - - if (debug_single_step_i && ~debug_mode_q) begin - ctrl_fsm_ns = DBG_TAKEN_IF; - end - end - - // a branch was in ID when trying to go to debug rom. Wait until we can - // determine branch target address (for saving into dpc) before proceeding - DBG_WAIT_BRANCH: - begin - is_decoding_o = 1'b0; - halt_if_o = 1'b1; - - if (branch_taken_ex_i) begin - // there is a branch in the EX stage that is taken - pc_mux_o = PC_BRANCH; - pc_set_o = 1'b1; - end - - ctrl_fsm_ns = DBG_FLUSH; - end - - // We enter this state when we encounter - // 1. ebreak during debug mode - // 2. trigger match - // 3. ebreak with forced entry into debug mode (ebreakm or ebreaku set). - // 4. halt request during decode - // Regular ebreak's go through FLUSH_EX and FLUSH_WB. - // For 1. we don't update dcsr and dpc while for 2., 3., & 4. we do - // dpc is set to the address of ebreak and trigger match - // not to the next instruction's (which is why we save the pc in id). - DBG_TAKEN_ID: - begin - is_decoding_o = 1'b0; - pc_set_o = 1'b1; - pc_mux_o = PC_EXCEPTION; - exc_pc_mux_o = EXC_PC_DBD; - // If not in debug mode then save cause and dpc csrs - // else it was an ebreak in debug mode, so don't update csrs - if (~debug_mode_q) begin - csr_save_cause_o = 1'b1; - csr_save_id_o = 1'b1; - debug_csr_save_o = 1'b1; - if (trigger_match_i) - debug_cause_o = DBG_CAUSE_TRIGGER; // pri 4 (highest) - else if (ebrk_force_debug_mode & ebrk_insn_i) - debug_cause_o = DBG_CAUSE_EBREAK; // pri 3 - else if (debug_req_entry_q) - debug_cause_o = DBG_CAUSE_HALTREQ;// pri 2 and 1 - - end - debug_req_entry_n = 1'b0; - ctrl_fsm_ns = DECODE; - debug_mode_n = 1'b1; - end - - // We enter this state for single stepping - // DPC is set the next instruction to be executed/fetched - DBG_TAKEN_IF: - begin - is_decoding_o = 1'b0; - pc_set_o = 1'b1; - pc_mux_o = PC_EXCEPTION; - exc_pc_mux_o = EXC_PC_DBD; - csr_save_cause_o = 1'b1; - debug_csr_save_o = 1'b1; - if (debug_force_wakeup_q) - debug_cause_o = DBG_CAUSE_HALTREQ; - else if (debug_single_step_i) - debug_cause_o = DBG_CAUSE_STEP; // pri 0 - csr_save_if_o = 1'b1; - ctrl_fsm_ns = DECODE; - debug_mode_n = 1'b1; - debug_force_wakeup_n = 1'b0; - end - - - DBG_FLUSH: - begin - is_decoding_o = 1'b0; - - halt_if_o = 1'b1; - halt_id_o = 1'b1; - - perf_pipeline_stall_o = data_load_event_i; - - if (data_err_i) - begin //data error - // the current LW or SW have been blocked by the PMP - csr_save_ex_o = 1'b1; - csr_save_cause_o = 1'b1; - data_err_ack_o = 1'b1; - //no jump in this stage as we have to wait one cycle to go to Machine Mode - csr_cause_o = {1'b0, data_we_ex_i ? EXC_CAUSE_STORE_FAULT : EXC_CAUSE_LOAD_FAULT}; - ctrl_fsm_ns = FLUSH_WB; - end //data error - else begin - if(debug_mode_q | - trigger_match_i | - (ebrk_force_debug_mode & ebrk_insn_i) | - data_load_event_i | - debug_req_entry_q ) - begin - ctrl_fsm_ns = DBG_TAKEN_ID; - end else - begin - // else must be debug_single_step_i - ctrl_fsm_ns = DBG_TAKEN_IF; - end - end - end - // Debug end - - default: begin - is_decoding_o = 1'b0; - instr_req_o = 1'b0; - ctrl_fsm_ns = RESET; - end - endcase - end - - - -generate - if(PULP_XPULP) begin : gen_hwlp - ////////////////////////////////////////////////////////////////////////////// - // Convert hwlp_jump_o to a pulse - ////////////////////////////////////////////////////////////////////////////// - - // hwlp_jump_o should last one cycle only, as the prefetcher - // reacts immediately. If it last more cycles, the prefetcher - // goes on requesting HWLP_BEGIN more than one time (wrong!). - // This signal is not controlled by id_ready because otherwise, - // in case of stall, the jump would happen at the end of the stall. - - // Make hwlp_jump_o last only one cycle - assign hwlp_jump_o = (hwlp_end_4_id_d && !hwlp_end_4_id_q) ? 1'b1 : 1'b0; - - always_ff @(posedge clk or negedge rst_n) begin - if(!rst_n) begin - hwlp_end_4_id_q <= 1'b0; - end else begin - hwlp_end_4_id_q <= hwlp_end_4_id_d; - end - end - - assign hwlp_end0_eq_pc = hwlp_end_addr_i[0] == pc_id_i; - assign hwlp_end1_eq_pc = hwlp_end_addr_i[1] == pc_id_i; - assign hwlp_counter0_gt_1 = hwlp_counter_i[0] > 1; - assign hwlp_counter1_gt_1 = hwlp_counter_i[1] > 1; - assign hwlp_end0_eq_pc_plus4 = hwlp_end_addr_i[0] == pc_id_i + 4; - assign hwlp_end1_eq_pc_plus4 = hwlp_end_addr_i[1] == pc_id_i + 4; - assign hwlp_start0_leq_pc = hwlp_start_addr_i[0] <= pc_id_i; - assign hwlp_start1_leq_pc = hwlp_start_addr_i[1] <= pc_id_i; - assign hwlp_end0_geq_pc = hwlp_end_addr_i[0] >= pc_id_i; - assign hwlp_end1_geq_pc = hwlp_end_addr_i[1] >= pc_id_i; - assign is_hwlp_body = ((hwlp_start0_leq_pc && hwlp_end0_geq_pc) && hwlp_counter0_gt_1) || ((hwlp_start1_leq_pc && hwlp_end1_geq_pc) && hwlp_counter1_gt_1); - - end else begin : gen_no_hwlp - - assign hwlp_jump_o = 1'b0; - assign hwlp_end_4_id_q = 1'b0; - assign hwlp_end0_eq_pc = 1'b0; - assign hwlp_end1_eq_pc = 1'b0; - assign hwlp_counter0_gt_1 = 1'b0; - assign hwlp_counter1_gt_1 = 1'b0; - assign hwlp_end0_eq_pc_plus4 = 1'b0; - assign hwlp_end1_eq_pc_plus4 = 1'b0; - assign hwlp_start0_leq_pc = 1'b0; - assign hwlp_start1_leq_pc = 1'b0; - assign hwlp_end0_geq_pc = 1'b0; - assign hwlp_end1_geq_pc = 1'b0; - assign is_hwlp_body = 1'b0; - - end - -endgenerate - - ///////////////////////////////////////////////////////////// - // ____ _ _ _ ____ _ _ // - // / ___|| |_ __ _| | | / ___|___ _ __ | |_ _ __ ___ | | // - // \___ \| __/ _` | | | | | / _ \| '_ \| __| '__/ _ \| | // - // ___) | || (_| | | | | |__| (_) | | | | |_| | | (_) | | // - // |____/ \__\__,_|_|_| \____\___/|_| |_|\__|_| \___/|_| // - // // - ///////////////////////////////////////////////////////////// - always_comb - begin - load_stall_o = 1'b0; - deassert_we_o = 1'b0; - - // deassert WE when the core is not decoding instructions - if (~is_decoding_o) - deassert_we_o = 1'b1; - - // deassert WE in case of illegal instruction - if (illegal_insn_i) - deassert_we_o = 1'b1; - - // Stall because of load operation - if ( - ( (data_req_ex_i == 1'b1) && (regfile_we_ex_i == 1'b1) || - (wb_ready_i == 1'b0) && (regfile_we_wb_i == 1'b1) - ) && - ( (reg_d_ex_is_reg_a_i == 1'b1) || (reg_d_ex_is_reg_b_i == 1'b1) || (reg_d_ex_is_reg_c_i == 1'b1) || - (is_decoding_o && (regfile_we_id_i && !data_misaligned_i) && (regfile_waddr_ex_i == regfile_alu_waddr_id_i)) ) - ) - begin - deassert_we_o = 1'b1; - load_stall_o = 1'b1; - end - - // Stall because of jr path - // - always stall if a result is to be forwarded to the PC - // we don't care about in which state the ctrl_fsm is as we deassert_we - // anyway when we are not in DECODE - if ((ctrl_transfer_insn_in_dec_i == BRANCH_JALR) && - (((regfile_we_wb_i == 1'b1) && (reg_d_wb_is_reg_a_i == 1'b1)) || - ((regfile_we_ex_i == 1'b1) && (reg_d_ex_is_reg_a_i == 1'b1)) || - ((regfile_alu_we_fw_i == 1'b1) && (reg_d_alu_is_reg_a_i == 1'b1))) ) - begin - jr_stall_o = 1'b1; - deassert_we_o = 1'b1; - end - else - begin - jr_stall_o = 1'b0; - end - end - - - // stall because of misaligned data access - assign misaligned_stall_o = data_misaligned_i; - - // APU dependency stalls (data hazards) - assign apu_stall_o = apu_read_dep_i | (apu_write_dep_i & ~apu_en_i); - - // Forwarding control unit - always_comb - begin - // default assignements - operand_a_fw_mux_sel_o = SEL_REGFILE; - operand_b_fw_mux_sel_o = SEL_REGFILE; - operand_c_fw_mux_sel_o = SEL_REGFILE; - - // Forwarding WB -> ID - if (regfile_we_wb_i == 1'b1) - begin - if (reg_d_wb_is_reg_a_i == 1'b1) - operand_a_fw_mux_sel_o = SEL_FW_WB; - if (reg_d_wb_is_reg_b_i == 1'b1) - operand_b_fw_mux_sel_o = SEL_FW_WB; - if (reg_d_wb_is_reg_c_i == 1'b1) - operand_c_fw_mux_sel_o = SEL_FW_WB; - end - - // Forwarding EX -> ID - if (regfile_alu_we_fw_i == 1'b1) - begin - if (reg_d_alu_is_reg_a_i == 1'b1) - operand_a_fw_mux_sel_o = SEL_FW_EX; - if (reg_d_alu_is_reg_b_i == 1'b1) - operand_b_fw_mux_sel_o = SEL_FW_EX; - if (reg_d_alu_is_reg_c_i == 1'b1) - operand_c_fw_mux_sel_o = SEL_FW_EX; - end - - // for misaligned memory accesses - if (data_misaligned_i) - begin - operand_a_fw_mux_sel_o = SEL_FW_EX; - operand_b_fw_mux_sel_o = SEL_REGFILE; - end else if (mult_multicycle_i) begin - operand_c_fw_mux_sel_o = SEL_FW_EX; - end - end - - // update registers - always_ff @(posedge clk , negedge rst_n) - begin : UPDATE_REGS - if ( rst_n == 1'b0 ) - begin - ctrl_fsm_cs <= RESET; - jump_done_q <= 1'b0; - data_err_q <= 1'b0; - - debug_mode_q <= 1'b0; - illegal_insn_q <= 1'b0; - - debug_req_entry_q <= 1'b0; - debug_force_wakeup_q <= 1'b0; - end - else - begin - ctrl_fsm_cs <= ctrl_fsm_ns; - - // clear when id is valid (no instruction incoming) - jump_done_q <= jump_done & (~id_ready_i); - - data_err_q <= data_err_i; - - debug_mode_q <= debug_mode_n; - - illegal_insn_q <= illegal_insn_n; - - debug_req_entry_q <= debug_req_entry_n; - debug_force_wakeup_q <= debug_force_wakeup_n; - end - end - - // wakeup from sleep conditions - assign wake_from_sleep_o = irq_wu_ctrl_i || debug_req_pending || debug_mode_q; - - // debug mode - assign debug_mode_o = debug_mode_q; - assign debug_req_pending = debug_req_i || debug_req_q; - - // Do not let p.elw cause core_sleep_o during debug - assign debug_p_elw_no_sleep_o = debug_mode_q || debug_req_q || debug_single_step_i || trigger_match_i; - - // Do not let WFI cause core_sleep_o (but treat as NOP): - // - // - During debug - // - For PULP Cluster (only p.elw can trigger sleep) - - assign debug_wfi_no_sleep_o = debug_mode_q || debug_req_pending || debug_single_step_i || trigger_match_i || PULP_CLUSTER; - - // Gate off wfi - assign wfi_active = wfi_i & ~debug_wfi_no_sleep_o; - - // sticky version of debug_req (must be on clk_ungated_i such that incoming pulse before core is enabled is not missed) - always_ff @(posedge clk_ungated_i, negedge rst_n) - if ( !rst_n ) - debug_req_q <= 1'b0; - else - if( debug_req_i ) - debug_req_q <= 1'b1; - else if( debug_mode_q ) - debug_req_q <= 1'b0; - - // Debug state FSM - always_ff @(posedge clk , negedge rst_n) - begin - if ( rst_n == 1'b0 ) - begin - debug_fsm_cs <= HAVERESET; - end - else - begin - debug_fsm_cs <= debug_fsm_ns; - end - end - - always_comb - begin - debug_fsm_ns = debug_fsm_cs; - - case (debug_fsm_cs) - HAVERESET: - begin - if (debug_mode_n || (ctrl_fsm_ns == FIRST_FETCH)) begin - if (debug_mode_n) begin - debug_fsm_ns = HALTED; - end else begin - debug_fsm_ns = RUNNING; - end - end - end - - RUNNING: - begin - if (debug_mode_n) begin - debug_fsm_ns = HALTED; - end - end - - HALTED: - begin - if (!debug_mode_n) begin - debug_fsm_ns = RUNNING; - end - end - - default: begin - debug_fsm_ns = HAVERESET; - end - endcase - end - - assign debug_havereset_o = debug_fsm_cs[HAVERESET_INDEX]; - assign debug_running_o = debug_fsm_cs[RUNNING_INDEX]; - assign debug_halted_o = debug_fsm_cs[HALTED_INDEX]; - - //---------------------------------------------------------------------------- - // Assertions - //---------------------------------------------------------------------------- - -`ifdef CV32E40P_ASSERT_ON - - // make sure that taken branches do not happen back-to-back, as this is not - // possible without branch prediction in the IF stage - assert property ( - @(posedge clk) (branch_taken_ex_i) |=> (~branch_taken_ex_i) ) else $warning("Two branches back-to-back are taken"); - - // ELW_EXE and IRQ_FLUSH_ELW states are only used for PULP_CLUSTER = 1 - property p_pulp_cluster_only_states; - @(posedge clk) (1'b1) |-> ( !((PULP_CLUSTER == 1'b0) && ((ctrl_fsm_cs == ELW_EXE) || (ctrl_fsm_cs == IRQ_FLUSH_ELW))) ); - endproperty - - a_pulp_cluster_only_states : assert property(p_pulp_cluster_only_states); - - // WAIT_SLEEP and SLEEP states are never used for PULP_CLUSTER = 1 - property p_pulp_cluster_excluded_states; - @(posedge clk) (1'b1) |-> ( !((PULP_CLUSTER == 1'b1) && ((ctrl_fsm_cs == SLEEP) || (ctrl_fsm_cs == WAIT_SLEEP))) ); - endproperty - - a_pulp_cluster_excluded_states : assert property(p_pulp_cluster_excluded_states); - - generate - if (PULP_XPULP) begin : gen_pulp_xpulp_assertions - - // HWLoop 0 and 1 having target address constraints - property p_hwlp_same_target_address; - @(posedge clk) (hwlp_counter_i[1] > 1 && hwlp_counter_i[0] > 1) |-> ( hwlp_end_addr_i[1] >= hwlp_end_addr_i[0] + 8 ); - endproperty - - a_hwlp_same_target_address : assert property(p_hwlp_same_target_address) else $warning("%t, HWLoops target address do not respect constraints", $time); - - end else begin : gen_no_pulp_xpulp_assertions - - property p_no_hwlp; - @(posedge clk) (1'b1) |-> ((pc_mux_o != PC_HWLOOP) && (ctrl_fsm_cs != DECODE_HWLOOP) && - (hwlp_mask_o == 1'b0) && (is_hwlp_illegal == 'b0) && (is_hwlp_body == 'b0) && - (hwlp_start_addr_i == 'b0) && (hwlp_end_addr_i == 'b0) && (hwlp_counter_i[1] == 32'b0) && (hwlp_counter_i[0] == 32'b0) && - (hwlp_dec_cnt_o == 2'b0) && (hwlp_jump_o == 1'b0) && (hwlp_targ_addr_o == 32'b0) && - (hwlp_end0_eq_pc == 1'b0) && (hwlp_end1_eq_pc == 1'b0) && (hwlp_counter0_gt_1 == 1'b0) && (hwlp_counter1_gt_1 == 1'b0) && - (hwlp_end0_eq_pc_plus4 == 1'b0) && (hwlp_end1_eq_pc_plus4 == 1'b0) && (hwlp_start0_leq_pc == 0) && (hwlp_start1_leq_pc == 0) && - (hwlp_end0_geq_pc == 1'b0) && (hwlp_end1_geq_pc == 1'b0) && (hwlp_end_4_id_d == 1'b0) && (hwlp_end_4_id_q == 1'b0)); - endproperty - - a_no_hwlp : assert property(p_no_hwlp); - - end - endgenerate - - // Ensure DBG_TAKEN_IF can only be enterred if in single step mode or woken - // up from sleep by debug_req_i - - a_single_step_dbg_taken_if : assert property (@(posedge clk) disable iff (!rst_n) (ctrl_fsm_ns==DBG_TAKEN_IF) |-> ((~debug_mode_q && debug_single_step_i) || debug_force_wakeup_n)); - - // Ensure DBG_FLUSH state is only one cycle. This implies that cause is either trigger, debug_req_entry, or ebreak - a_dbg_flush : assert property (@(posedge clk) disable iff (!rst_n) (ctrl_fsm_cs==DBG_FLUSH) |-> (ctrl_fsm_ns!=DBG_FLUSH) ); - - // Ensure that debug state outputs are one-hot - a_debug_state_onehot : assert property (@(posedge clk) $onehot({debug_havereset_o, debug_running_o, debug_halted_o})); - - // Ensure that debug_halted_o equals debug_mode_q - a_debug_halted_equals_debug_mode : assert property (@(posedge clk) disable iff (!rst_n) (1'b1) |-> (debug_mode_q == debug_halted_o)); - - // Ensure ID always ready in FIRST_FETCH state - a_first_fetch_id_ready : assert property (@(posedge clk) disable iff (!rst_n) (ctrl_fsm_cs == FIRST_FETCH) |-> (id_ready_i == 1'b1)); - - // Ensure that the only way to get to DBG_TAKEN_IF from DBG_FLUSH is if debug_single_step_i is asserted - a_dbg_flush_to_taken_if : assert property (@(posedge clk) disable iff (!rst_n) (ctrl_fsm_cs == DBG_FLUSH) && (ctrl_fsm_ns == DBG_TAKEN_IF) |-> debug_single_step_i); - -`endif - -endmodule // cv32e40p_controller diff --git a/src/UWE_projectCode/RTL分析代码/cv32e40p_cs_registers.sv b/src/UWE_projectCode/RTL分析代码/cv32e40p_cs_registers.sv deleted file mode 100644 index a46aab1..0000000 --- a/src/UWE_projectCode/RTL分析代码/cv32e40p_cs_registers.sv +++ /dev/null @@ -1,1587 +0,0 @@ -// Copyright 2018 ETH Zurich and University of Bologna. -// Copyright and related rights are licensed under the Solderpad Hardware -// License, Version 0.51 (the "License"); you may not use this file except in -// compliance with the License. You may obtain a copy of the License at -// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law -// or agreed to in writing, software, hardware and materials distributed under -// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -//////////////////////////////////////////////////////////////////////////////// -// Engineer: Sven Stucki - svstucki@student.ethz.ch // -// // -// Additional contributions by: // -// Andreas Traber - atraber@iis.ee.ethz.ch // -// Michael Gautschi - gautschi@iis.ee.ethz.ch // -// Davide Schiavone - pschiavo@iis.ee.ethz.ch // -// Andrea Bettati - andrea.bettati@studenti.unipr.it // -// // -// Design Name: Control and Status Registers // -// Project Name: RI5CY // -// Language: SystemVerilog // -// // -// Description: Control and Status Registers (CSRs) loosely following the // -// RiscV draft priviledged instruction set spec (v1.9) // -// Added Floating point support // -// // -//////////////////////////////////////////////////////////////////////////////// - -module cv32e40p_cs_registers - import cv32e40p_pkg::*; -#( - parameter N_HWLP = 2, - parameter N_HWLP_BITS = $clog2(N_HWLP), - parameter APU = 0, - parameter A_EXTENSION = 0, - parameter FPU = 0, - parameter PULP_SECURE = 0, - parameter USE_PMP = 0, - parameter N_PMP_ENTRIES = 16, - parameter NUM_MHPMCOUNTERS = 1, - parameter PULP_XPULP = 0, - parameter PULP_CLUSTER = 0, - parameter DEBUG_TRIGGER_EN = 1 -) ( - // Clock and Reset - input logic clk, - input logic rst_n, - - // Hart ID - input logic [31:0] hart_id_i, - output logic [23:0] mtvec_o, - output logic [23:0] utvec_o, - output logic [ 1:0] mtvec_mode_o, - output logic [ 1:0] utvec_mode_o, - - // Used for mtvec address - input logic [31:0] mtvec_addr_i, - input logic csr_mtvec_init_i, - - // Interface to registers (SRAM like) - input csr_num_e csr_addr_i, - input logic [31:0] csr_wdata_i, - input csr_opcode_e csr_op_i, - output logic [31:0] csr_rdata_o, - - output logic [ 2:0] frm_o, - input logic [C_FFLAG-1:0] fflags_i, - input logic fflags_we_i, - - // Interrupts - output logic [31:0] mie_bypass_o, - input logic [31:0] mip_i, - output logic m_irq_enable_o, - output logic u_irq_enable_o, - - //csr_irq_sec_i is always 0 if PULP_SECURE is zero - input logic csr_irq_sec_i, - output logic sec_lvl_o, - output logic [31:0] mepc_o, - output logic [31:0] uepc_o, - //mcounteren_o is always 0 if PULP_SECURE is zero - output logic [31:0] mcounteren_o, - - // debug - input logic debug_mode_i, - input logic [ 2:0] debug_cause_i, - input logic debug_csr_save_i, - output logic [31:0] depc_o, - output logic debug_single_step_o, - output logic debug_ebreakm_o, - output logic debug_ebreaku_o, - output logic trigger_match_o, - - - output logic [N_PMP_ENTRIES-1:0][31:0] pmp_addr_o, - output logic [N_PMP_ENTRIES-1:0][ 7:0] pmp_cfg_o, - - output PrivLvl_t priv_lvl_o, - - input logic [31:0] pc_if_i, - input logic [31:0] pc_id_i, - input logic [31:0] pc_ex_i, - - input logic csr_save_if_i, - input logic csr_save_id_i, - input logic csr_save_ex_i, - - input logic csr_restore_mret_i, - input logic csr_restore_uret_i, - - input logic csr_restore_dret_i, - //coming from controller - input logic [ 5:0] csr_cause_i, - //coming from controller - input logic csr_save_cause_i, - // Hardware loops - input logic [N_HWLP-1:0][31:0] hwlp_start_i, - input logic [N_HWLP-1:0][31:0] hwlp_end_i, - input logic [N_HWLP-1:0][31:0] hwlp_cnt_i, - - output logic [ 31:0] hwlp_data_o, - output logic [N_HWLP_BITS-1:0] hwlp_regid_o, - output logic [ 2:0] hwlp_we_o, - - // Performance Counters - input logic mhpmevent_minstret_i, - input logic mhpmevent_load_i, - input logic mhpmevent_store_i, - input logic mhpmevent_jump_i, // Jump instruction retired (j, jr, jal, jalr) - input logic mhpmevent_branch_i, // Branch instruction retired (beq, bne, etc.) - input logic mhpmevent_branch_taken_i, // Branch instruction taken - input logic mhpmevent_compressed_i, - input logic mhpmevent_jr_stall_i, - input logic mhpmevent_imiss_i, - input logic mhpmevent_ld_stall_i, - input logic mhpmevent_pipe_stall_i, - input logic apu_typeconflict_i, - input logic apu_contention_i, - input logic apu_dep_i, - input logic apu_wb_i -); - - localparam NUM_HPM_EVENTS = 16; - - localparam MTVEC_MODE = 2'b01; - - localparam MAX_N_PMP_ENTRIES = 16; - localparam MAX_N_PMP_CFG = 4; - localparam N_PMP_CFG = N_PMP_ENTRIES % 4 == 0 ? N_PMP_ENTRIES / 4 : N_PMP_ENTRIES / 4 + 1; - - localparam MSTATUS_UIE_BIT = 0; - localparam MSTATUS_SIE_BIT = 1; - localparam MSTATUS_MIE_BIT = 3; - localparam MSTATUS_UPIE_BIT = 4; - localparam MSTATUS_SPIE_BIT = 5; - localparam MSTATUS_MPIE_BIT = 7; - localparam MSTATUS_SPP_BIT = 8; - localparam MSTATUS_MPP_BIT_HIGH = 12; - localparam MSTATUS_MPP_BIT_LOW = 11; - localparam MSTATUS_MPRV_BIT = 17; - - // misa - localparam logic [1:0] MXL = 2'd1; // M-XLEN: XLEN in M-Mode for RV32 - localparam logic [31:0] MISA_VALUE = (32'(A_EXTENSION) << 0) // A - Atomic Instructions extension - | (1 << 2) // C - Compressed extension - | (0 << 3) // D - Double precision floating-point extension - | (0 << 4) // E - RV32E base ISA - | (32'(FPU) << 5) // F - Single precision floating-point extension - | (1 << 8) // I - RV32I/64I/128I base ISA - | (1 << 12) // M - Integer Multiply/Divide extension - | (0 << 13) // N - User level interrupts supported - | (0 << 18) // S - Supervisor mode implemented - | (32'(PULP_SECURE) << 20) // U - User mode implemented - | (32'(PULP_XPULP || PULP_CLUSTER) << 23) // X - Non-standard extensions present - | (32'(MXL) << 30); // M-XLEN - - localparam MHPMCOUNTER_WIDTH = 64; - - // This local parameter when set to 1 makes the Perf Counters not compliant with RISC-V - // as it does not implement mcycle and minstret - // but only HPMCOUNTERs (depending on NUM_MHPMCOUNTERS) - localparam PULP_PERF_COUNTERS = 0; - - typedef struct packed { - logic uie; - // logic sie; - unimplemented, hardwired to '0 - // logic hie; - unimplemented, hardwired to '0 - logic mie; - logic upie; - // logic spie; - unimplemented, hardwired to '0 - // logic hpie; - unimplemented, hardwired to '0 - logic mpie; - // logic spp; - unimplemented, hardwired to '0 - // logic[1:0] hpp; - unimplemented, hardwired to '0 - PrivLvl_t mpp; - logic mprv; - } Status_t; - - typedef struct packed { - logic [31:28] xdebugver; - logic [27:16] zero2; - logic ebreakm; - logic zero1; - logic ebreaks; - logic ebreaku; - logic stepie; - logic stopcount; - logic stoptime; - logic [8:6] cause; - logic zero0; - logic mprven; - logic nmip; - logic step; - PrivLvl_t prv; - } Dcsr_t; - - typedef struct packed { - logic [MAX_N_PMP_ENTRIES-1:0][31:0] pmpaddr; - logic [MAX_N_PMP_CFG-1:0][31:0] pmpcfg_packed; - logic [MAX_N_PMP_ENTRIES-1:0][7:0] pmpcfg; - } Pmp_t; - - // CSR update logic - logic [31:0] csr_wdata_int; - logic [31:0] csr_rdata_int; - logic csr_we_int; - logic [C_RM-1:0] frm_q, frm_n; - logic [C_FFLAG-1:0] fflags_q, fflags_n; - - // Interrupt control signals - logic [31:0] mepc_q, mepc_n; - logic [31:0] uepc_q, uepc_n; - // Trigger - logic [31:0] tmatch_control_rdata; - logic [31:0] tmatch_value_rdata; - logic [15:0] tinfo_types; - // Debug - Dcsr_t dcsr_q, dcsr_n; - logic [31:0] depc_q, depc_n; - logic [31:0] dscratch0_q, dscratch0_n; - logic [31:0] dscratch1_q, dscratch1_n; - logic [31:0] mscratch_q, mscratch_n; - - logic [31:0] exception_pc; - Status_t mstatus_q, mstatus_n; - logic [5:0] mcause_q, mcause_n; - logic [5:0] ucause_q, ucause_n; - //not implemented yet - logic [23:0] mtvec_n, mtvec_q; - logic [23:0] utvec_n, utvec_q; - logic [1:0] mtvec_mode_n, mtvec_mode_q; - logic [1:0] utvec_mode_n, utvec_mode_q; - - logic [31:0] mip; // Bits are masked according to IRQ_MASK - logic [31:0] mie_q, mie_n; // Bits are masked according to IRQ_MASK - - logic [31:0] csr_mie_wdata; - logic csr_mie_we; - - logic is_irq; - PrivLvl_t priv_lvl_n, priv_lvl_q; - Pmp_t pmp_reg_q, pmp_reg_n; - //clock gating for pmp regs - logic [MAX_N_PMP_ENTRIES-1:0] pmpaddr_we; - logic [MAX_N_PMP_ENTRIES-1:0] pmpcfg_we; - - // Performance Counter Signals - logic [ 31:0][MHPMCOUNTER_WIDTH-1:0] mhpmcounter_q; // performance counters - logic [31:0][31:0] mhpmevent_q, mhpmevent_n; // event enable - logic [31:0] mcounteren_q, mcounteren_n; // user mode counter enable - logic [31:0] mcountinhibit_q, mcountinhibit_n; // performance counter enable - logic [NUM_HPM_EVENTS-1:0] hpm_events; // events for performance counters - logic [31:0][MHPMCOUNTER_WIDTH-1:0] mhpmcounter_increment; // increment of mhpmcounter_q - logic [31:0] mhpmcounter_write_lower; // write 32 lower bits of mhpmcounter_q - logic [31:0] mhpmcounter_write_upper; // write 32 upper bits mhpmcounter_q - logic [31:0] mhpmcounter_write_increment; // write increment of mhpmcounter_q - - assign is_irq = csr_cause_i[5]; - - // mip CSR - assign mip = mip_i; - - // mie_n is used instead of mie_q such that a CSR write to the MIE register can - // affect the instruction immediately following it. - - // MIE CSR operation logic - always_comb begin - csr_mie_wdata = csr_wdata_i; - csr_mie_we = 1'b1; - - case (csr_op_i) - CSR_OP_WRITE: csr_mie_wdata = csr_wdata_i; - CSR_OP_SET: csr_mie_wdata = csr_wdata_i | mie_q; - CSR_OP_CLEAR: csr_mie_wdata = (~csr_wdata_i) & mie_q; - CSR_OP_READ: begin - csr_mie_wdata = csr_wdata_i; - csr_mie_we = 1'b0; - end - endcase - end - - assign mie_bypass_o = ((csr_addr_i == CSR_MIE) && csr_mie_we) ? csr_mie_wdata & IRQ_MASK : mie_q; - - //////////////////////////////////////////// - // ____ ____ ____ ____ // - // / ___/ ___|| _ \ | _ \ ___ __ _ // - // | | \___ \| |_) | | |_) / _ \/ _` | // - // | |___ ___) | _ < | _ < __/ (_| | // - // \____|____/|_| \_\ |_| \_\___|\__, | // - // |___/ // - //////////////////////////////////////////// - - // NOTE!!!: Any new CSR register added in this file must also be - // added to the valid CSR register list cv32e40p_decoder.v - - genvar j; - - - if (PULP_SECURE == 1) begin : gen_pulp_secure_read_logic - // read logic - always_comb begin - case (csr_addr_i) - // fcsr: Floating-Point Control and Status Register (frm + fflags). - CSR_FFLAGS: csr_rdata_int = (FPU == 1) ? {27'b0, fflags_q} : '0; - CSR_FRM: csr_rdata_int = (FPU == 1) ? {29'b0, frm_q} : '0; - CSR_FCSR: csr_rdata_int = (FPU == 1) ? {24'b0, frm_q, fflags_q} : '0; - - // mstatus - CSR_MSTATUS: - csr_rdata_int = { - 14'b0, - mstatus_q.mprv, - 4'b0, - mstatus_q.mpp, - 3'b0, - mstatus_q.mpie, - 2'h0, - mstatus_q.upie, - mstatus_q.mie, - 2'h0, - mstatus_q.uie - }; - - // misa: machine isa register - CSR_MISA: csr_rdata_int = MISA_VALUE; - - // mie: machine interrupt enable - CSR_MIE: begin - csr_rdata_int = mie_q; - end - - // mtvec: machine trap-handler base address - CSR_MTVEC: csr_rdata_int = {mtvec_q, 6'h0, mtvec_mode_q}; - // mscratch: machine scratch - CSR_MSCRATCH: csr_rdata_int = mscratch_q; - // mepc: exception program counter - CSR_MEPC: csr_rdata_int = mepc_q; - // mcause: exception cause - CSR_MCAUSE: csr_rdata_int = {mcause_q[5], 26'b0, mcause_q[4:0]}; - // mip: interrupt pending - CSR_MIP: begin - csr_rdata_int = mip; - end - - // mhartid: unique hardware thread id - CSR_MHARTID: csr_rdata_int = hart_id_i; - - // mvendorid: Machine Vendor ID - CSR_MVENDORID: csr_rdata_int = {MVENDORID_BANK, MVENDORID_OFFSET}; - - // marchid: Machine Architecture ID - CSR_MARCHID: csr_rdata_int = MARCHID; - - // unimplemented, read 0 CSRs - CSR_MIMPID, CSR_MTVAL: csr_rdata_int = 'b0; - - // mcounteren: Machine Counter-Enable - CSR_MCOUNTEREN: csr_rdata_int = mcounteren_q; - - CSR_TSELECT, CSR_TDATA3, CSR_MCONTEXT, CSR_SCONTEXT: csr_rdata_int = 'b0; // Always read 0 - CSR_TDATA1: csr_rdata_int = tmatch_control_rdata; - CSR_TDATA2: csr_rdata_int = tmatch_value_rdata; - CSR_TINFO: csr_rdata_int = tinfo_types; - - CSR_DCSR: csr_rdata_int = dcsr_q; // - CSR_DPC: csr_rdata_int = depc_q; - CSR_DSCRATCH0: csr_rdata_int = dscratch0_q; // - CSR_DSCRATCH1: csr_rdata_int = dscratch1_q; // - - // Hardware Performance Monitor - CSR_MCYCLE, - CSR_MINSTRET, - CSR_MHPMCOUNTER3, - CSR_MHPMCOUNTER4, CSR_MHPMCOUNTER5, CSR_MHPMCOUNTER6, CSR_MHPMCOUNTER7, - CSR_MHPMCOUNTER8, CSR_MHPMCOUNTER9, CSR_MHPMCOUNTER10, CSR_MHPMCOUNTER11, - CSR_MHPMCOUNTER12, CSR_MHPMCOUNTER13, CSR_MHPMCOUNTER14, CSR_MHPMCOUNTER15, - CSR_MHPMCOUNTER16, CSR_MHPMCOUNTER17, CSR_MHPMCOUNTER18, CSR_MHPMCOUNTER19, - CSR_MHPMCOUNTER20, CSR_MHPMCOUNTER21, CSR_MHPMCOUNTER22, CSR_MHPMCOUNTER23, - CSR_MHPMCOUNTER24, CSR_MHPMCOUNTER25, CSR_MHPMCOUNTER26, CSR_MHPMCOUNTER27, - CSR_MHPMCOUNTER28, CSR_MHPMCOUNTER29, CSR_MHPMCOUNTER30, CSR_MHPMCOUNTER31, - CSR_CYCLE, - CSR_INSTRET, - CSR_HPMCOUNTER3, - CSR_HPMCOUNTER4, CSR_HPMCOUNTER5, CSR_HPMCOUNTER6, CSR_HPMCOUNTER7, - CSR_HPMCOUNTER8, CSR_HPMCOUNTER9, CSR_HPMCOUNTER10, CSR_HPMCOUNTER11, - CSR_HPMCOUNTER12, CSR_HPMCOUNTER13, CSR_HPMCOUNTER14, CSR_HPMCOUNTER15, - CSR_HPMCOUNTER16, CSR_HPMCOUNTER17, CSR_HPMCOUNTER18, CSR_HPMCOUNTER19, - CSR_HPMCOUNTER20, CSR_HPMCOUNTER21, CSR_HPMCOUNTER22, CSR_HPMCOUNTER23, - CSR_HPMCOUNTER24, CSR_HPMCOUNTER25, CSR_HPMCOUNTER26, CSR_HPMCOUNTER27, - CSR_HPMCOUNTER28, CSR_HPMCOUNTER29, CSR_HPMCOUNTER30, CSR_HPMCOUNTER31: - csr_rdata_int = mhpmcounter_q[csr_addr_i[4:0]][31:0]; - - CSR_MCYCLEH, - CSR_MINSTRETH, - CSR_MHPMCOUNTER3H, - CSR_MHPMCOUNTER4H, CSR_MHPMCOUNTER5H, CSR_MHPMCOUNTER6H, CSR_MHPMCOUNTER7H, - CSR_MHPMCOUNTER8H, CSR_MHPMCOUNTER9H, CSR_MHPMCOUNTER10H, CSR_MHPMCOUNTER11H, - CSR_MHPMCOUNTER12H, CSR_MHPMCOUNTER13H, CSR_MHPMCOUNTER14H, CSR_MHPMCOUNTER15H, - CSR_MHPMCOUNTER16H, CSR_MHPMCOUNTER17H, CSR_MHPMCOUNTER18H, CSR_MHPMCOUNTER19H, - CSR_MHPMCOUNTER20H, CSR_MHPMCOUNTER21H, CSR_MHPMCOUNTER22H, CSR_MHPMCOUNTER23H, - CSR_MHPMCOUNTER24H, CSR_MHPMCOUNTER25H, CSR_MHPMCOUNTER26H, CSR_MHPMCOUNTER27H, - CSR_MHPMCOUNTER28H, CSR_MHPMCOUNTER29H, CSR_MHPMCOUNTER30H, CSR_MHPMCOUNTER31H, - CSR_CYCLEH, - CSR_INSTRETH, - CSR_HPMCOUNTER3H, - CSR_HPMCOUNTER4H, CSR_HPMCOUNTER5H, CSR_HPMCOUNTER6H, CSR_HPMCOUNTER7H, - CSR_HPMCOUNTER8H, CSR_HPMCOUNTER9H, CSR_HPMCOUNTER10H, CSR_HPMCOUNTER11H, - CSR_HPMCOUNTER12H, CSR_HPMCOUNTER13H, CSR_HPMCOUNTER14H, CSR_HPMCOUNTER15H, - CSR_HPMCOUNTER16H, CSR_HPMCOUNTER17H, CSR_HPMCOUNTER18H, CSR_HPMCOUNTER19H, - CSR_HPMCOUNTER20H, CSR_HPMCOUNTER21H, CSR_HPMCOUNTER22H, CSR_HPMCOUNTER23H, - CSR_HPMCOUNTER24H, CSR_HPMCOUNTER25H, CSR_HPMCOUNTER26H, CSR_HPMCOUNTER27H, - CSR_HPMCOUNTER28H, CSR_HPMCOUNTER29H, CSR_HPMCOUNTER30H, CSR_HPMCOUNTER31H: - csr_rdata_int = mhpmcounter_q[csr_addr_i[4:0]][63:32]; - - CSR_MCOUNTINHIBIT: csr_rdata_int = mcountinhibit_q; - - CSR_MHPMEVENT3, - CSR_MHPMEVENT4, CSR_MHPMEVENT5, CSR_MHPMEVENT6, CSR_MHPMEVENT7, - CSR_MHPMEVENT8, CSR_MHPMEVENT9, CSR_MHPMEVENT10, CSR_MHPMEVENT11, - CSR_MHPMEVENT12, CSR_MHPMEVENT13, CSR_MHPMEVENT14, CSR_MHPMEVENT15, - CSR_MHPMEVENT16, CSR_MHPMEVENT17, CSR_MHPMEVENT18, CSR_MHPMEVENT19, - CSR_MHPMEVENT20, CSR_MHPMEVENT21, CSR_MHPMEVENT22, CSR_MHPMEVENT23, - CSR_MHPMEVENT24, CSR_MHPMEVENT25, CSR_MHPMEVENT26, CSR_MHPMEVENT27, - CSR_MHPMEVENT28, CSR_MHPMEVENT29, CSR_MHPMEVENT30, CSR_MHPMEVENT31: - csr_rdata_int = mhpmevent_q[csr_addr_i[4:0]]; - - // hardware loops (not official) - CSR_LPSTART0: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_start_i[0]; - CSR_LPEND0: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_end_i[0]; - CSR_LPCOUNT0: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_cnt_i[0]; - CSR_LPSTART1: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_start_i[1]; - CSR_LPEND1: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_end_i[1]; - CSR_LPCOUNT1: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_cnt_i[1]; - - // PMP config registers - CSR_PMPCFG0: csr_rdata_int = USE_PMP ? pmp_reg_q.pmpcfg_packed[0] : '0; - CSR_PMPCFG1: csr_rdata_int = USE_PMP ? pmp_reg_q.pmpcfg_packed[1] : '0; - CSR_PMPCFG2: csr_rdata_int = USE_PMP ? pmp_reg_q.pmpcfg_packed[2] : '0; - CSR_PMPCFG3: csr_rdata_int = USE_PMP ? pmp_reg_q.pmpcfg_packed[3] : '0; - - CSR_PMPADDR0, CSR_PMPADDR1, CSR_PMPADDR2, CSR_PMPADDR3, - CSR_PMPADDR4, CSR_PMPADDR5, CSR_PMPADDR6, CSR_PMPADDR7, - CSR_PMPADDR8, CSR_PMPADDR9, CSR_PMPADDR10, CSR_PMPADDR11, - CSR_PMPADDR12, CSR_PMPADDR13, CSR_PMPADDR14, CSR_PMPADDR15 : - csr_rdata_int = USE_PMP ? pmp_reg_q.pmpaddr[csr_addr_i[3:0]] : '0; - - /* USER CSR */ - // ustatus - CSR_USTATUS: csr_rdata_int = {27'b0, mstatus_q.upie, 3'h0, mstatus_q.uie}; - // utvec: user trap-handler base address - CSR_UTVEC: csr_rdata_int = {utvec_q, 6'h0, utvec_mode_q}; - // duplicated mhartid: unique hardware thread id (not official) - CSR_UHARTID: csr_rdata_int = !PULP_XPULP ? 'b0 : hart_id_i; - // uepc: exception program counter - CSR_UEPC: csr_rdata_int = uepc_q; - // ucause: exception cause - CSR_UCAUSE: csr_rdata_int = {ucause_q[5], 26'h0, ucause_q[4:0]}; - - // current priv level (not official) - CSR_PRIVLV: csr_rdata_int = !PULP_XPULP ? 'b0 : {30'h0, priv_lvl_q}; - - default: csr_rdata_int = '0; - endcase - end - end else begin : gen_no_pulp_secure_read_logic // PULP_SECURE == 0 - // read logic - always_comb begin - - case (csr_addr_i) - // fcsr: Floating-Point Control and Status Register (frm + fflags). - CSR_FFLAGS: csr_rdata_int = (FPU == 1) ? {27'b0, fflags_q} : '0; - CSR_FRM: csr_rdata_int = (FPU == 1) ? {29'b0, frm_q} : '0; - CSR_FCSR: csr_rdata_int = (FPU == 1) ? {24'b0, frm_q, fflags_q} : '0; - // mstatus: always M-mode, contains IE bit - CSR_MSTATUS: - csr_rdata_int = { - 14'b0, - mstatus_q.mprv, - 4'b0, - mstatus_q.mpp, - 3'b0, - mstatus_q.mpie, - 2'h0, - mstatus_q.upie, - mstatus_q.mie, - 2'h0, - mstatus_q.uie - }; - // misa: machine isa register - CSR_MISA: csr_rdata_int = MISA_VALUE; - // mie: machine interrupt enable - CSR_MIE: begin - csr_rdata_int = mie_q; - end - - // mtvec: machine trap-handler base address - CSR_MTVEC: csr_rdata_int = {mtvec_q, 6'h0, mtvec_mode_q}; - // mscratch: machine scratch - CSR_MSCRATCH: csr_rdata_int = mscratch_q; - // mepc: exception program counter - CSR_MEPC: csr_rdata_int = mepc_q; - // mcause: exception cause - CSR_MCAUSE: csr_rdata_int = {mcause_q[5], 26'b0, mcause_q[4:0]}; - // mip: interrupt pending - CSR_MIP: begin - csr_rdata_int = mip; - end - // mhartid: unique hardware thread id - CSR_MHARTID: csr_rdata_int = hart_id_i; - - // mvendorid: Machine Vendor ID - CSR_MVENDORID: csr_rdata_int = {MVENDORID_BANK, MVENDORID_OFFSET}; - - // marchid: Machine Architecture ID - CSR_MARCHID: csr_rdata_int = MARCHID; - - // unimplemented, read 0 CSRs - CSR_MIMPID, CSR_MTVAL: csr_rdata_int = 'b0; - - CSR_TSELECT, CSR_TDATA3, CSR_MCONTEXT, CSR_SCONTEXT: csr_rdata_int = 'b0; // Always read 0 - CSR_TDATA1: csr_rdata_int = tmatch_control_rdata; - CSR_TDATA2: csr_rdata_int = tmatch_value_rdata; - CSR_TINFO: csr_rdata_int = tinfo_types; - - CSR_DCSR: csr_rdata_int = dcsr_q; // - CSR_DPC: csr_rdata_int = depc_q; - CSR_DSCRATCH0: csr_rdata_int = dscratch0_q; // - CSR_DSCRATCH1: csr_rdata_int = dscratch1_q; // - - // Hardware Performance Monitor - CSR_MCYCLE, - CSR_MINSTRET, - CSR_MHPMCOUNTER3, - CSR_MHPMCOUNTER4, CSR_MHPMCOUNTER5, CSR_MHPMCOUNTER6, CSR_MHPMCOUNTER7, - CSR_MHPMCOUNTER8, CSR_MHPMCOUNTER9, CSR_MHPMCOUNTER10, CSR_MHPMCOUNTER11, - CSR_MHPMCOUNTER12, CSR_MHPMCOUNTER13, CSR_MHPMCOUNTER14, CSR_MHPMCOUNTER15, - CSR_MHPMCOUNTER16, CSR_MHPMCOUNTER17, CSR_MHPMCOUNTER18, CSR_MHPMCOUNTER19, - CSR_MHPMCOUNTER20, CSR_MHPMCOUNTER21, CSR_MHPMCOUNTER22, CSR_MHPMCOUNTER23, - CSR_MHPMCOUNTER24, CSR_MHPMCOUNTER25, CSR_MHPMCOUNTER26, CSR_MHPMCOUNTER27, - CSR_MHPMCOUNTER28, CSR_MHPMCOUNTER29, CSR_MHPMCOUNTER30, CSR_MHPMCOUNTER31, - CSR_CYCLE, - CSR_INSTRET, - CSR_HPMCOUNTER3, - CSR_HPMCOUNTER4, CSR_HPMCOUNTER5, CSR_HPMCOUNTER6, CSR_HPMCOUNTER7, - CSR_HPMCOUNTER8, CSR_HPMCOUNTER9, CSR_HPMCOUNTER10, CSR_HPMCOUNTER11, - CSR_HPMCOUNTER12, CSR_HPMCOUNTER13, CSR_HPMCOUNTER14, CSR_HPMCOUNTER15, - CSR_HPMCOUNTER16, CSR_HPMCOUNTER17, CSR_HPMCOUNTER18, CSR_HPMCOUNTER19, - CSR_HPMCOUNTER20, CSR_HPMCOUNTER21, CSR_HPMCOUNTER22, CSR_HPMCOUNTER23, - CSR_HPMCOUNTER24, CSR_HPMCOUNTER25, CSR_HPMCOUNTER26, CSR_HPMCOUNTER27, - CSR_HPMCOUNTER28, CSR_HPMCOUNTER29, CSR_HPMCOUNTER30, CSR_HPMCOUNTER31: - csr_rdata_int = mhpmcounter_q[csr_addr_i[4:0]][31:0]; - - CSR_MCYCLEH, - CSR_MINSTRETH, - CSR_MHPMCOUNTER3H, - CSR_MHPMCOUNTER4H, CSR_MHPMCOUNTER5H, CSR_MHPMCOUNTER6H, CSR_MHPMCOUNTER7H, - CSR_MHPMCOUNTER8H, CSR_MHPMCOUNTER9H, CSR_MHPMCOUNTER10H, CSR_MHPMCOUNTER11H, - CSR_MHPMCOUNTER12H, CSR_MHPMCOUNTER13H, CSR_MHPMCOUNTER14H, CSR_MHPMCOUNTER15H, - CSR_MHPMCOUNTER16H, CSR_MHPMCOUNTER17H, CSR_MHPMCOUNTER18H, CSR_MHPMCOUNTER19H, - CSR_MHPMCOUNTER20H, CSR_MHPMCOUNTER21H, CSR_MHPMCOUNTER22H, CSR_MHPMCOUNTER23H, - CSR_MHPMCOUNTER24H, CSR_MHPMCOUNTER25H, CSR_MHPMCOUNTER26H, CSR_MHPMCOUNTER27H, - CSR_MHPMCOUNTER28H, CSR_MHPMCOUNTER29H, CSR_MHPMCOUNTER30H, CSR_MHPMCOUNTER31H, - CSR_CYCLEH, - CSR_INSTRETH, - CSR_HPMCOUNTER3H, - CSR_HPMCOUNTER4H, CSR_HPMCOUNTER5H, CSR_HPMCOUNTER6H, CSR_HPMCOUNTER7H, - CSR_HPMCOUNTER8H, CSR_HPMCOUNTER9H, CSR_HPMCOUNTER10H, CSR_HPMCOUNTER11H, - CSR_HPMCOUNTER12H, CSR_HPMCOUNTER13H, CSR_HPMCOUNTER14H, CSR_HPMCOUNTER15H, - CSR_HPMCOUNTER16H, CSR_HPMCOUNTER17H, CSR_HPMCOUNTER18H, CSR_HPMCOUNTER19H, - CSR_HPMCOUNTER20H, CSR_HPMCOUNTER21H, CSR_HPMCOUNTER22H, CSR_HPMCOUNTER23H, - CSR_HPMCOUNTER24H, CSR_HPMCOUNTER25H, CSR_HPMCOUNTER26H, CSR_HPMCOUNTER27H, - CSR_HPMCOUNTER28H, CSR_HPMCOUNTER29H, CSR_HPMCOUNTER30H, CSR_HPMCOUNTER31H: - csr_rdata_int = (MHPMCOUNTER_WIDTH == 64) ? mhpmcounter_q[csr_addr_i[4:0]][63:32] : '0; - - CSR_MCOUNTINHIBIT: csr_rdata_int = mcountinhibit_q; - - CSR_MHPMEVENT3, - CSR_MHPMEVENT4, CSR_MHPMEVENT5, CSR_MHPMEVENT6, CSR_MHPMEVENT7, - CSR_MHPMEVENT8, CSR_MHPMEVENT9, CSR_MHPMEVENT10, CSR_MHPMEVENT11, - CSR_MHPMEVENT12, CSR_MHPMEVENT13, CSR_MHPMEVENT14, CSR_MHPMEVENT15, - CSR_MHPMEVENT16, CSR_MHPMEVENT17, CSR_MHPMEVENT18, CSR_MHPMEVENT19, - CSR_MHPMEVENT20, CSR_MHPMEVENT21, CSR_MHPMEVENT22, CSR_MHPMEVENT23, - CSR_MHPMEVENT24, CSR_MHPMEVENT25, CSR_MHPMEVENT26, CSR_MHPMEVENT27, - CSR_MHPMEVENT28, CSR_MHPMEVENT29, CSR_MHPMEVENT30, CSR_MHPMEVENT31: - csr_rdata_int = mhpmevent_q[csr_addr_i[4:0]]; - - // hardware loops (not official) - CSR_LPSTART0: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_start_i[0]; - CSR_LPEND0: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_end_i[0]; - CSR_LPCOUNT0: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_cnt_i[0]; - CSR_LPSTART1: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_start_i[1]; - CSR_LPEND1: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_end_i[1]; - CSR_LPCOUNT1: csr_rdata_int = !PULP_XPULP ? 'b0 : hwlp_cnt_i[1]; - - /* USER CSR */ - // dublicated mhartid: unique hardware thread id (not official) - CSR_UHARTID: csr_rdata_int = !PULP_XPULP ? 'b0 : hart_id_i; - // current priv level (not official) - CSR_PRIVLV: csr_rdata_int = !PULP_XPULP ? 'b0 : {30'h0, priv_lvl_q}; - default: csr_rdata_int = '0; - endcase - end - end //PULP_SECURE - - if (PULP_SECURE == 1) begin : gen_pulp_secure_write_logic - // write logic - always_comb begin - fflags_n = fflags_q; - frm_n = frm_q; - mscratch_n = mscratch_q; - mepc_n = mepc_q; - uepc_n = uepc_q; - depc_n = depc_q; - dcsr_n = dcsr_q; - dscratch0_n = dscratch0_q; - dscratch1_n = dscratch1_q; - - mstatus_n = mstatus_q; - mcause_n = mcause_q; - ucause_n = ucause_q; - hwlp_we_o = '0; - hwlp_regid_o = '0; - exception_pc = pc_id_i; - priv_lvl_n = priv_lvl_q; - mtvec_n = csr_mtvec_init_i ? mtvec_addr_i[31:8] : mtvec_q; - utvec_n = utvec_q; - mtvec_mode_n = mtvec_mode_q; - utvec_mode_n = utvec_mode_q; - pmp_reg_n.pmpaddr = pmp_reg_q.pmpaddr; - pmp_reg_n.pmpcfg_packed = pmp_reg_q.pmpcfg_packed; - pmpaddr_we = '0; - pmpcfg_we = '0; - - mie_n = mie_q; - - if (FPU == 1) if (fflags_we_i) fflags_n = fflags_i | fflags_q; - - case (csr_addr_i) - // fcsr: Floating-Point Control and Status Register (frm, fflags, fprec). - CSR_FFLAGS: if (csr_we_int) fflags_n = (FPU == 1) ? csr_wdata_int[C_FFLAG-1:0] : '0; - CSR_FRM: if (csr_we_int) frm_n = (FPU == 1) ? csr_wdata_int[C_RM-1:0] : '0; - CSR_FCSR: - if (csr_we_int) begin - fflags_n = (FPU == 1) ? csr_wdata_int[C_FFLAG-1:0] : '0; - frm_n = (FPU == 1) ? csr_wdata_int[C_RM+C_FFLAG-1:C_FFLAG] : '0; - end - - // mstatus: IE bit - CSR_MSTATUS: - if (csr_we_int) begin - mstatus_n = '{ - uie: csr_wdata_int[MSTATUS_UIE_BIT], - mie: csr_wdata_int[MSTATUS_MIE_BIT], - upie: csr_wdata_int[MSTATUS_UPIE_BIT], - mpie: csr_wdata_int[MSTATUS_MPIE_BIT], - mpp: PrivLvl_t'(csr_wdata_int[MSTATUS_MPP_BIT_HIGH:MSTATUS_MPP_BIT_LOW]), - mprv: csr_wdata_int[MSTATUS_MPRV_BIT] - }; - end - // mie: machine interrupt enable - CSR_MIE: - if (csr_we_int) begin - mie_n = csr_wdata_int & IRQ_MASK; - end - // mtvec: machine trap-handler base address - CSR_MTVEC: - if (csr_we_int) begin - mtvec_n = csr_wdata_int[31:8]; - mtvec_mode_n = {1'b0, csr_wdata_int[0]}; // Only direct and vectored mode are supported - end - // mscratch: machine scratch - CSR_MSCRATCH: - if (csr_we_int) begin - mscratch_n = csr_wdata_int; - end - // mepc: exception program counter - CSR_MEPC: - if (csr_we_int) begin - mepc_n = csr_wdata_int & ~32'b1; // force 16-bit alignment - end - // mcause - CSR_MCAUSE: if (csr_we_int) mcause_n = {csr_wdata_int[31], csr_wdata_int[4:0]}; - - // Debug - CSR_DCSR: - if (csr_we_int) begin - // Following are read-only and never assigned here (dcsr_q value is used): - // - // - xdebugver - // - cause - // - nmip - - dcsr_n.ebreakm = csr_wdata_int[15]; - dcsr_n.ebreaks = 1'b0; // ebreaks (implemented as WARL) - dcsr_n.ebreaku = csr_wdata_int[12]; - dcsr_n.stepie = csr_wdata_int[11]; // stepie - dcsr_n.stopcount = 1'b0; // stopcount - dcsr_n.stoptime = 1'b0; // stoptime - dcsr_n.mprven = 1'b0; // mprven - dcsr_n.step = csr_wdata_int[2]; - dcsr_n.prv = (PrivLvl_t'(csr_wdata_int[1:0]) == PRIV_LVL_M) ? PRIV_LVL_M : PRIV_LVL_U; // prv (implemented as WARL) - end - - CSR_DPC: - if (csr_we_int) begin - depc_n = csr_wdata_int & ~32'b1; // force 16-bit alignment - end - - CSR_DSCRATCH0: - if (csr_we_int) begin - dscratch0_n = csr_wdata_int; - end - - CSR_DSCRATCH1: - if (csr_we_int) begin - dscratch1_n = csr_wdata_int; - end - - // hardware loops - CSR_LPSTART0: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b001; - hwlp_regid_o = 1'b0; - end - CSR_LPEND0: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b010; - hwlp_regid_o = 1'b0; - end - CSR_LPCOUNT0: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b100; - hwlp_regid_o = 1'b0; - end - CSR_LPSTART1: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b001; - hwlp_regid_o = 1'b1; - end - CSR_LPEND1: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b010; - hwlp_regid_o = 1'b1; - end - CSR_LPCOUNT1: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b100; - hwlp_regid_o = 1'b1; - end - - // PMP config registers - CSR_PMPCFG0: - if (csr_we_int) begin - pmp_reg_n.pmpcfg_packed[0] = csr_wdata_int; - pmpcfg_we[3:0] = 4'b1111; - end - CSR_PMPCFG1: - if (csr_we_int) begin - pmp_reg_n.pmpcfg_packed[1] = csr_wdata_int; - pmpcfg_we[7:4] = 4'b1111; - end - CSR_PMPCFG2: - if (csr_we_int) begin - pmp_reg_n.pmpcfg_packed[2] = csr_wdata_int; - pmpcfg_we[11:8] = 4'b1111; - end - CSR_PMPCFG3: - if (csr_we_int) begin - pmp_reg_n.pmpcfg_packed[3] = csr_wdata_int; - pmpcfg_we[15:12] = 4'b1111; - end - - CSR_PMPADDR0, CSR_PMPADDR1, CSR_PMPADDR2, CSR_PMPADDR3, - CSR_PMPADDR4, CSR_PMPADDR5, CSR_PMPADDR6, CSR_PMPADDR7, - CSR_PMPADDR8, CSR_PMPADDR9, CSR_PMPADDR10, CSR_PMPADDR11, - CSR_PMPADDR12, CSR_PMPADDR13, CSR_PMPADDR14, CSR_PMPADDR15 : - if (csr_we_int) begin - pmp_reg_n.pmpaddr[csr_addr_i[3:0]] = csr_wdata_int; - pmpaddr_we[csr_addr_i[3:0]] = 1'b1; - end - - - /* USER CSR */ - // ucause: exception cause - CSR_USTATUS: - if (csr_we_int) begin - mstatus_n = '{ - uie: csr_wdata_int[MSTATUS_UIE_BIT], - mie: mstatus_q.mie, - upie: csr_wdata_int[MSTATUS_UPIE_BIT], - mpie: mstatus_q.mpie, - mpp: mstatus_q.mpp, - mprv: mstatus_q.mprv - }; - end - // utvec: user trap-handler base address - CSR_UTVEC: - if (csr_we_int) begin - utvec_n = csr_wdata_int[31:8]; - utvec_mode_n = {1'b0, csr_wdata_int[0]}; // Only direct and vectored mode are supported - end - // uepc: exception program counter - CSR_UEPC: - if (csr_we_int) begin - uepc_n = csr_wdata_int; - end - // ucause: exception cause - CSR_UCAUSE: if (csr_we_int) ucause_n = {csr_wdata_int[31], csr_wdata_int[4:0]}; - endcase - - // exception controller gets priority over other writes - unique case (1'b1) - - csr_save_cause_i: begin - - unique case (1'b1) - csr_save_if_i: exception_pc = pc_if_i; - csr_save_id_i: exception_pc = pc_id_i; - csr_save_ex_i: exception_pc = pc_ex_i; - default: ; - endcase - - unique case (priv_lvl_q) - - PRIV_LVL_U: begin - if (~is_irq) begin - //Exceptions, Ecall U --> M - priv_lvl_n = PRIV_LVL_M; - mstatus_n.mpie = mstatus_q.uie; - mstatus_n.mie = 1'b0; - mstatus_n.mpp = PRIV_LVL_U; - if (debug_csr_save_i) depc_n = exception_pc; - else mepc_n = exception_pc; - mcause_n = csr_cause_i; - - end else begin - if (~csr_irq_sec_i) begin - //U --> U - priv_lvl_n = PRIV_LVL_U; - mstatus_n.upie = mstatus_q.uie; - mstatus_n.uie = 1'b0; - if (debug_csr_save_i) depc_n = exception_pc; - else uepc_n = exception_pc; - ucause_n = csr_cause_i; - - end else begin - //U --> M - priv_lvl_n = PRIV_LVL_M; - mstatus_n.mpie = mstatus_q.uie; - mstatus_n.mie = 1'b0; - mstatus_n.mpp = PRIV_LVL_U; - if (debug_csr_save_i) depc_n = exception_pc; - else mepc_n = exception_pc; - mcause_n = csr_cause_i; - end - end - end //PRIV_LVL_U - - PRIV_LVL_M: begin - if (debug_csr_save_i) begin - // all interrupts are masked, don't update cause, epc, tval dpc - // and mpstatus - dcsr_n.prv = PRIV_LVL_M; - dcsr_n.cause = debug_cause_i; - depc_n = exception_pc; - end else begin - //Exceptions or Interrupts from PRIV_LVL_M always do M --> M - priv_lvl_n = PRIV_LVL_M; - mstatus_n.mpie = mstatus_q.mie; - mstatus_n.mie = 1'b0; - mstatus_n.mpp = PRIV_LVL_M; - mepc_n = exception_pc; - mcause_n = csr_cause_i; - end - end //PRIV_LVL_M - default: ; - - endcase - - end //csr_save_cause_i - - csr_restore_uret_i: begin //URET - //mstatus_q.upp is implicitly 0, i.e PRIV_LVL_U - mstatus_n.uie = mstatus_q.upie; - priv_lvl_n = PRIV_LVL_U; - mstatus_n.upie = 1'b1; - end //csr_restore_uret_i - - csr_restore_mret_i: begin //MRET - unique case (mstatus_q.mpp) - PRIV_LVL_U: begin - mstatus_n.uie = mstatus_q.mpie; - priv_lvl_n = PRIV_LVL_U; - mstatus_n.mpie = 1'b1; - mstatus_n.mpp = PRIV_LVL_U; - end - PRIV_LVL_M: begin - mstatus_n.mie = mstatus_q.mpie; - priv_lvl_n = PRIV_LVL_M; - mstatus_n.mpie = 1'b1; - mstatus_n.mpp = PRIV_LVL_U; - end - default: ; - endcase - end //csr_restore_mret_i - - - csr_restore_dret_i: begin //DRET - // Restore to the recorded privilege level - priv_lvl_n = dcsr_q.prv; - - end //csr_restore_dret_i - - default: ; - endcase - end - end else begin : gen_no_pulp_secure_write_logic //PULP_SECURE == 0 - // write logic - always_comb begin - fflags_n = fflags_q; - frm_n = frm_q; - mscratch_n = mscratch_q; - mepc_n = mepc_q; - uepc_n = 'b0; // Not used if PULP_SECURE == 0 - depc_n = depc_q; - dcsr_n = dcsr_q; - dscratch0_n = dscratch0_q; - dscratch1_n = dscratch1_q; - - mstatus_n = mstatus_q; - mcause_n = mcause_q; - ucause_n = '0; // Not used if PULP_SECURE == 0 - hwlp_we_o = '0; - hwlp_regid_o = '0; - exception_pc = pc_id_i; - priv_lvl_n = priv_lvl_q; - mtvec_n = csr_mtvec_init_i ? mtvec_addr_i[31:8] : mtvec_q; - utvec_n = '0; // Not used if PULP_SECURE == 0 - pmp_reg_n.pmpaddr = '0; // Not used if PULP_SECURE == 0 - pmp_reg_n.pmpcfg_packed = '0; // Not used if PULP_SECURE == 0 - pmp_reg_n.pmpcfg = '0; // Not used if PULP_SECURE == 0 - pmpaddr_we = '0; - pmpcfg_we = '0; - - mie_n = mie_q; - mtvec_mode_n = mtvec_mode_q; - utvec_mode_n = '0; // Not used if PULP_SECURE == 0 - - if (FPU == 1) if (fflags_we_i) fflags_n = fflags_i | fflags_q; - - case (csr_addr_i) - // fcsr: Floating-Point Control and Status Register (frm, fflags, fprec). - CSR_FFLAGS: if (csr_we_int) fflags_n = (FPU == 1) ? csr_wdata_int[C_FFLAG-1:0] : '0; - CSR_FRM: if (csr_we_int) frm_n = (FPU == 1) ? csr_wdata_int[C_RM-1:0] : '0; - CSR_FCSR: - if (csr_we_int) begin - fflags_n = (FPU == 1) ? csr_wdata_int[C_FFLAG-1:0] : '0; - frm_n = (FPU == 1) ? csr_wdata_int[C_RM+C_FFLAG-1:C_FFLAG] : '0; - end - - // mstatus: IE bit - CSR_MSTATUS: - if (csr_we_int) begin - mstatus_n = '{ - uie: csr_wdata_int[MSTATUS_UIE_BIT], - mie: csr_wdata_int[MSTATUS_MIE_BIT], - upie: csr_wdata_int[MSTATUS_UPIE_BIT], - mpie: csr_wdata_int[MSTATUS_MPIE_BIT], - mpp: PrivLvl_t'(csr_wdata_int[MSTATUS_MPP_BIT_HIGH:MSTATUS_MPP_BIT_LOW]), - mprv: csr_wdata_int[MSTATUS_MPRV_BIT] - }; - end - // mie: machine interrupt enable - CSR_MIE: - if (csr_we_int) begin - mie_n = csr_wdata_int & IRQ_MASK; - end - // mtvec: machine trap-handler base address - CSR_MTVEC: - if (csr_we_int) begin - mtvec_n = csr_wdata_int[31:8]; - mtvec_mode_n = {1'b0, csr_wdata_int[0]}; // Only direct and vectored mode are supported - end - // mscratch: machine scratch - CSR_MSCRATCH: - if (csr_we_int) begin - mscratch_n = csr_wdata_int; - end - // mepc: exception program counter - CSR_MEPC: - if (csr_we_int) begin - mepc_n = csr_wdata_int & ~32'b1; // force 16-bit alignment - end - // mcause - CSR_MCAUSE: if (csr_we_int) mcause_n = {csr_wdata_int[31], csr_wdata_int[4:0]}; - - CSR_DCSR: - if (csr_we_int) begin - // Following are read-only and never assigned here (dcsr_q value is used): - // - // - xdebugver - // - cause - // - nmip - - dcsr_n.ebreakm = csr_wdata_int[15]; - dcsr_n.ebreaks = 1'b0; // ebreaks (implemented as WARL) - dcsr_n.ebreaku = 1'b0; // ebreaku (implemented as WARL) - dcsr_n.stepie = csr_wdata_int[11]; // stepie - dcsr_n.stopcount = 1'b0; // stopcount - dcsr_n.stoptime = 1'b0; // stoptime - dcsr_n.mprven = 1'b0; // mprven - dcsr_n.step = csr_wdata_int[2]; - dcsr_n.prv = PRIV_LVL_M; // prv (implemendted as WARL) - end - - CSR_DPC: - if (csr_we_int) begin - depc_n = csr_wdata_int & ~32'b1; // force 16-bit alignment - end - - CSR_DSCRATCH0: - if (csr_we_int) begin - dscratch0_n = csr_wdata_int; - end - - CSR_DSCRATCH1: - if (csr_we_int) begin - dscratch1_n = csr_wdata_int; - end - - // hardware loops - CSR_LPSTART0: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b001; - hwlp_regid_o = 1'b0; - end - CSR_LPEND0: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b010; - hwlp_regid_o = 1'b0; - end - CSR_LPCOUNT0: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b100; - hwlp_regid_o = 1'b0; - end - CSR_LPSTART1: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b001; - hwlp_regid_o = 1'b1; - end - CSR_LPEND1: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b010; - hwlp_regid_o = 1'b1; - end - CSR_LPCOUNT1: - if (PULP_XPULP && csr_we_int) begin - hwlp_we_o = 3'b100; - hwlp_regid_o = 1'b1; - end - endcase - - // exception controller gets priority over other writes - unique case (1'b1) - - csr_save_cause_i: begin - unique case (1'b1) - csr_save_if_i: exception_pc = pc_if_i; - csr_save_id_i: exception_pc = pc_id_i; - csr_save_ex_i: exception_pc = pc_ex_i; - default: ; - endcase - - if (debug_csr_save_i) begin - // all interrupts are masked, don't update cause, epc, tval dpc and - // mpstatus - dcsr_n.prv = PRIV_LVL_M; - dcsr_n.cause = debug_cause_i; - depc_n = exception_pc; - end else begin - priv_lvl_n = PRIV_LVL_M; - mstatus_n.mpie = mstatus_q.mie; - mstatus_n.mie = 1'b0; - mstatus_n.mpp = PRIV_LVL_M; - mepc_n = exception_pc; - mcause_n = csr_cause_i; - end - end //csr_save_cause_i - - csr_restore_mret_i: begin //MRET - mstatus_n.mie = mstatus_q.mpie; - priv_lvl_n = PRIV_LVL_M; - mstatus_n.mpie = 1'b1; - mstatus_n.mpp = PRIV_LVL_M; - end //csr_restore_mret_i - - csr_restore_dret_i: begin //DRET - // Restore to the recorded privilege level - priv_lvl_n = dcsr_q.prv; - end //csr_restore_dret_i - - default: ; - endcase - end - end //PULP_SECURE - - assign hwlp_data_o = (PULP_XPULP) ? csr_wdata_int : '0; - - // CSR operation logic - always_comb begin - csr_wdata_int = csr_wdata_i; - csr_we_int = 1'b1; - - case (csr_op_i) - CSR_OP_WRITE: csr_wdata_int = csr_wdata_i; - CSR_OP_SET: csr_wdata_int = csr_wdata_i | csr_rdata_o; - CSR_OP_CLEAR: csr_wdata_int = (~csr_wdata_i) & csr_rdata_o; - - CSR_OP_READ: begin - csr_wdata_int = csr_wdata_i; - csr_we_int = 1'b0; - end - endcase - end - - assign csr_rdata_o = csr_rdata_int; - - // directly output some registers - assign m_irq_enable_o = mstatus_q.mie && !(dcsr_q.step && !dcsr_q.stepie); - assign u_irq_enable_o = mstatus_q.uie && !(dcsr_q.step && !dcsr_q.stepie); - assign priv_lvl_o = priv_lvl_q; - assign sec_lvl_o = priv_lvl_q[0]; - assign frm_o = (FPU == 1) ? frm_q : '0; - - assign mtvec_o = mtvec_q; - assign utvec_o = utvec_q; - assign mtvec_mode_o = mtvec_mode_q; - assign utvec_mode_o = utvec_mode_q; - - assign mepc_o = mepc_q; - assign uepc_o = uepc_q; - - assign mcounteren_o = PULP_SECURE ? mcounteren_q : '0; - - assign depc_o = depc_q; - - assign pmp_addr_o = pmp_reg_q.pmpaddr; - assign pmp_cfg_o = pmp_reg_q.pmpcfg; - - assign debug_single_step_o = dcsr_q.step; - assign debug_ebreakm_o = dcsr_q.ebreakm; - assign debug_ebreaku_o = dcsr_q.ebreaku; - - generate - if (PULP_SECURE == 1) begin : gen_pmp_user - - for (j = 0; j < N_PMP_ENTRIES; j++) begin : CS_PMP_CFG - assign pmp_reg_n.pmpcfg[j] = pmp_reg_n.pmpcfg_packed[j/4][8*((j%4)+1)-1:8*(j%4)]; - assign pmp_reg_q.pmpcfg_packed[j/4][8*((j%4)+1)-1:8*(j%4)] = pmp_reg_q.pmpcfg[j]; - end - - for (j = 0; j < N_PMP_ENTRIES; j++) begin : CS_PMP_REGS_FF - always_ff @(posedge clk, negedge rst_n) begin - if (rst_n == 1'b0) begin - pmp_reg_q.pmpcfg[j] <= '0; - pmp_reg_q.pmpaddr[j] <= '0; - end else begin - if (pmpcfg_we[j]) pmp_reg_q.pmpcfg[j] <= USE_PMP ? pmp_reg_n.pmpcfg[j] : '0; - if (pmpaddr_we[j]) pmp_reg_q.pmpaddr[j] <= USE_PMP ? pmp_reg_n.pmpaddr[j] : '0; - end - end - end //CS_PMP_REGS_FF - - always_ff @(posedge clk, negedge rst_n) begin - if (rst_n == 1'b0) begin - uepc_q <= '0; - ucause_q <= '0; - utvec_q <= '0; - utvec_mode_q <= MTVEC_MODE; - priv_lvl_q <= PRIV_LVL_M; - end else begin - uepc_q <= uepc_n; - ucause_q <= ucause_n; - utvec_q <= utvec_n; - utvec_mode_q <= utvec_mode_n; - priv_lvl_q <= priv_lvl_n; - end - end - end else begin : gen_no_pmp_user - assign pmp_reg_q = '0; - assign uepc_q = '0; - assign ucause_q = '0; - assign utvec_q = '0; - assign utvec_mode_q = '0; - assign priv_lvl_q = PRIV_LVL_M; - end - endgenerate - - // actual registers - always_ff @(posedge clk, negedge rst_n) begin - if (rst_n == 1'b0) begin - frm_q <= '0; - fflags_q <= '0; - mstatus_q <= '{ - uie: 1'b0, - mie: 1'b0, - upie: 1'b0, - mpie: 1'b0, - mpp: PRIV_LVL_M, - mprv: 1'b0 - }; - mepc_q <= '0; - mcause_q <= '0; - - depc_q <= '0; - dcsr_q <= '{ - xdebugver: XDEBUGVER_STD, - cause: DBG_CAUSE_NONE, // 3'h0 - prv: PRIV_LVL_M, - default: '0 - }; - dscratch0_q <= '0; - dscratch1_q <= '0; - mscratch_q <= '0; - mie_q <= '0; - mtvec_q <= '0; - mtvec_mode_q <= MTVEC_MODE; - end else begin - // update CSRs - if (FPU == 1) begin - frm_q <= frm_n; - fflags_q <= fflags_n; - end else begin - frm_q <= 'b0; - fflags_q <= 'b0; - end - if (PULP_SECURE == 1) begin - mstatus_q <= mstatus_n; - end else begin - mstatus_q <= '{ - uie: 1'b0, - mie: mstatus_n.mie, - upie: 1'b0, - mpie: mstatus_n.mpie, - mpp: PRIV_LVL_M, - mprv: 1'b0 - }; - end - mepc_q <= mepc_n; - mcause_q <= mcause_n; - depc_q <= depc_n; - dcsr_q <= dcsr_n; - dscratch0_q <= dscratch0_n; - dscratch1_q <= dscratch1_n; - mscratch_q <= mscratch_n; - mie_q <= mie_n; - mtvec_q <= mtvec_n; - mtvec_mode_q <= mtvec_mode_n; - end - end - //////////////////////////////////////////////////////////////////////// - // ____ _ _____ _ // - // | _ \ ___| |__ _ _ __ _ |_ _| __(_) __ _ __ _ ___ _ __ // - // | | | |/ _ \ '_ \| | | |/ _` | | || '__| |/ _` |/ _` |/ _ \ '__| // - // | |_| | __/ |_) | |_| | (_| | | || | | | (_| | (_| | __/ | // - // |____/ \___|_.__/ \__,_|\__, | |_||_| |_|\__, |\__, |\___|_| // - // |___/ |___/ |___/ // - //////////////////////////////////////////////////////////////////////// - - if (DEBUG_TRIGGER_EN) begin : gen_trigger_regs - // Register values - logic tmatch_control_exec_q; - logic [31:0] tmatch_value_q; - // Write enables - logic tmatch_control_we; - logic tmatch_value_we; - - // Write select - assign tmatch_control_we = csr_we_int & debug_mode_i & (csr_addr_i == CSR_TDATA1); - assign tmatch_value_we = csr_we_int & debug_mode_i & (csr_addr_i == CSR_TDATA2); - - - // Registers - always_ff @(posedge clk or negedge rst_n) begin - if (!rst_n) begin - tmatch_control_exec_q <= 'b0; - tmatch_value_q <= 'b0; - end else begin - if (tmatch_control_we) tmatch_control_exec_q <= csr_wdata_int[2]; - if (tmatch_value_we) tmatch_value_q <= csr_wdata_int[31:0]; - end - end - - // All supported trigger types - assign tinfo_types = 1 << TTYPE_MCONTROL; - - // Assign read data - // TDATA0 - only support simple address matching - assign tmatch_control_rdata = { - TTYPE_MCONTROL, // type : address/data match - 1'b1, // dmode : access from D mode only - 6'h00, // maskmax : exact match only - 1'b0, // hit : not supported - 1'b0, // select : address match only - 1'b0, // timing : match before execution - 2'b00, // sizelo : match any access - 4'h1, // action : enter debug mode - 1'b0, // chain : not supported - 4'h0, // match : simple match - 1'b1, // m : match in m-mode - 1'b0, // 0 : zero - 1'b0, // s : not supported - PULP_SECURE == 1, // u : match in u-mode - tmatch_control_exec_q, // execute : match instruction address - 1'b0, // store : not supported - 1'b0 - }; // load : not supported - - // TDATA1 - address match value only - assign tmatch_value_rdata = tmatch_value_q; - - // Breakpoint matching - // We match against the next address, as the breakpoint must be taken before execution - assign trigger_match_o = tmatch_control_exec_q & (pc_id_i[31:0] == tmatch_value_q[31:0]); - - end else begin : gen_no_trigger_regs - assign tinfo_types = 'b0; - assign tmatch_control_rdata = 'b0; - assign tmatch_value_rdata = 'b0; - assign trigger_match_o = 'b0; - end - - ///////////////////////////////////////////////////////////////// - // ____ __ ____ _ // - // | _ \ ___ _ __ / _| / ___|___ _ _ _ __ | |_ ___ _ __ // - // | |_) / _ \ '__| |_ | | / _ \| | | | '_ \| __/ _ \ '__| // - // | __/ __/ | | _| | |__| (_) | |_| | | | | || __/ | // - // |_| \___|_| |_|(_) \____\___/ \__,_|_| |_|\__\___|_| // - // // - ///////////////////////////////////////////////////////////////// - - // ------------------------ - // Events to count - assign hpm_events[0] = 1'b1; // cycle counter - assign hpm_events[1] = mhpmevent_minstret_i; // instruction counter - assign hpm_events[2] = mhpmevent_ld_stall_i; // nr of load use hazards - assign hpm_events[3] = mhpmevent_jr_stall_i; // nr of jump register hazards - assign hpm_events[4] = mhpmevent_imiss_i; // cycles waiting for instruction fetches, excluding jumps and branches - assign hpm_events[5] = mhpmevent_load_i; // nr of loads - assign hpm_events[6] = mhpmevent_store_i; // nr of stores - assign hpm_events[7] = mhpmevent_jump_i; // nr of jumps (unconditional) - assign hpm_events[8] = mhpmevent_branch_i; // nr of branches (conditional) - assign hpm_events[9] = mhpmevent_branch_taken_i; // nr of taken branches (conditional) - assign hpm_events[10] = mhpmevent_compressed_i; // compressed instruction counter - assign hpm_events[11] = PULP_CLUSTER ? mhpmevent_pipe_stall_i : 1'b0; // extra cycles from ELW - assign hpm_events[12] = !APU ? 1'b0 : apu_typeconflict_i && !apu_dep_i; - assign hpm_events[13] = !APU ? 1'b0 : apu_contention_i; - assign hpm_events[14] = !APU ? 1'b0 : apu_dep_i && !apu_contention_i; - assign hpm_events[15] = !APU ? 1'b0 : apu_wb_i; - - // ------------------------ - // address decoder for performance counter registers - logic mcounteren_we; - logic mcountinhibit_we; - logic mhpmevent_we; - - assign mcounteren_we = csr_we_int & (csr_addr_i == CSR_MCOUNTEREN); - assign mcountinhibit_we = csr_we_int & (csr_addr_i == CSR_MCOUNTINHIBIT); - assign mhpmevent_we = csr_we_int & ( (csr_addr_i == CSR_MHPMEVENT3 )|| - (csr_addr_i == CSR_MHPMEVENT4 ) || - (csr_addr_i == CSR_MHPMEVENT5 ) || - (csr_addr_i == CSR_MHPMEVENT6 ) || - (csr_addr_i == CSR_MHPMEVENT7 ) || - (csr_addr_i == CSR_MHPMEVENT8 ) || - (csr_addr_i == CSR_MHPMEVENT9 ) || - (csr_addr_i == CSR_MHPMEVENT10 ) || - (csr_addr_i == CSR_MHPMEVENT11 ) || - (csr_addr_i == CSR_MHPMEVENT12 ) || - (csr_addr_i == CSR_MHPMEVENT13 ) || - (csr_addr_i == CSR_MHPMEVENT14 ) || - (csr_addr_i == CSR_MHPMEVENT15 ) || - (csr_addr_i == CSR_MHPMEVENT16 ) || - (csr_addr_i == CSR_MHPMEVENT17 ) || - (csr_addr_i == CSR_MHPMEVENT18 ) || - (csr_addr_i == CSR_MHPMEVENT19 ) || - (csr_addr_i == CSR_MHPMEVENT20 ) || - (csr_addr_i == CSR_MHPMEVENT21 ) || - (csr_addr_i == CSR_MHPMEVENT22 ) || - (csr_addr_i == CSR_MHPMEVENT23 ) || - (csr_addr_i == CSR_MHPMEVENT24 ) || - (csr_addr_i == CSR_MHPMEVENT25 ) || - (csr_addr_i == CSR_MHPMEVENT26 ) || - (csr_addr_i == CSR_MHPMEVENT27 ) || - (csr_addr_i == CSR_MHPMEVENT28 ) || - (csr_addr_i == CSR_MHPMEVENT29 ) || - (csr_addr_i == CSR_MHPMEVENT30 ) || - (csr_addr_i == CSR_MHPMEVENT31 ) ); - - // ------------------------ - // Increment value for performance counters - genvar incr_gidx; - generate - for (incr_gidx = 0; incr_gidx < 32; incr_gidx++) begin : gen_mhpmcounter_increment - assign mhpmcounter_increment[incr_gidx] = mhpmcounter_q[incr_gidx] + 1; - end - endgenerate - - // ------------------------ - // next value for performance counters and control registers - always_comb begin - mcounteren_n = mcounteren_q; - mcountinhibit_n = mcountinhibit_q; - mhpmevent_n = mhpmevent_q; - - // User Mode Enable - if (PULP_SECURE && mcounteren_we) mcounteren_n = csr_wdata_int; - - // Inhibit Control - if (mcountinhibit_we) mcountinhibit_n = csr_wdata_int; - - // Event Control - if (mhpmevent_we) mhpmevent_n[csr_addr_i[4:0]] = csr_wdata_int; - end - - genvar wcnt_gidx; - generate - for (wcnt_gidx = 0; wcnt_gidx < 32; wcnt_gidx++) begin : gen_mhpmcounter_write - - // Write lower counter bits - assign mhpmcounter_write_lower[wcnt_gidx] = csr_we_int && (csr_addr_i == (CSR_MCYCLE + wcnt_gidx)); - - // Write upper counter bits - assign mhpmcounter_write_upper[wcnt_gidx] = !mhpmcounter_write_lower[wcnt_gidx] && - csr_we_int && (csr_addr_i == (CSR_MCYCLEH + wcnt_gidx)) && (MHPMCOUNTER_WIDTH == 64); - - // Increment counter - if (!PULP_PERF_COUNTERS) begin : gen_no_pulp_perf_counters - if (wcnt_gidx == 0) begin : gen_mhpmcounter_mcycle - // mcycle = mhpmcounter[0] : count every cycle (if not inhibited) - assign mhpmcounter_write_increment[wcnt_gidx] = !mhpmcounter_write_lower[wcnt_gidx] && - !mhpmcounter_write_upper[wcnt_gidx] && - !mcountinhibit_q[wcnt_gidx]; - end else if (wcnt_gidx == 2) begin : gen_mhpmcounter_minstret - // minstret = mhpmcounter[2] : count every retired instruction (if not inhibited) - assign mhpmcounter_write_increment[wcnt_gidx] = !mhpmcounter_write_lower[wcnt_gidx] && - !mhpmcounter_write_upper[wcnt_gidx] && - !mcountinhibit_q[wcnt_gidx] && - hpm_events[1]; - end else if( (wcnt_gidx>2) && (wcnt_gidx<(NUM_MHPMCOUNTERS+3))) begin : gen_mhpmcounter - // add +1 if any event is enabled and active - assign mhpmcounter_write_increment[wcnt_gidx] = !mhpmcounter_write_lower[wcnt_gidx] && - !mhpmcounter_write_upper[wcnt_gidx] && - !mcountinhibit_q[wcnt_gidx] && - |(hpm_events & mhpmevent_q[wcnt_gidx][NUM_HPM_EVENTS-1:0]); - end else begin : gen_mhpmcounter_not_implemented - assign mhpmcounter_write_increment[wcnt_gidx] = 1'b0; - end - end else begin : gen_pulp_perf_counters - // PULP PERF COUNTERS share all events in one register (not compliant with RISC-V) - assign mhpmcounter_write_increment[wcnt_gidx] = !mhpmcounter_write_lower[wcnt_gidx] && - !mhpmcounter_write_upper[wcnt_gidx] && - !mcountinhibit_q[wcnt_gidx] && - |(hpm_events & mhpmevent_q[wcnt_gidx][NUM_HPM_EVENTS-1:0]); - end - end - endgenerate - - // ------------------------ - // HPM Registers - // Counter Registers: mhpcounter_q[] - genvar cnt_gidx; - generate - for (cnt_gidx = 0; cnt_gidx < 32; cnt_gidx++) begin : gen_mhpmcounter - // mcyclce is located at index 0 - // there is no counter at index 1 - // minstret is located at index 2 - // Programable HPM counters start at index 3 - if ((cnt_gidx == 1) || (cnt_gidx >= (NUM_MHPMCOUNTERS + 3))) begin : gen_non_implemented - assign mhpmcounter_q[cnt_gidx] = 'b0; - end else begin : gen_implemented - always_ff @(posedge clk, negedge rst_n) - if (!rst_n) begin - mhpmcounter_q[cnt_gidx] <= 'b0; - end else begin - if (PULP_PERF_COUNTERS && (cnt_gidx == 2 || cnt_gidx == 0)) begin - mhpmcounter_q[cnt_gidx] <= 'b0; - end else begin - if (mhpmcounter_write_lower[cnt_gidx]) begin - mhpmcounter_q[cnt_gidx][31:0] <= csr_wdata_int; - end else if (mhpmcounter_write_upper[cnt_gidx]) begin - mhpmcounter_q[cnt_gidx][63:32] <= csr_wdata_int; - end else if (mhpmcounter_write_increment[cnt_gidx]) begin - mhpmcounter_q[cnt_gidx] <= mhpmcounter_increment[cnt_gidx]; - end - end - end - end - end - endgenerate - - // Event Register: mhpevent_q[] - genvar evt_gidx; - generate - for (evt_gidx = 0; evt_gidx < 32; evt_gidx++) begin : gen_mhpmevent - // programable HPM events start at index3 - if ((evt_gidx < 3) || (evt_gidx >= (NUM_MHPMCOUNTERS + 3))) begin : gen_non_implemented - assign mhpmevent_q[evt_gidx] = 'b0; - end else begin : gen_implemented - if (NUM_HPM_EVENTS < 32) begin : gen_tie_off - assign mhpmevent_q[evt_gidx][31:NUM_HPM_EVENTS] = 'b0; - end - always_ff @(posedge clk, negedge rst_n) - if (!rst_n) mhpmevent_q[evt_gidx][NUM_HPM_EVENTS-1:0] <= 'b0; - else - mhpmevent_q[evt_gidx][NUM_HPM_EVENTS-1:0] <= mhpmevent_n[evt_gidx][NUM_HPM_EVENTS-1:0]; - end - end - endgenerate - - // Enable Regsiter: mcounteren_q - genvar en_gidx; - generate - for (en_gidx = 0; en_gidx < 32; en_gidx++) begin : gen_mcounteren - if( (PULP_SECURE == 0) || - (en_gidx == 1) || - (en_gidx >= (NUM_MHPMCOUNTERS+3) ) ) - begin : gen_non_implemented - assign mcounteren_q[en_gidx] = 'b0; - end else begin : gen_implemented - always_ff @(posedge clk, negedge rst_n) - if (!rst_n) mcounteren_q[en_gidx] <= 'b0; // default disable - else mcounteren_q[en_gidx] <= mcounteren_n[en_gidx]; - end - end - endgenerate - - // Inhibit Regsiter: mcountinhibit_q - // Note: implemented counters are disabled out of reset to save power - genvar inh_gidx; - generate - for (inh_gidx = 0; inh_gidx < 32; inh_gidx++) begin : gen_mcountinhibit - if ((inh_gidx == 1) || (inh_gidx >= (NUM_MHPMCOUNTERS + 3))) begin : gen_non_implemented - assign mcountinhibit_q[inh_gidx] = 'b0; - end else begin : gen_implemented - always_ff @(posedge clk, negedge rst_n) - if (!rst_n) mcountinhibit_q[inh_gidx] <= 'b1; // default disable - else mcountinhibit_q[inh_gidx] <= mcountinhibit_n[inh_gidx]; - end - end - endgenerate - -`ifdef CV32E40P_ASSERT_ON - - //---------------------------------------------------------------------------- - // Assertions - //---------------------------------------------------------------------------- - - // Check that mie_bypass_o equals mie_n - a_mie_bypass : - assert property (@(posedge clk) disable iff (!rst_n) (1'b1) |-> (mie_bypass_o == mie_n)); - -`endif - -endmodule - diff --git a/src/UWE_projectCode/RTL分析代码/cv32e40p_decoder.sv b/src/UWE_projectCode/RTL分析代码/cv32e40p_decoder.sv deleted file mode 100644 index 9987f7e..0000000 --- a/src/UWE_projectCode/RTL分析代码/cv32e40p_decoder.sv +++ /dev/null @@ -1,3048 +0,0 @@ -// Copyright 2018 ETH Zurich and University of Bologna. -// Copyright and related rights are licensed under the Solderpad Hardware -// License, Version 0.51 (the "License"); you may not use this file except in -// compliance with the License. You may obtain a copy of the License at -// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law -// or agreed to in writing, software, hardware and materials distributed under -// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -//////////////////////////////////////////////////////////////////////////////// -// Engineer Andreas Traber - atraber@iis.ee.ethz.ch // -// // -// Additional contributions by: // -// Matthias Baer - baermatt@student.ethz.ch // -// Igor Loi - igor.loi@unibo.it // -// Sven Stucki - svstucki@student.ethz.ch // -// Davide Schiavone - pschiavo@iis.ee.ethz.ch // -// // -// Design Name: Decoder // -// Project Name: RI5CY // -// Language: SystemVerilog // -// // -// Description: Decoder // -// // -//////////////////////////////////////////////////////////////////////////////// - -module cv32e40p_decoder import cv32e40p_pkg::*; import cv32e40p_apu_core_pkg::*; import cv32e40p_fpu_pkg::*; -#( - parameter PULP_XPULP = 1, // PULP ISA Extension (including PULP specific CSRs and hardware loop, excluding p.elw) - parameter PULP_CLUSTER = 0, - parameter A_EXTENSION = 0, - parameter FPU = 0, - parameter PULP_ZFINX = 0, - parameter PULP_SECURE = 0, - parameter USE_PMP = 0, - parameter APU_WOP_CPU = 6, - parameter DEBUG_TRIGGER_EN = 1 -) -( - // singals running to/from controller - input logic deassert_we_i, // deassert we, we are stalled or not active - - output logic illegal_insn_o, // illegal instruction encountered - output logic ebrk_insn_o, // trap instruction encountered - - output logic mret_insn_o, // return from exception instruction encountered (M) - output logic uret_insn_o, // return from exception instruction encountered (S) - output logic dret_insn_o, // return from debug (M) - - output logic mret_dec_o, // return from exception instruction encountered (M) without deassert - output logic uret_dec_o, // return from exception instruction encountered (S) without deassert - output logic dret_dec_o, // return from debug (M) without deassert - - output logic ecall_insn_o, // environment call (syscall) instruction encountered - output logic wfi_o , // pipeline flush is requested - - output logic fencei_insn_o, // fence.i instruction - - output logic rega_used_o, // rs1 is used by current instruction - output logic regb_used_o, // rs2 is used by current instruction - output logic regc_used_o, // rs3 is used by current instruction - - output logic reg_fp_a_o, // fp reg a is used - output logic reg_fp_b_o, // fp reg b is used - output logic reg_fp_c_o, // fp reg c is used - output logic reg_fp_d_o, // fp reg d is used - - output logic [ 0:0] bmask_a_mux_o, // bit manipulation mask a mux - output logic [ 1:0] bmask_b_mux_o, // bit manipulation mask b mux - output logic alu_bmask_a_mux_sel_o, // bit manipulation mask a mux (reg or imm) - output logic alu_bmask_b_mux_sel_o, // bit manipulation mask b mux (reg or imm) - - // from IF/ID pipeline - input logic [31:0] instr_rdata_i, // instruction read from instr memory/cache - input logic illegal_c_insn_i, // compressed instruction decode failed - - // ALU signals - output logic alu_en_o, // ALU enable - output alu_opcode_e alu_operator_o, // ALU operation selection - output logic [2:0] alu_op_a_mux_sel_o, // operand a selection: reg value, PC, immediate or zero - output logic [2:0] alu_op_b_mux_sel_o, // operand b selection: reg value or immediate - output logic [1:0] alu_op_c_mux_sel_o, // operand c selection: reg value or jump target - output logic [1:0] alu_vec_mode_o, // selects between 32 bit, 16 bit and 8 bit vectorial modes - output logic scalar_replication_o, // scalar replication enable - output logic scalar_replication_c_o, // scalar replication enable for operand C - output logic [0:0] imm_a_mux_sel_o, // immediate selection for operand a - output logic [3:0] imm_b_mux_sel_o, // immediate selection for operand b - output logic [1:0] regc_mux_o, // register c selection: S3, RD or 0 - output logic is_clpx_o, // whether the instruction is complex (pulpv3) or not - output logic is_subrot_o, - - // MUL related control signals - output mul_opcode_e mult_operator_o, // Multiplication operation selection - output logic mult_int_en_o, // perform integer multiplication - output logic mult_dot_en_o, // perform dot multiplication - output logic [0:0] mult_imm_mux_o, // Multiplication immediate mux selector - output logic mult_sel_subword_o, // Select subwords for 16x16 bit of multiplier - output logic [1:0] mult_signed_mode_o, // Multiplication in signed mode - output logic [1:0] mult_dot_signed_o, // Dot product in signed mode - - // FPU - input logic [C_RM-1:0] frm_i, // Rounding mode from float CSR - - output logic [cv32e40p_fpu_pkg::FP_FORMAT_BITS-1:0] fpu_dst_fmt_o, // fpu destination format - output logic [cv32e40p_fpu_pkg::FP_FORMAT_BITS-1:0] fpu_src_fmt_o, // fpu source format - output logic [cv32e40p_fpu_pkg::INT_FORMAT_BITS-1:0] fpu_int_fmt_o, // fpu integer format (for casts) - - // APU - output logic apu_en_o, - output logic [APU_WOP_CPU-1:0] apu_op_o, - output logic [1:0] apu_lat_o, - output logic [2:0] fp_rnd_mode_o, - - // register file related signals - output logic regfile_mem_we_o, // write enable for regfile - output logic regfile_alu_we_o, // write enable for 2nd regfile port - output logic regfile_alu_we_dec_o, // write enable for 2nd regfile port without deassert - output logic regfile_alu_waddr_sel_o, // Select register write address for ALU/MUL operations - - // CSR manipulation - output logic csr_access_o, // access to CSR - output logic csr_status_o, // access to xstatus CSR - output csr_opcode_e csr_op_o, // operation to perform on CSR - input PrivLvl_t current_priv_lvl_i, // The current privilege level - - // LD/ST unit signals - output logic data_req_o, // start transaction to data memory - output logic data_we_o, // data memory write enable - output logic prepost_useincr_o, // when not active bypass the alu result for address calculation - output logic [1:0] data_type_o, // data type on data memory: byte, half word or word - output logic [1:0] data_sign_extension_o, // sign extension on read data from data memory / NaN boxing - output logic [1:0] data_reg_offset_o, // offset in byte inside register for stores - output logic data_load_event_o, // data request is in the special event range - - // Atomic memory access - output logic [5:0] atop_o, - - // hwloop signals - output logic [2:0] hwlp_we_o, // write enable for hwloop regs - output logic hwlp_target_mux_sel_o, // selects immediate for hwloop target - output logic hwlp_start_mux_sel_o, // selects hwloop start address input - output logic hwlp_cnt_mux_sel_o, // selects hwloop counter input - - input logic debug_mode_i, // processor is in debug mode - input logic debug_wfi_no_sleep_i, // do not let WFI cause sleep - - // jump/branches - output logic [1:0] ctrl_transfer_insn_in_dec_o, // control transfer instruction without deassert - output logic [1:0] ctrl_transfer_insn_in_id_o, // control transfer instructio is decoded - output logic [1:0] ctrl_transfer_target_mux_sel_o, // jump target selection - - // HPM related control signals - input logic [31:0] mcounteren_i -); - - // write enable/request control - logic regfile_mem_we; - logic regfile_alu_we; - logic data_req; - logic [2:0] hwlp_we; - logic csr_illegal; - logic [1:0] ctrl_transfer_insn; - - csr_opcode_e csr_op; - - logic alu_en; - logic mult_int_en; - logic mult_dot_en; - logic apu_en; - - // this instruction needs floating-point rounding-mode verification - logic check_fprm; - - logic [cv32e40p_fpu_pkg::OP_BITS-1:0] fpu_op; // fpu operation - logic fpu_op_mod; // fpu operation modifier - logic fpu_vec_op; // fpu vectorial operation - // unittypes for latencies to help us decode for APU - enum logic[1:0] {ADDMUL, DIVSQRT, NONCOMP, CONV} fp_op_group; - - - ///////////////////////////////////////////// - // ____ _ // - // | _ \ ___ ___ ___ __| | ___ _ __ // - // | | | |/ _ \/ __/ _ \ / _` |/ _ \ '__| // - // | |_| | __/ (_| (_) | (_| | __/ | // - // |____/ \___|\___\___/ \__,_|\___|_| // - // // - ///////////////////////////////////////////// - - always_comb - begin - ctrl_transfer_insn = BRANCH_NONE; - ctrl_transfer_target_mux_sel_o = JT_JAL; - - alu_en = 1'b1; - alu_operator_o = ALU_SLTU; - alu_op_a_mux_sel_o = OP_A_REGA_OR_FWD; - alu_op_b_mux_sel_o = OP_B_REGB_OR_FWD; - alu_op_c_mux_sel_o = OP_C_REGC_OR_FWD; - alu_vec_mode_o = VEC_MODE32; - scalar_replication_o = 1'b0; - scalar_replication_c_o = 1'b0; - regc_mux_o = REGC_ZERO; - imm_a_mux_sel_o = IMMA_ZERO; - imm_b_mux_sel_o = IMMB_I; - - mult_operator_o = MUL_I; - mult_int_en = 1'b0; - mult_dot_en = 1'b0; - mult_imm_mux_o = MIMM_ZERO; - mult_signed_mode_o = 2'b00; - mult_sel_subword_o = 1'b0; - mult_dot_signed_o = 2'b00; - - apu_en = 1'b0; - apu_op_o = '0; - apu_lat_o = '0; - fp_rnd_mode_o = '0; - fpu_op = cv32e40p_fpu_pkg::SGNJ; - fpu_op_mod = 1'b0; - fpu_vec_op = 1'b0; - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP32; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP32; - fpu_int_fmt_o = cv32e40p_fpu_pkg::INT32; - check_fprm = 1'b0; - fp_op_group = ADDMUL; - - regfile_mem_we = 1'b0; - regfile_alu_we = 1'b0; - regfile_alu_waddr_sel_o = 1'b1; - - prepost_useincr_o = 1'b1; - - hwlp_we = 3'b0; - hwlp_target_mux_sel_o = 1'b0; - hwlp_start_mux_sel_o = 1'b0; - hwlp_cnt_mux_sel_o = 1'b0; - - csr_access_o = 1'b0; - csr_status_o = 1'b0; - csr_illegal = 1'b0; - csr_op = CSR_OP_READ; - mret_insn_o = 1'b0; - uret_insn_o = 1'b0; - - dret_insn_o = 1'b0; - - data_we_o = 1'b0; - data_type_o = 2'b00; - data_sign_extension_o = 2'b00; - data_reg_offset_o = 2'b00; - data_req = 1'b0; - data_load_event_o = 1'b0; - - atop_o = 6'b000000; - - illegal_insn_o = 1'b0; - ebrk_insn_o = 1'b0; - ecall_insn_o = 1'b0; - wfi_o = 1'b0; - - fencei_insn_o = 1'b0; - - rega_used_o = 1'b0; - regb_used_o = 1'b0; - regc_used_o = 1'b0; - reg_fp_a_o = 1'b0; - reg_fp_b_o = 1'b0; - reg_fp_c_o = 1'b0; - reg_fp_d_o = 1'b0; - - bmask_a_mux_o = BMASK_A_ZERO; - bmask_b_mux_o = BMASK_B_ZERO; - alu_bmask_a_mux_sel_o = BMASK_A_IMM; - alu_bmask_b_mux_sel_o = BMASK_B_IMM; - - is_clpx_o = 1'b0; - is_subrot_o = 1'b0; - - mret_dec_o = 1'b0; - uret_dec_o = 1'b0; - dret_dec_o = 1'b0; - - unique case (instr_rdata_i[6:0]) - - ////////////////////////////////////// - // _ _ _ __ __ ____ ____ // - // | | | | | \/ | _ \/ ___| // - // _ | | | | | |\/| | |_) \___ \ // - // | |_| | |_| | | | | __/ ___) | // - // \___/ \___/|_| |_|_| |____/ // - // // - ////////////////////////////////////// - - OPCODE_JAL: begin // Jump and Link - ctrl_transfer_target_mux_sel_o = JT_JAL; - ctrl_transfer_insn = BRANCH_JAL; - // Calculate and store PC+4 - alu_op_a_mux_sel_o = OP_A_CURRPC; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_PCINCR; - alu_operator_o = ALU_ADD; - regfile_alu_we = 1'b1; - // Calculate jump target (= PC + UJ imm) - end - - OPCODE_JALR: begin // Jump and Link Register - ctrl_transfer_target_mux_sel_o = JT_JALR; - ctrl_transfer_insn = BRANCH_JALR; - // Calculate and store PC+4 - alu_op_a_mux_sel_o = OP_A_CURRPC; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_PCINCR; - alu_operator_o = ALU_ADD; - regfile_alu_we = 1'b1; - // Calculate jump target (= RS1 + I imm) - rega_used_o = 1'b1; - - if (instr_rdata_i[14:12] != 3'b0) begin - ctrl_transfer_insn = BRANCH_NONE; - regfile_alu_we = 1'b0; - illegal_insn_o = 1'b1; - end - end - - OPCODE_BRANCH: begin // Branch - ctrl_transfer_target_mux_sel_o = JT_COND; - ctrl_transfer_insn = BRANCH_COND; - alu_op_c_mux_sel_o = OP_C_JT; - rega_used_o = 1'b1; - regb_used_o = 1'b1; - - unique case (instr_rdata_i[14:12]) - 3'b000: alu_operator_o = ALU_EQ; - 3'b001: alu_operator_o = ALU_NE; - 3'b100: alu_operator_o = ALU_LTS; - 3'b101: alu_operator_o = ALU_GES; - 3'b110: alu_operator_o = ALU_LTU; - 3'b111: alu_operator_o = ALU_GEU; - 3'b010: begin // p.beqimm - if (PULP_XPULP) begin - alu_operator_o = ALU_EQ; - regb_used_o = 1'b0; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_BI; - end else begin - illegal_insn_o = 1'b1; - end - end - 3'b011: begin // p.bneimm - if (PULP_XPULP) begin - alu_operator_o = ALU_NE; - regb_used_o = 1'b0; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_BI; - end else begin - illegal_insn_o = 1'b1; - end - end - endcase - end - - - ////////////////////////////////// - // _ ____ ______ _____ // - // | | | _ \ / / ___|_ _| // - // | | | | | |/ /\___ \ | | // - // | |___| |_| / / ___) || | // - // |_____|____/_/ |____/ |_| // - // // - ////////////////////////////////// - - OPCODE_STORE, - OPCODE_STORE_POST: begin - if (PULP_XPULP || (instr_rdata_i[6:0] == OPCODE_STORE)) begin - data_req = 1'b1; - data_we_o = 1'b1; - rega_used_o = 1'b1; - regb_used_o = 1'b1; - alu_operator_o = ALU_ADD; - // pass write data through ALU operand c - alu_op_c_mux_sel_o = OP_C_REGB_OR_FWD; - - // post-increment setup - if (instr_rdata_i[6:0] == OPCODE_STORE_POST) begin - prepost_useincr_o = 1'b0; - regfile_alu_waddr_sel_o = 1'b0; - regfile_alu_we = 1'b1; - end - - if (instr_rdata_i[14] == 1'b0) begin - // offset from immediate - imm_b_mux_sel_o = IMMB_S; - alu_op_b_mux_sel_o = OP_B_IMM; - end else begin - if (PULP_XPULP) begin - // offset from register - regc_used_o = 1'b1; - alu_op_b_mux_sel_o = OP_B_REGC_OR_FWD; - regc_mux_o = REGC_RD; - end else begin - illegal_insn_o = 1'b1; - end - end - - // store size - unique case (instr_rdata_i[13:12]) - 2'b00: data_type_o = 2'b10; // SB - 2'b01: data_type_o = 2'b01; // SH - 2'b10: data_type_o = 2'b00; // SW - default: begin - data_req = 1'b0; - data_we_o = 1'b0; - illegal_insn_o = 1'b1; - end - endcase - end else begin - illegal_insn_o = 1'b1; - end - end - - OPCODE_LOAD, - OPCODE_LOAD_POST: begin - if (PULP_XPULP || (instr_rdata_i[6:0] == OPCODE_LOAD)) begin - data_req = 1'b1; - regfile_mem_we = 1'b1; - rega_used_o = 1'b1; - data_type_o = 2'b00; - // offset from immediate - alu_operator_o = ALU_ADD; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_I; - - // post-increment setup - if (instr_rdata_i[6:0] == OPCODE_LOAD_POST) begin - prepost_useincr_o = 1'b0; - regfile_alu_waddr_sel_o = 1'b0; - regfile_alu_we = 1'b1; - end - - // sign/zero extension - data_sign_extension_o = {1'b0,~instr_rdata_i[14]}; - - // load size - unique case (instr_rdata_i[13:12]) - 2'b00: data_type_o = 2'b10; // LB - 2'b01: data_type_o = 2'b01; // LH - 2'b10: data_type_o = 2'b00; // LW - default: data_type_o = 2'b00; // illegal or reg-reg - endcase - - // reg-reg load (different encoding) - if (instr_rdata_i[14:12] == 3'b111) begin - if (PULP_XPULP) begin - // offset from RS2 - regb_used_o = 1'b1; - alu_op_b_mux_sel_o = OP_B_REGB_OR_FWD; - - // sign/zero extension - data_sign_extension_o = {1'b0, ~instr_rdata_i[30]}; - - // load size - unique case (instr_rdata_i[31:25]) - 7'b0000_000, - 7'b0100_000: data_type_o = 2'b10; // LB, LBU - 7'b0001_000, - 7'b0101_000: data_type_o = 2'b01; // LH, LHU - 7'b0010_000: data_type_o = 2'b00; // LW - default: begin - illegal_insn_o = 1'b1; - end - endcase - end else begin - illegal_insn_o = 1'b1; - end - end - - // special p.elw (event load) - if (instr_rdata_i[14:12] == 3'b110) begin - if (PULP_CLUSTER && (instr_rdata_i[6:0] == OPCODE_LOAD)) begin - data_load_event_o = 1'b1; - end else begin - // p.elw only valid for PULP_CLUSTER = 1; p.elw with post increment does not exist - illegal_insn_o = 1'b1; - end - end - - if (instr_rdata_i[14:12] == 3'b011) begin - // LD -> RV64 only - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - - OPCODE_AMO: begin - if (A_EXTENSION) begin : decode_amo - if (instr_rdata_i[14:12] == 3'b010) begin // RV32A Extension (word) - data_req = 1'b1; - data_type_o = 2'b00; - rega_used_o = 1'b1; - regb_used_o = 1'b1; - regfile_mem_we = 1'b1; - prepost_useincr_o = 1'b0; // only use alu_operand_a as address (not a+b) - alu_op_a_mux_sel_o = OP_A_REGA_OR_FWD; - - data_sign_extension_o = 1'b1; - - // Apply AMO instruction at `atop_o`. - atop_o = {1'b1, instr_rdata_i[31:27]}; - - unique case (instr_rdata_i[31:27]) - AMO_LR: begin - data_we_o = 1'b0; - end - AMO_SC, - AMO_SWAP, - AMO_ADD, - AMO_XOR, - AMO_AND, - AMO_OR, - AMO_MIN, - AMO_MAX, - AMO_MINU, - AMO_MAXU: begin - data_we_o = 1'b1; - alu_op_c_mux_sel_o = OP_C_REGB_OR_FWD; // pass write data through ALU operand c - end - default : illegal_insn_o = 1'b1; - endcase - end - else begin - illegal_insn_o = 1'b1; - end - end else begin : no_decode_amo - illegal_insn_o = 1'b1; - end - end - - - ////////////////////////// - // _ _ _ _ // - // / \ | | | | | | // - // / _ \ | | | | | | // - // / ___ \| |__| |_| | // - // /_/ \_\_____\___/ // - // // - ////////////////////////// - - OPCODE_LUI: begin // Load Upper Immediate - alu_op_a_mux_sel_o = OP_A_IMM; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_a_mux_sel_o = IMMA_ZERO; - imm_b_mux_sel_o = IMMB_U; - alu_operator_o = ALU_ADD; - regfile_alu_we = 1'b1; - end - - OPCODE_AUIPC: begin // Add Upper Immediate to PC - alu_op_a_mux_sel_o = OP_A_CURRPC; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_U; - alu_operator_o = ALU_ADD; - regfile_alu_we = 1'b1; - end - - OPCODE_OPIMM: begin // Register-Immediate ALU Operations - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_I; - regfile_alu_we = 1'b1; - rega_used_o = 1'b1; - - unique case (instr_rdata_i[14:12]) - 3'b000: alu_operator_o = ALU_ADD; // Add Immediate - 3'b010: alu_operator_o = ALU_SLTS; // Set to one if Lower Than Immediate - 3'b011: alu_operator_o = ALU_SLTU; // Set to one if Lower Than Immediate Unsigned - 3'b100: alu_operator_o = ALU_XOR; // Exclusive Or with Immediate - 3'b110: alu_operator_o = ALU_OR; // Or with Immediate - 3'b111: alu_operator_o = ALU_AND; // And with Immediate - - 3'b001: begin - alu_operator_o = ALU_SLL; // Shift Left Logical by Immediate - if (instr_rdata_i[31:25] != 7'b0) - illegal_insn_o = 1'b1; - end - - 3'b101: begin - if (instr_rdata_i[31:25] == 7'b0) - alu_operator_o = ALU_SRL; // Shift Right Logical by Immediate - else if (instr_rdata_i[31:25] == 7'b010_0000) - alu_operator_o = ALU_SRA; // Shift Right Arithmetically by Immediate - else - illegal_insn_o = 1'b1; - end - - - endcase - end - - OPCODE_OP: begin // Register-Register ALU operation - - // PREFIX 11 - if (instr_rdata_i[31:30] == 2'b11) begin - if (PULP_XPULP) begin - ////////////////////////////// - // IMMEDIATE BIT-MANIPULATION - ////////////////////////////// - - regfile_alu_we = 1'b1; - rega_used_o = 1'b1; - - // bit-manipulation instructions - bmask_a_mux_o = BMASK_A_S3; - bmask_b_mux_o = BMASK_B_S2; - alu_op_b_mux_sel_o = OP_B_IMM; - - unique case (instr_rdata_i[14:12]) - 3'b000: begin - alu_operator_o = ALU_BEXT; - imm_b_mux_sel_o = IMMB_S2; - bmask_b_mux_o = BMASK_B_ZERO; - end - 3'b001: begin - alu_operator_o = ALU_BEXTU; - imm_b_mux_sel_o = IMMB_S2; - bmask_b_mux_o = BMASK_B_ZERO; - end - 3'b010: begin - alu_operator_o = ALU_BINS; - imm_b_mux_sel_o = IMMB_S2; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - end - 3'b011: begin - alu_operator_o = ALU_BCLR; - end - 3'b100: begin - alu_operator_o = ALU_BSET; - end - 3'b101: begin - alu_operator_o = ALU_BREV; - // Enable write back to RD - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - // Extract the source register on operand a - imm_b_mux_sel_o = IMMB_S2; - // Map the radix to bmask_a immediate - alu_bmask_a_mux_sel_o = BMASK_A_IMM; - if (instr_rdata_i[29:27] != 3'b0) begin - illegal_insn_o = 1'b1; - end - end - default: illegal_insn_o = 1'b1; - endcase - end else begin - illegal_insn_o = 1'b1; - end - end - - // PREFIX 10 - else if (instr_rdata_i[31:30] == 2'b10) begin - ////////////////////////////// - // REGISTER BIT-MANIPULATION - ////////////////////////////// - if (instr_rdata_i[29:25]==5'b00000) begin - if (PULP_XPULP) begin - regfile_alu_we = 1'b1; - rega_used_o = 1'b1; - - bmask_a_mux_o = BMASK_A_S3; - bmask_b_mux_o = BMASK_B_S2; - alu_op_b_mux_sel_o = OP_B_IMM; - - unique case (instr_rdata_i[14:12]) - 3'b000: begin - alu_operator_o = ALU_BEXT; - imm_b_mux_sel_o = IMMB_S2; - bmask_b_mux_o = BMASK_B_ZERO; - //register variant - alu_op_b_mux_sel_o = OP_B_BMASK; - alu_bmask_a_mux_sel_o = BMASK_A_REG; - regb_used_o = 1'b1; - end - 3'b001: begin - alu_operator_o = ALU_BEXTU; - imm_b_mux_sel_o = IMMB_S2; - bmask_b_mux_o = BMASK_B_ZERO; - //register variant - alu_op_b_mux_sel_o = OP_B_BMASK; - alu_bmask_a_mux_sel_o = BMASK_A_REG; - regb_used_o = 1'b1; - end - 3'b010: begin - alu_operator_o = ALU_BINS; - imm_b_mux_sel_o = IMMB_S2; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - //register variant - alu_op_b_mux_sel_o = OP_B_BMASK; - alu_bmask_a_mux_sel_o = BMASK_A_REG; - alu_bmask_b_mux_sel_o = BMASK_B_REG; - regb_used_o = 1'b1; - end - 3'b011: begin - alu_operator_o = ALU_BCLR; - //register variant - regb_used_o = 1'b1; - alu_bmask_a_mux_sel_o = BMASK_A_REG; - alu_bmask_b_mux_sel_o = BMASK_B_REG; - end - 3'b100: begin - alu_operator_o = ALU_BSET; - //register variant - regb_used_o = 1'b1; - alu_bmask_a_mux_sel_o = BMASK_A_REG; - alu_bmask_b_mux_sel_o = BMASK_B_REG; - end - default: illegal_insn_o = 1'b1; - endcase - end else begin - illegal_insn_o = 1'b1; - end - - /////////////////////// - // VECTORIAL FLOAT OPS - /////////////////////// - end else begin - // Vectorial FP not available in 'old' shared FPU - if (FPU==1 && C_XFVEC) begin - - // using APU instead of ALU - apu_en = 1'b1; - alu_en = 1'b0; - // by default, set all registers to FP registers and use 2 - rega_used_o = 1'b1; - regb_used_o = 1'b1; - if (PULP_ZFINX==0) begin - reg_fp_a_o = 1'b1; - reg_fp_b_o = 1'b1; - reg_fp_d_o = 1'b1; - end else begin - reg_fp_a_o = 1'b0; - reg_fp_b_o = 1'b0; - reg_fp_d_o = 1'b0; - end - fpu_vec_op = 1'b1; - // replication bit comes from instruction (can change for some ops) - scalar_replication_o = instr_rdata_i[14]; - // by default we need to verify rm is legal but assume it is for now - check_fprm = 1'b1; - fp_rnd_mode_o = frm_i; // all vectorial ops have rm from fcsr - - // Decode Formats - unique case (instr_rdata_i[13:12]) - // FP32 - 2'b00: begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP32; - alu_vec_mode_o = VEC_MODE32; - end - // FP16ALT - 2'b01: begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - alu_vec_mode_o = VEC_MODE16; - end - // FP16 - 2'b10: begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16; - alu_vec_mode_o = VEC_MODE16; - end - // FP8 - 2'b11: begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP8; - alu_vec_mode_o = VEC_MODE8; - end - endcase - - // By default, src=dst - fpu_src_fmt_o = fpu_dst_fmt_o; - - // decode vectorial FP instruction - unique case (instr_rdata_i[29:25]) inside - // vfadd.vfmt - Vectorial FP Addition - 5'b00001: begin - fpu_op = cv32e40p_fpu_pkg::ADD; - fp_op_group = ADDMUL; - // FPnew needs addition operands as operand B and C - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - alu_op_c_mux_sel_o = OP_C_REGB_OR_FWD; - scalar_replication_o = 1'b0; - scalar_replication_c_o = instr_rdata_i[14]; - end - // vfsub.vfmt - Vectorial FP Subtraction - 5'b00010: begin - fpu_op = cv32e40p_fpu_pkg::ADD; - fpu_op_mod = 1'b1; - fp_op_group = ADDMUL; - // FPnew needs addition operands as operand B and C - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - alu_op_c_mux_sel_o = OP_C_REGB_OR_FWD; - scalar_replication_o = 1'b0; - scalar_replication_c_o = instr_rdata_i[14]; - end - // vfmul.vfmt - Vectorial FP Multiplication - 5'b00011: begin - fpu_op = cv32e40p_fpu_pkg::MUL; - fp_op_group = ADDMUL; - end - // vfdiv.vfmt - Vectorial FP Division - 5'b00100: begin - fpu_op = cv32e40p_fpu_pkg::DIV; - fp_op_group = DIVSQRT; - end - // vfmin.vfmt - Vectorial FP Minimum - 5'b00101: begin - fpu_op = cv32e40p_fpu_pkg::MINMAX; - fp_rnd_mode_o = 3'b000; // min - fp_op_group = NONCOMP; - check_fprm = 1'b0; // instruction encoded in rm - end - // vfmax.vfmt - Vectorial FP Maximum - 5'b00110: begin - fpu_op = cv32e40p_fpu_pkg::MINMAX; - fp_rnd_mode_o = 3'b001; // max - fp_op_group = NONCOMP; - check_fprm = 1'b0; // instruction encoded in rm - end - // vfsqrt.vfmt - Vectorial FP Square Root - 5'b00111: begin - regb_used_o = 1'b0; - fpu_op = cv32e40p_fpu_pkg::SQRT; - fp_op_group = DIVSQRT; - // rs2 and R must be zero - if ((instr_rdata_i[24:20] != 5'b00000) || instr_rdata_i[14]) begin - illegal_insn_o = 1'b1; - end - end - // vfmac.vfmt - Vectorial FP Multiply-Accumulate - 5'b01000: begin - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; // third operand is rd - if (PULP_ZFINX==0) begin - reg_fp_c_o = 1'b1; - end else begin - reg_fp_c_o = 1'b0; - end - fpu_op = cv32e40p_fpu_pkg::FMADD; - fp_op_group = ADDMUL; - end - // vfmre.vfmt - Vectorial FP Multiply-Reduce - 5'b01001: begin - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; // third operand is rd - if (PULP_ZFINX==0) begin - reg_fp_c_o = 1'b1; - end else begin - reg_fp_c_o = 1'b0; - end - fpu_op = cv32e40p_fpu_pkg::FMADD; - fpu_op_mod = 1'b1; - fp_op_group = ADDMUL; - end - // Moves, Conversions, Classifications - 5'b01100: begin - regb_used_o = 1'b0; - scalar_replication_o = 1'b0; - // Decode Operation in rs2 - unique case (instr_rdata_i[24:20]) inside - // vfmv.{x.vfmt/vfmt.x} - Vectorial FP Reg <-> GP Reg Moves - 5'b00000: begin - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; // set rs2 = rs1 so we can map FMV to SGNJ in the unit - fpu_op = cv32e40p_fpu_pkg::SGNJ; - fp_rnd_mode_o = 3'b011; // passthrough without checking nan-box - fp_op_group = NONCOMP; - check_fprm = 1'b0; - // GP reg to FP reg - if (instr_rdata_i[14]) begin - reg_fp_a_o = 1'b0; // go from integer regfile - fpu_op_mod = 1'b0; // nan-box result - end - // FP reg to GP reg - else begin - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op_mod = 1'b1; // sign-extend result - end - end - // vfclass.vfmt - Vectorial FP Classifications - 5'b00001: begin - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op = cv32e40p_fpu_pkg::CLASSIFY; - fp_rnd_mode_o = 3'b000; - fp_op_group = NONCOMP; - check_fprm = 1'b0; - // R must not be set - if (instr_rdata_i[14]) illegal_insn_o = 1'b1; - end - // vfcvt.{x.vfmt/vfmt.x} - Vectorial FP <-> Int Conversions - 5'b0001?: begin - fp_op_group = CONV; - fpu_op_mod = instr_rdata_i[14]; // signed/unsigned switch - // Integer width matches FP width - unique case (instr_rdata_i[13:12]) - // FP32 - 2'b00 : fpu_int_fmt_o = cv32e40p_fpu_pkg::INT32; - // FP16[ALT] - 2'b01, - 2'b10: fpu_int_fmt_o = cv32e40p_fpu_pkg::INT16; - // FP8 - 2'b11: fpu_int_fmt_o = cv32e40p_fpu_pkg::INT8; - endcase - // Int to FP conversion - if (instr_rdata_i[20]) begin - reg_fp_a_o = 1'b0; // go from integer regfile - fpu_op = cv32e40p_fpu_pkg::I2F; - end - // FP to Int conversion - else begin - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op = cv32e40p_fpu_pkg::F2I; - end - end - // vfcvt.vfmt.vfmt - Vectorial FP <-> FP Conversions - 5'b001??: begin - fpu_op = cv32e40p_fpu_pkg::F2F; - fp_op_group = CONV; - // check source format - unique case (instr_rdata_i[21:20]) - // Only process instruction if corresponding extension is active (static) - 2'b00: begin - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP32; - if (~C_RVF) illegal_insn_o = 1'b1; - end - 2'b01: begin - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - if (~C_XF16ALT) illegal_insn_o = 1'b1; - end - 2'b10: begin - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16; - if (~C_XF16) illegal_insn_o = 1'b1; - end - 2'b11: begin - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP8; - if (~C_XF8) illegal_insn_o = 1'b1; - end - endcase - // R must not be set - if (instr_rdata_i[14]) illegal_insn_o = 1'b1; - end - // others - default : illegal_insn_o = 1'b1; - endcase - end - // vfsgnj.vfmt - Vectorial FP Sign Injection - 5'b01101: begin - fpu_op = cv32e40p_fpu_pkg::SGNJ; - fp_rnd_mode_o = 3'b000; // sgnj - fp_op_group = NONCOMP; - check_fprm = 1'b0; - end - // vfsgnjn.vfmt - Vectorial FP Negated Sign Injection - 5'b01110: begin - fpu_op = cv32e40p_fpu_pkg::SGNJ; - fp_rnd_mode_o = 3'b001; // sgnjn - fp_op_group = NONCOMP; - check_fprm = 1'b0; - end - // vfsgnjx.vfmt - Vectorial FP Xored Sign Injection - 5'b01111: begin - fpu_op = cv32e40p_fpu_pkg::SGNJ; - fp_rnd_mode_o = 3'b010; // sgnjx - fp_op_group = NONCOMP; - check_fprm = 1'b0; - end - // vfeq.vfmt - Vectorial FP Equals - 5'b10000: begin - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op = cv32e40p_fpu_pkg::CMP; - fp_rnd_mode_o = 3'b010; // eq - fp_op_group = NONCOMP; - check_fprm = 1'b0; - end - // vfne.vfmt - Vectorial FP Not Equals - 5'b10001: begin - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op = cv32e40p_fpu_pkg::CMP; - fpu_op_mod = 1'b1; // invert output - fp_rnd_mode_o = 3'b010; // eq - fp_op_group = NONCOMP; - check_fprm = 1'b0; - end - // vflt.vfmt - Vectorial FP Less Than - 5'b10010: begin - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op = cv32e40p_fpu_pkg::CMP; - fp_rnd_mode_o = 3'b001; // lt - fp_op_group = NONCOMP; - check_fprm = 1'b0; - end - // vfge.vfmt - Vectorial FP Greater Than or Equals - 5'b10011: begin - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op = cv32e40p_fpu_pkg::CMP; - fpu_op_mod = 1'b1; // invert output - fp_rnd_mode_o = 3'b001; // lt - fp_op_group = NONCOMP; - check_fprm = 1'b0; - end - // vfle.vfmt - Vectorial FP Less Than or Equals - 5'b10100: begin - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op = cv32e40p_fpu_pkg::CMP; - fp_rnd_mode_o = 3'b000; // le - fp_op_group = NONCOMP; - check_fprm = 1'b0; - end - // vfgt.vfmt - Vectorial FP Greater Than - 5'b10101: begin - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op = cv32e40p_fpu_pkg::CMP; - fpu_op_mod = 1'b1; // invert output - fp_rnd_mode_o = 3'b000; // le - fp_op_group = NONCOMP; - check_fprm = 1'b0; - end - // vfcpk{a-d}.vfmt.s/d - 5'b110??: begin - // vfcpk{{a/c}/{b/d}} selection in R bit - fpu_op_mod = instr_rdata_i[14]; - fp_op_group = CONV; - scalar_replication_o = 1'b0; - - if (instr_rdata_i[25]) fpu_op = cv32e40p_fpu_pkg::CPKCD; // vfcpk{c/d} - else fpu_op = cv32e40p_fpu_pkg::CPKAB; // vfcpk{a/b} - - // vfcpk{a-d}.vfmt.d - from double - if (instr_rdata_i[26]) begin - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP64; - if (~C_RVD) illegal_insn_o = 1'b1; - end - // vfcpk{a-d}.vfmt.s - else begin - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP32; - if (~C_RVF) illegal_insn_o = 1'b1; - end - // Resolve legal vfcpk / format combinations (mostly static) - if (fpu_op == cv32e40p_fpu_pkg::CPKCD) begin // vfcpk{c/d} not possible unless FP8 and FLEN>=64 - if (~C_XF8 || ~C_RVD) illegal_insn_o = 1'b1; - end else begin - if (instr_rdata_i[14]) begin // vfcpkb - // vfcpkb not possible for FP32 - if (fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP32) illegal_insn_o = 1'b1; - // vfcpkb not possible for FP16[ALT] if not RVD - if (~C_RVD && (fpu_dst_fmt_o != cv32e40p_fpu_pkg::FP8)) illegal_insn_o = 1'b1; - end - end - end - // Rest are illegal instructions - default: begin - illegal_insn_o = 1'b1; - end - endcase - - // check enabled formats (static) - // need RVD for F vectors - if ((~C_RVF || ~C_RVD) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP32) illegal_insn_o = 1'b1; - // need RVF for F16 vectors - if ((~C_XF16 || ~C_RVF) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP16) illegal_insn_o = 1'b1; - // need RVF for F16 vectors - if ((~C_XF16ALT || ~C_RVF) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP16ALT) begin - illegal_insn_o = 1'b1; - end - // need F16 for F8 vectors - if ((~C_XF8 || (~C_XF16 && ~C_XF16ALT)) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP8) begin - illegal_insn_o = 1'b1; - end - - // check rounding mode - if (check_fprm) begin - unique case (frm_i) inside - [3'b000:3'b100] : ; //legal rounding modes - default : illegal_insn_o = 1'b1; - endcase - end - - // Set latencies for FPnew from config. The C_LAT constants contain the number - // of pipeline registers. the APU takes the following values: - // 1 = single cycle (no latency), 2 = one pipestage, 3 = two or more pipestages - case (fp_op_group) - // ADDMUL has format dependent latency - ADDMUL : begin - unique case (fpu_dst_fmt_o) - cv32e40p_fpu_pkg::FP32 : apu_lat_o = (C_LAT_FP32<2) ? C_LAT_FP32+1 : 2'h3; - cv32e40p_fpu_pkg::FP16 : apu_lat_o = (C_LAT_FP16<2) ? C_LAT_FP16+1 : 2'h3; - cv32e40p_fpu_pkg::FP16ALT : apu_lat_o = (C_LAT_FP16ALT<2) ? C_LAT_FP16ALT+1 : 2'h3; - cv32e40p_fpu_pkg::FP8 : apu_lat_o = (C_LAT_FP8<2) ? C_LAT_FP8+1 : 2'h3; - default : ; - endcase - end - // DIVSQRT is iterative and takes more than 2 cycles - DIVSQRT : apu_lat_o = 2'h3; - // NONCOMP uses the same latency for all formats - NONCOMP : apu_lat_o = (C_LAT_NONCOMP<2) ? C_LAT_NONCOMP+1 : 2'h3; - // CONV uses the same latency for all formats - CONV : apu_lat_o = (C_LAT_CONV<2) ? C_LAT_CONV+1 : 2'h3; - endcase - - // Set FPnew OP and OPMOD as the APU op - apu_op_o = {fpu_vec_op, fpu_op_mod, fpu_op}; - end - // FPU!=1 or no Vectors or old shared unit - else begin - illegal_insn_o = 1'b1; - end - end // Vectorial Float Ops - - end // prefix 10 - - // PREFIX 00/01 - else begin - // non bit-manipulation instructions - regfile_alu_we = 1'b1; - rega_used_o = 1'b1; - - if (~instr_rdata_i[28]) regb_used_o = 1'b1; - - unique case ({instr_rdata_i[30:25], instr_rdata_i[14:12]}) - // RV32I ALU operations - {6'b00_0000, 3'b000}: alu_operator_o = ALU_ADD; // Add - {6'b10_0000, 3'b000}: alu_operator_o = ALU_SUB; // Sub - {6'b00_0000, 3'b010}: alu_operator_o = ALU_SLTS; // Set Lower Than - {6'b00_0000, 3'b011}: alu_operator_o = ALU_SLTU; // Set Lower Than Unsigned - {6'b00_0000, 3'b100}: alu_operator_o = ALU_XOR; // Xor - {6'b00_0000, 3'b110}: alu_operator_o = ALU_OR; // Or - {6'b00_0000, 3'b111}: alu_operator_o = ALU_AND; // And - {6'b00_0000, 3'b001}: alu_operator_o = ALU_SLL; // Shift Left Logical - {6'b00_0000, 3'b101}: alu_operator_o = ALU_SRL; // Shift Right Logical - {6'b10_0000, 3'b101}: alu_operator_o = ALU_SRA; // Shift Right Arithmetic - - // supported RV32M instructions - {6'b00_0001, 3'b000}: begin // mul - alu_en = 1'b0; - mult_int_en = 1'b1; - mult_operator_o = MUL_MAC32; - regc_mux_o = REGC_ZERO; - end - {6'b00_0001, 3'b001}: begin // mulh - alu_en = 1'b0; - regc_used_o = 1'b1; - regc_mux_o = REGC_ZERO; - mult_signed_mode_o = 2'b11; - mult_int_en = 1'b1; - mult_operator_o = MUL_H; - end - {6'b00_0001, 3'b010}: begin // mulhsu - alu_en = 1'b0; - regc_used_o = 1'b1; - regc_mux_o = REGC_ZERO; - mult_signed_mode_o = 2'b01; - mult_int_en = 1'b1; - mult_operator_o = MUL_H; - end - {6'b00_0001, 3'b011}: begin // mulhu - alu_en = 1'b0; - regc_used_o = 1'b1; - regc_mux_o = REGC_ZERO; - mult_signed_mode_o = 2'b00; - mult_int_en = 1'b1; - mult_operator_o = MUL_H; - end - {6'b00_0001, 3'b100}: begin // div - alu_op_a_mux_sel_o = OP_A_REGB_OR_FWD; - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - regb_used_o = 1'b1; - alu_operator_o = ALU_DIV; - end - {6'b00_0001, 3'b101}: begin // divu - alu_op_a_mux_sel_o = OP_A_REGB_OR_FWD; - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - regb_used_o = 1'b1; - alu_operator_o = ALU_DIVU; - end - {6'b00_0001, 3'b110}: begin // rem - alu_op_a_mux_sel_o = OP_A_REGB_OR_FWD; - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - regb_used_o = 1'b1; - alu_operator_o = ALU_REM; - end - {6'b00_0001, 3'b111}: begin // remu - alu_op_a_mux_sel_o = OP_A_REGB_OR_FWD; - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - regb_used_o = 1'b1; - alu_operator_o = ALU_REMU; - end - - // PULP specific instructions - {6'b10_0001, 3'b000}: begin // p.mac - if (PULP_XPULP) begin - alu_en = 1'b0; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - mult_int_en = 1'b1; - mult_operator_o = MUL_MAC32; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b10_0001, 3'b001}: begin // p.msu - if (PULP_XPULP) begin - alu_en = 1'b0; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - mult_int_en = 1'b1; - mult_operator_o = MUL_MSU32; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_0010, 3'b010}: begin // Set Lower Equal Than - p.slet - if (PULP_XPULP) begin - alu_operator_o = ALU_SLETS; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_0010, 3'b011}: begin // Set Lower Equal Than Unsigned; p.sletu - if (PULP_XPULP) begin - alu_operator_o = ALU_SLETU; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_0010, 3'b100}: begin // Min - p.min - if (PULP_XPULP) begin - alu_operator_o = ALU_MIN; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_0010, 3'b101}: begin // Min Unsigned - p.minu - if (PULP_XPULP) begin - alu_operator_o = ALU_MINU; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_0010, 3'b110}: begin // Max - p.max - if (PULP_XPULP) begin - alu_operator_o = ALU_MAX; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_0010, 3'b111}: begin // Max Unsigned - p.maxu - if (PULP_XPULP) begin - alu_operator_o = ALU_MAXU; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_0100, 3'b101}: begin // Rotate Right - p.ror - if (PULP_XPULP) begin - alu_operator_o = ALU_ROR; - end else begin - illegal_insn_o = 1'b1; - end - end - - // PULP specific instructions using only one source register - - {6'b00_1000, 3'b000}: begin // Find First 1 - p.ff1 - if (PULP_XPULP) begin - alu_operator_o = ALU_FF1; - if (instr_rdata_i[24:20] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1000, 3'b001}: begin // Find Last 1 - p.fl1 - if (PULP_XPULP) begin - alu_operator_o = ALU_FL1; - if (instr_rdata_i[24:20] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1000, 3'b010}: begin // Count Leading Bits - p.clb - if (PULP_XPULP) begin - alu_operator_o = ALU_CLB; - if (instr_rdata_i[24:20] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1000, 3'b011}: begin // Count set bits (popcount) - p.cnt - if (PULP_XPULP) begin - alu_operator_o = ALU_CNT; - if (instr_rdata_i[24:20] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1000, 3'b100}: begin // Sign-extend Halfword - p.exths - if (PULP_XPULP) begin - alu_operator_o = ALU_EXTS; - alu_vec_mode_o = VEC_MODE16; - if (instr_rdata_i[24:20] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1000, 3'b101}: begin // Zero-extend Halfword - p.exthz - if (PULP_XPULP) begin - alu_operator_o = ALU_EXT; - alu_vec_mode_o = VEC_MODE16; - if (instr_rdata_i[24:20] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1000, 3'b110}: begin // Sign-extend Byte - p.extbs - if (PULP_XPULP) begin - alu_operator_o = ALU_EXTS; - alu_vec_mode_o = VEC_MODE8; - if (instr_rdata_i[24:20] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1000, 3'b111}: begin // Zero-extend Byte - p.extbz - if (PULP_XPULP) begin - alu_operator_o = ALU_EXT; - alu_vec_mode_o = VEC_MODE8; - if (instr_rdata_i[24:20] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_0010, 3'b000}: begin // p.abs - if (PULP_XPULP) begin - alu_operator_o = ALU_ABS; - if (instr_rdata_i[24:20] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1010, 3'b001}: begin // p.clip - if (PULP_XPULP) begin - alu_operator_o = ALU_CLIP; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_CLIP; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1010, 3'b010}: begin // p.clipu - if (PULP_XPULP) begin - alu_operator_o = ALU_CLIPU; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_CLIP; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1010, 3'b101}: begin // p.clipr - if (PULP_XPULP) begin - alu_operator_o = ALU_CLIP; - regb_used_o = 1'b1; - end else begin - illegal_insn_o = 1'b1; - end - end - {6'b00_1010, 3'b110}: begin // p.clipur - if (PULP_XPULP) begin - alu_operator_o = ALU_CLIPU; - regb_used_o = 1'b1; - end else begin - illegal_insn_o = 1'b1; - end - end - - default: begin - illegal_insn_o = 1'b1; - end - endcase - end - end - - //////////////////////////// - // ______ _____ _ _ // - // | ____| __ \| | | | // - // | |__ | |__) | | | | // - // | __| | ___/| | | | // - // | | | | | |__| | // - // |_| |_| \____/ // - // // - //////////////////////////// - - // floating point arithmetic - OPCODE_OP_FP: begin - if (FPU==1) begin - - // using APU instead of ALU - apu_en = 1'b1; - alu_en = 1'b0; - // by default, set all registers to FP registers and use 2 - rega_used_o = 1'b1; - regb_used_o = 1'b1; - if (PULP_ZFINX==0) begin - reg_fp_a_o = 1'b1; - reg_fp_b_o = 1'b1; - reg_fp_d_o = 1'b1; - end else begin - reg_fp_a_o = 1'b0; - reg_fp_b_o = 1'b0; - reg_fp_d_o = 1'b0; - end - // by default we need to verify rm is legal but assume it is for now - check_fprm = 1'b1; - fp_rnd_mode_o = instr_rdata_i[14:12]; - - // Decode Formats (preliminary, can change for some ops) - unique case (instr_rdata_i[26:25]) - // FP32 - 2'b00: fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP32; - // FP64 - 2'b01: fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP64; - // FP16 or FP16ALT - 2'b10: begin - // FP16alt encoded in rm field - if (instr_rdata_i[14:12]==3'b101) fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - // this can still change to FP16ALT - else fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16; - end - // FP8 - 2'b11: fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP8; - endcase - - // By default, src=dst - fpu_src_fmt_o = fpu_dst_fmt_o; - - // decode FP instruction - unique case (instr_rdata_i[31:27]) - // fadd.fmt - FP Addition - 5'b00000: begin - fpu_op = cv32e40p_fpu_pkg::ADD; - fp_op_group = ADDMUL; - apu_op_o = 2'b0; - apu_lat_o = (PIPE_REG_ADDSUB==1) ? 2'h2 : 2'h1; - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - alu_op_c_mux_sel_o = OP_C_REGB_OR_FWD; - end - // fsub.fmt - FP Subtraction - 5'b00001: begin - fpu_op = cv32e40p_fpu_pkg::ADD; - fpu_op_mod = 1'b1; - fp_op_group = ADDMUL; - apu_op_o = 2'b1; - apu_lat_o = (PIPE_REG_ADDSUB==1) ? 2'h2 : 2'h1; - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - alu_op_c_mux_sel_o = OP_C_REGB_OR_FWD; - end - // fmul.fmt - FP Multiplication - 5'b00010: begin - fpu_op = cv32e40p_fpu_pkg::MUL; - fp_op_group = ADDMUL; - apu_lat_o = (PIPE_REG_MULT==1) ? 2'h2 : 2'h1; - end - // fdiv.fmt - FP Division - 5'b00011: begin - fpu_op = cv32e40p_fpu_pkg::DIV; - fp_op_group = DIVSQRT; - apu_lat_o = 2'h3; - end - // fsqrt.fmt - FP Square Root - 5'b01011: begin - regb_used_o = 1'b0; - fpu_op = cv32e40p_fpu_pkg::SQRT; - fp_op_group = DIVSQRT; - apu_op_o = 1'b1; - apu_lat_o = 2'h3; - // rs2 must be zero - if (instr_rdata_i[24:20] != 5'b00000) illegal_insn_o = 1'b1; - end - // fsgn{j[n]/jx}.fmt - FP Sign Injection - 5'b00100: begin - fpu_op = cv32e40p_fpu_pkg::SGNJ; - fp_op_group = NONCOMP; - check_fprm = 1'b0; // instruction encoded in rm, do the check here - if (C_XF16ALT) begin // FP16ALT instructions encoded in rm separately (static) - if (!(instr_rdata_i[14:12] inside {[3'b000:3'b010], [3'b100:3'b110]})) begin - illegal_insn_o = 1'b1; - end - // FP16ALT uses special encoding here - if (instr_rdata_i[14]) begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - end else begin - fp_rnd_mode_o = {1'b0, instr_rdata_i[13:12]}; - end - end else begin - if (!(instr_rdata_i[14:12] inside {[3'b000:3'b010]})) illegal_insn_o = 1'b1; - end - end - // fmin/fmax.fmt - FP Minimum / Maximum - 5'b00101: begin - fpu_op = cv32e40p_fpu_pkg::MINMAX; - fp_op_group = NONCOMP; - check_fprm = 1'b0; // instruction encoded in rm, do the check here - if (C_XF16ALT) begin // FP16ALT instructions encoded in rm separately (static) - if (!(instr_rdata_i[14:12] inside {[3'b000:3'b001], [3'b100:3'b101]})) begin - illegal_insn_o = 1'b1; - end - // FP16ALT uses special encoding here - if (instr_rdata_i[14]) begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - end else begin - fp_rnd_mode_o = {1'b0, instr_rdata_i[13:12]}; - end - end else begin - if (!(instr_rdata_i[14:12] inside {[3'b000:3'b001]})) illegal_insn_o = 1'b1; - end - end - // fcvt.fmt.fmt - FP to FP Conversion - 5'b01000: begin - regb_used_o = 1'b0; - fpu_op = cv32e40p_fpu_pkg::F2F; - fp_op_group = CONV; - // bits [22:20] used, other bits must be 0 - if (instr_rdata_i[24:23]) illegal_insn_o = 1'b1; - // check source format - unique case (instr_rdata_i[22:20]) - // Only process instruction if corresponding extension is active (static) - 3'b000: begin - if (~C_RVF) illegal_insn_o = 1'b1; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP32; - end - 3'b001: begin - if (~C_RVD) illegal_insn_o = 1'b1; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP64; - end - 3'b010: begin - if (~C_XF16) illegal_insn_o = 1'b1; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16; - end - 3'b110: begin - if (~C_XF16ALT) illegal_insn_o = 1'b1; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - end - 3'b011: begin - if (~C_XF8) illegal_insn_o = 1'b1; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP8; - end - default: illegal_insn_o = 1'b1; - endcase - end - // fmulex.s.fmt - FP Expanding Multiplication to FP32 - 5'b01001: begin - fpu_op = cv32e40p_fpu_pkg::MUL; - fp_op_group = ADDMUL; - apu_lat_o = (PIPE_REG_MULT==1) ? 2'h2 : 2'h1; - // set dst format to FP32 - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP32; - end - // fmacex.s.fmt - FP Expanding Multipy-Accumulate to FP32 - 5'b01010: begin - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; // third operand is rd - if (PULP_ZFINX==0) begin - reg_fp_c_o = 1'b1; - end else begin - reg_fp_c_o = 1'b0; - end - fpu_op = cv32e40p_fpu_pkg::FMADD; - fp_op_group = ADDMUL; - apu_lat_o = (PIPE_REG_MULT==1) ? 2'h2 : 2'h1; - // set dst format to FP32 - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP32; - end - // feq/flt/fle.fmt - FP Comparisons - 5'b10100: begin - fpu_op = cv32e40p_fpu_pkg::CMP; - fp_op_group = NONCOMP; - reg_fp_d_o = 1'b0; // go to integer regfile - check_fprm = 1'b0; // instruction encoded in rm, do the check here - if (C_XF16ALT) begin // FP16ALT instructions encoded in rm separately (static) - if (!(instr_rdata_i[14:12] inside {[3'b000:3'b010], [3'b100:3'b110]})) begin - illegal_insn_o = 1'b1; - end - // FP16ALT uses special encoding here - if (instr_rdata_i[14]) begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - end else begin - fp_rnd_mode_o = {1'b0, instr_rdata_i[13:12]}; - end - end else begin - if (!(instr_rdata_i[14:12] inside {[3'b000:3'b010]})) illegal_insn_o = 1'b1; - end - end - // fcvt.ifmt.fmt - FP to Int Conversion - 5'b11000: begin - regb_used_o = 1'b0; - reg_fp_d_o = 1'b0; // go to integer regfile - fpu_op = cv32e40p_fpu_pkg::F2I; - fp_op_group = CONV; - fpu_op_mod = instr_rdata_i[20]; // signed/unsigned switch - apu_op_o = 2'b1; - apu_lat_o = (PIPE_REG_CAST==1) ? 2'h2 : 2'h1; - - unique case (instr_rdata_i[26:25]) //fix for casting to different formats other than FP32 - 2'b00: begin - if (~C_RVF) illegal_insn_o = 1; - else fpu_src_fmt_o = cv32e40p_fpu_pkg::FP32; - end - 2'b01: begin - if (~C_RVD) illegal_insn_o = 1; - else fpu_src_fmt_o = cv32e40p_fpu_pkg::FP64; - end - 2'b10: begin - if (instr_rdata_i[14:12] == 3'b101) begin - if (~C_XF16ALT) illegal_insn_o = 1; - else fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - end else if (~C_XF16) begin - illegal_insn_o = 1; - end else begin - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16; - end - end - 2'b11: begin - if (~C_XF8) illegal_insn_o = 1; - else fpu_src_fmt_o = cv32e40p_fpu_pkg::FP8; - end - endcase // unique case (instr_rdata_i[26:25]) - // bits [21:20] used, other bits must be 0 - if (instr_rdata_i[24:21]) illegal_insn_o = 1'b1; // in RV32, no casts to L allowed. - end - // fcvt.fmt.ifmt - Int to FP Conversion - 5'b11010: begin - regb_used_o = 1'b0; - reg_fp_a_o = 1'b0; // go from integer regfile - fpu_op = cv32e40p_fpu_pkg::I2F; - fp_op_group = CONV; - fpu_op_mod = instr_rdata_i[20]; // signed/unsigned switch - apu_op_o = 2'b0; - apu_lat_o = (PIPE_REG_CAST==1) ? 2'h2 : 2'h1; - // bits [21:20] used, other bits must be 0 - if (instr_rdata_i[24:21]) illegal_insn_o = 1'b1; // in RV32, no casts to L allowed. - end - // move and class - 5'b11100: begin - regb_used_o = 1'b0; - reg_fp_d_o = 1'b0; // go to integer regfile - fp_op_group = NONCOMP; - check_fprm = 1'b0; // instruction encoded in rm, do the check here - // fmv.x.fmt - FPR to GPR Move - if (instr_rdata_i[14:12] == 3'b000 || (C_XF16ALT && instr_rdata_i[14:12] == 3'b100)) begin - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; // set rs2 = rs1 so we can map FMV to SGNJ in the unit - fpu_op = cv32e40p_fpu_pkg::SGNJ; // mapped to SGNJ-passthrough since no recoding - fpu_op_mod = 1'b1; // sign-extend result - fp_rnd_mode_o = 3'b011; // passthrough without checking nan-box - // FP16ALT uses special encoding here - if (instr_rdata_i[14]) begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - end - // fclass.fmt - FP Classify - end else if (instr_rdata_i[14:12] == 3'b001 || (C_XF16ALT && instr_rdata_i[14:12] == 3'b101)) begin - fpu_op = cv32e40p_fpu_pkg::CLASSIFY; - fp_rnd_mode_o = 3'b000; - // FP16ALT uses special encoding here - if (instr_rdata_i[14]) begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - end - end else begin - illegal_insn_o = 1'b1; - end - // rs2 must be zero - if (instr_rdata_i[24:20]) illegal_insn_o = 1'b1; - end - // fmv.fmt.x - GPR to FPR Move - 5'b11110: begin - regb_used_o = 1'b0; - reg_fp_a_o = 1'b0; // go from integer regfile - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; // set rs2 = rs1 so we can map FMV to SGNJ in the unit - fpu_op = cv32e40p_fpu_pkg::SGNJ; // mapped to SGNJ-passthrough since no recoding - fpu_op_mod = 1'b0; // nan-box result - fp_op_group = NONCOMP; - fp_rnd_mode_o = 3'b011; // passthrough without checking nan-box - check_fprm = 1'b0; // instruction encoded in rm, do the check here - if (instr_rdata_i[14:12] == 3'b000 || (C_XF16ALT && instr_rdata_i[14:12] == 3'b100)) begin - // FP16ALT uses special encoding here - if (instr_rdata_i[14]) begin - fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - fpu_src_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - end - end else begin - illegal_insn_o = 1'b1; - end - // rs2 must be zero - if (instr_rdata_i[24:20] != 5'b00000) illegal_insn_o = 1'b1; - end - // Rest are illegal instructions - default: begin - illegal_insn_o = 1'b1; - end - endcase - - // check enabled formats (static) - if (~C_RVF && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP32) illegal_insn_o = 1'b1; - if ((~C_RVD) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP64) illegal_insn_o = 1'b1; - if ((~C_XF16) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP16) illegal_insn_o = 1'b1; - if ((~C_XF16ALT) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP16ALT) begin - illegal_insn_o = 1'b1; - end - if ((~C_XF8) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP8) illegal_insn_o = 1'b1; - - // check rounding mode - if (check_fprm) begin - unique case (instr_rdata_i[14:12]) inside - [3'b000:3'b100]: ; //legal rounding modes - 3'b101: begin // Alternative Half-Precsision encded as fmt=10 and rm=101 - if (~C_XF16ALT || fpu_dst_fmt_o != cv32e40p_fpu_pkg::FP16ALT) illegal_insn_o = 1'b1; - // actual rounding mode from frm csr - unique case (frm_i) inside - [3'b000:3'b100] : fp_rnd_mode_o = frm_i; //legal rounding modes - default : illegal_insn_o = 1'b1; - endcase - end - 3'b111: begin - // rounding mode from frm csr - unique case (frm_i) inside - [3'b000:3'b100] : fp_rnd_mode_o = frm_i; //legal rounding modes - default : illegal_insn_o = 1'b1; - endcase - end - default : illegal_insn_o = 1'b1; - endcase - end - - // Set latencies for FPnew from config. The C_LAT constants contain the number - // of pipeline registers. the APU takes the following values: - // 1 = single cycle (no latency), 2 = one pipestage, 3 = two or more pipestages - case (fp_op_group) - // ADDMUL has format dependent latency - ADDMUL : begin - unique case (fpu_dst_fmt_o) - cv32e40p_fpu_pkg::FP32 : apu_lat_o = (C_LAT_FP32<2) ? C_LAT_FP32+1 : 2'h3; - cv32e40p_fpu_pkg::FP64 : apu_lat_o = (C_LAT_FP64<2) ? C_LAT_FP64+1 : 2'h3; - cv32e40p_fpu_pkg::FP16 : apu_lat_o = (C_LAT_FP16<2) ? C_LAT_FP16+1 : 2'h3; - cv32e40p_fpu_pkg::FP16ALT : apu_lat_o = (C_LAT_FP16ALT<2) ? C_LAT_FP16ALT+1 : 2'h3; - cv32e40p_fpu_pkg::FP8 : apu_lat_o = (C_LAT_FP8<2) ? C_LAT_FP8+1 : 2'h3; - default : ; - endcase - end - // DIVSQRT is iterative and takes more than 2 cycles - DIVSQRT : apu_lat_o = 2'h3; - // NONCOMP uses the same latency for all formats - NONCOMP : apu_lat_o = (C_LAT_NONCOMP<2) ? C_LAT_NONCOMP+1 : 2'h3; - // CONV uses the same latency for all formats - CONV : apu_lat_o = (C_LAT_CONV<2) ? C_LAT_CONV+1 : 2'h3; - endcase - - // Set FPnew OP and OPMOD as the APU op - apu_op_o = {fpu_vec_op, fpu_op_mod, fpu_op}; - - end - // FPU!=1 - else - illegal_insn_o = 1'b1; - end - - // floating point fused arithmetic - OPCODE_OP_FMADD, - OPCODE_OP_FMSUB, - OPCODE_OP_FNMSUB, - OPCODE_OP_FNMADD : begin - if (FPU==1) begin - // using APU instead of ALU - apu_en = 1'b1; - alu_en = 1'b0; - apu_lat_o = (PIPE_REG_MAC>1) ? 2'h3 : 2'h2; - // all registers are FP registers and use three - rega_used_o = 1'b1; - regb_used_o = 1'b1; - regc_used_o = 1'b1; - regc_mux_o = REGC_S4; - if (PULP_ZFINX==0) begin - reg_fp_a_o = 1'b1; - reg_fp_b_o = 1'b1; - reg_fp_c_o = 1'b1; - reg_fp_d_o = 1'b1; - end else begin - reg_fp_a_o = 1'b0; - reg_fp_b_o = 1'b0; - reg_fp_c_o = 1'b0; - reg_fp_d_o = 1'b0; - end - fp_rnd_mode_o = instr_rdata_i[14:12]; - - // Decode Formats - unique case (instr_rdata_i[26:25]) - // FP32 - 2'b00 : fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP32; - // FP64 - 2'b01 : fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP64; - // FP16 or FP16ALT - 2'b10 : begin - // FP16alt encoded in rm field - if (instr_rdata_i[14:12]==3'b101) fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16ALT; - else fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP16; - end - // FP8 - 2'b11 : fpu_dst_fmt_o = cv32e40p_fpu_pkg::FP8; - endcase - - // By default, src=dst - fpu_src_fmt_o = fpu_dst_fmt_o; - - // decode FP intstruction - unique case (instr_rdata_i[6:0]) - // fmadd.fmt - FP Fused multiply-add - OPCODE_OP_FMADD : begin - fpu_op = cv32e40p_fpu_pkg::FMADD; - apu_op_o = 2'b00; - end - // fmsub.fmt - FP Fused multiply-subtract - OPCODE_OP_FMSUB : begin - fpu_op = cv32e40p_fpu_pkg::FMADD; - fpu_op_mod = 1'b1; - apu_op_o = 2'b01; - end - // fnmsub.fmt - FP Negated fused multiply-subtract - OPCODE_OP_FNMSUB : begin - fpu_op = cv32e40p_fpu_pkg::FNMSUB; - apu_op_o = 2'b10; - end - // fnmadd.fmt - FP Negated fused multiply-add - OPCODE_OP_FNMADD : begin - fpu_op = cv32e40p_fpu_pkg::FNMSUB; - fpu_op_mod = 1'b1; - apu_op_o = 2'b11; - end - endcase - - // check enabled formats (static) - if (~C_RVF && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP32) illegal_insn_o = 1'b1; - if ((~C_RVD) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP64) illegal_insn_o = 1'b1; - if ((~C_XF16) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP16) illegal_insn_o = 1'b1; - if ((~C_XF16ALT) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP16ALT) begin - illegal_insn_o = 1'b1; - end - if ((~C_XF8) && fpu_dst_fmt_o == cv32e40p_fpu_pkg::FP8) illegal_insn_o = 1'b1; - - // check rounding mode - unique case (instr_rdata_i[14:12]) inside - [3'b000:3'b100]: ; //legal rounding modes - 3'b101: begin // Alternative Half-Precsision encded as fmt=10 and rm=101 - if (~C_XF16ALT || fpu_dst_fmt_o != cv32e40p_fpu_pkg::FP16ALT) illegal_insn_o = 1'b1; - // actual rounding mode from frm csr - unique case (frm_i) inside - [3'b000:3'b100] : fp_rnd_mode_o = frm_i; //legal rounding modes - default : illegal_insn_o = 1'b1; - endcase - end - 3'b111: begin - // rounding mode from frm csr - unique case (frm_i) inside - [3'b000:3'b100] : fp_rnd_mode_o = frm_i; //legal rounding modes - default : illegal_insn_o = 1'b1; - endcase - end - default : illegal_insn_o = 1'b1; - endcase - - // Set latencies for FPnew from config. The C_LAT constants contain the number - // of pipeline registers. the APU takes the following values: - // 1 = single cycle (no latency), 2 = one pipestage, 3 = two or more pipestages - // format dependent latency - unique case (fpu_dst_fmt_o) - cv32e40p_fpu_pkg::FP32 : apu_lat_o = (C_LAT_FP32<2) ? C_LAT_FP32+1 : 2'h3; - cv32e40p_fpu_pkg::FP64 : apu_lat_o = (C_LAT_FP64<2) ? C_LAT_FP64+1 : 2'h3; - cv32e40p_fpu_pkg::FP16 : apu_lat_o = (C_LAT_FP16<2) ? C_LAT_FP16+1 : 2'h3; - cv32e40p_fpu_pkg::FP16ALT : apu_lat_o = (C_LAT_FP16ALT<2) ? C_LAT_FP16ALT+1 : 2'h3; - cv32e40p_fpu_pkg::FP8 : apu_lat_o = (C_LAT_FP8<2) ? C_LAT_FP8+1 : 2'h3; - default : ; - endcase - - // Set FPnew OP and OPMOD as the APU op - apu_op_o = {fpu_vec_op, fpu_op_mod, fpu_op}; - end - // FPU!=1 - else begin - illegal_insn_o = 1'b1; - end - end - - OPCODE_STORE_FP: begin - if (FPU==1) begin - data_req = 1'b1; - data_we_o = 1'b1; - rega_used_o = 1'b1; - regb_used_o = 1'b1; - alu_operator_o = ALU_ADD; - if (PULP_ZFINX==0) begin - reg_fp_b_o = 1'b1; - end else begin - reg_fp_b_o = 1'b0; - end - - // offset from immediate - imm_b_mux_sel_o = IMMB_S; - alu_op_b_mux_sel_o = OP_B_IMM; - - // pass write data through ALU operand c - alu_op_c_mux_sel_o = OP_C_REGB_OR_FWD; - - // Decode data type - unique case (instr_rdata_i[14:12]) - // fsb - FP8 store - 3'b000 : if (C_XF8) data_type_o = 2'b10; - else illegal_insn_o = 1'b1; - // fsh - FP16 store - 3'b001 : if (C_XF16 | C_XF16ALT) data_type_o = 2'b01; - else illegal_insn_o = 1'b1; - // fsw - FP32 store - 3'b010 : if (C_RVF) data_type_o = 2'b00; - else illegal_insn_o = 1'b1; - // fsd - FP64 store - 3'b011 : if (C_RVD) data_type_o = 2'b00; // 64bit stores unsupported! - else illegal_insn_o = 1'b1; - default: illegal_insn_o = 1'b1; - endcase - - // sanitize memory bus signals for illegal instr (not sure if needed??) - if (illegal_insn_o) begin - data_req = 1'b0; - data_we_o = 1'b0; - end - end - // FPU!=1 - else - illegal_insn_o = 1'b1; - end - - OPCODE_LOAD_FP: begin - if (FPU==1) begin - data_req = 1'b1; - regfile_mem_we = 1'b1; - if (PULP_ZFINX==0) begin - reg_fp_d_o = 1'b1; - end else begin - reg_fp_d_o = 1'b0; - end - rega_used_o = 1'b1; - alu_operator_o = ALU_ADD; - - // offset from immediate - imm_b_mux_sel_o = IMMB_I; - alu_op_b_mux_sel_o = OP_B_IMM; - - // NaN boxing - data_sign_extension_o = 2'b10; - - // Decode data type - unique case (instr_rdata_i[14:12]) - // flb - FP8 load - 3'b000 : if (C_XF8) data_type_o = 2'b10; - else illegal_insn_o = 1'b1; - // flh - FP16 load - 3'b001 : if (C_XF16 | C_XF16ALT) data_type_o = 2'b01; - else illegal_insn_o = 1'b1; - // flw - FP32 load - 3'b010 : if (C_RVF) data_type_o = 2'b00; - else illegal_insn_o = 1'b1; - // fld - FP64 load - 3'b011 : if (C_RVD) data_type_o = 2'b00; // 64bit loads unsupported! - else illegal_insn_o = 1'b1; - default: illegal_insn_o = 1'b1; - endcase - end - // FPU!=1 - else - illegal_insn_o = 1'b1; - end - - OPCODE_PULP_OP: begin // PULP specific ALU instructions with three source operands - if (PULP_XPULP) begin - regfile_alu_we = 1'b1; - rega_used_o = 1'b1; - regb_used_o = 1'b1; - - case (instr_rdata_i[13:12]) - 2'b00: begin // multiply with subword selection - alu_en = 1'b0; - - mult_sel_subword_o = instr_rdata_i[30]; - mult_signed_mode_o = {2{instr_rdata_i[31]}}; - - mult_imm_mux_o = MIMM_S3; - regc_mux_o = REGC_ZERO; - mult_int_en = 1'b1; - - if (instr_rdata_i[14]) - mult_operator_o = MUL_IR; - else - mult_operator_o = MUL_I; - end - - 2'b01: begin // MAC with subword selection - alu_en = 1'b0; - - mult_sel_subword_o = instr_rdata_i[30]; - mult_signed_mode_o = {2{instr_rdata_i[31]}}; - - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - mult_imm_mux_o = MIMM_S3; - mult_int_en = 1'b1; - - if (instr_rdata_i[14]) - mult_operator_o = MUL_IR; - else - mult_operator_o = MUL_I; - end - - 2'b10: begin // add with normalization and rounding - // decide between using unsigned and rounding, and combinations - // thereof - case ({instr_rdata_i[31],instr_rdata_i[14]}) - 2'b00: alu_operator_o = ALU_ADD; - 2'b01: alu_operator_o = ALU_ADDR; - 2'b10: alu_operator_o = ALU_ADDU; - 2'b11: alu_operator_o = ALU_ADDUR; - endcase - - bmask_a_mux_o = BMASK_A_ZERO; - bmask_b_mux_o = BMASK_B_S3; - - if (instr_rdata_i[30]) begin - //register variant - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - alu_bmask_b_mux_sel_o = BMASK_B_REG; - alu_op_a_mux_sel_o = OP_A_REGC_OR_FWD; - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - if(instr_rdata_i[29:25] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end - - end - - 2'b11: begin // sub with normalization and rounding - // decide between using unsigned and rounding, and combinations - // thereof - case ({instr_rdata_i[31],instr_rdata_i[14]}) - 2'b00: alu_operator_o = ALU_SUB; - 2'b01: alu_operator_o = ALU_SUBR; - 2'b10: alu_operator_o = ALU_SUBU; - 2'b11: alu_operator_o = ALU_SUBUR; - endcase - - bmask_a_mux_o = BMASK_A_ZERO; - bmask_b_mux_o = BMASK_B_S3; - - if (instr_rdata_i[30]) begin - //register variant - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - alu_bmask_b_mux_sel_o = BMASK_B_REG; - alu_op_a_mux_sel_o = OP_A_REGC_OR_FWD; - alu_op_b_mux_sel_o = OP_B_REGA_OR_FWD; - if(instr_rdata_i[29:25] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end - - end - endcase - end else begin - illegal_insn_o = 1'b1; - end - end - - OPCODE_VECOP: begin - if (PULP_XPULP) begin - regfile_alu_we = 1'b1; - rega_used_o = 1'b1; - imm_b_mux_sel_o = IMMB_VS; - - // vector size - if (instr_rdata_i[12]) begin - alu_vec_mode_o = VEC_MODE8; - mult_operator_o = MUL_DOT8; - end else begin - alu_vec_mode_o = VEC_MODE16; - mult_operator_o = MUL_DOT16; - end - - // distinguish normal vector, sc and sci modes - if (instr_rdata_i[14]) begin - scalar_replication_o = 1'b1; - - if (instr_rdata_i[13]) begin - // immediate scalar replication, .sci - alu_op_b_mux_sel_o = OP_B_IMM; - end else begin - // register scalar replication, .sc - regb_used_o = 1'b1; - end - end else begin - // normal register use - regb_used_o = 1'b1; - end - - // now decode the instruction - unique case (instr_rdata_i[31:26]) - 6'b00000_0: begin // cv.add - alu_operator_o = ALU_ADD; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00001_0: begin // cv.sub - alu_operator_o = ALU_SUB; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00010_0: begin // cv.avg - alu_operator_o = ALU_ADD; - imm_b_mux_sel_o = IMMB_VS; - bmask_b_mux_o = BMASK_B_ONE; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00011_0: begin // cv.avgu - alu_operator_o = ALU_ADDU; - imm_b_mux_sel_o = IMMB_VU; - bmask_b_mux_o = BMASK_B_ONE; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00100_0: begin // cv.min - alu_operator_o = ALU_MIN; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00101_0: begin // cv.minu - alu_operator_o = ALU_MINU; - imm_b_mux_sel_o = IMMB_VU; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00110_0: begin // cv.max - alu_operator_o = ALU_MAX; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00111_0: begin // cv.maxu - alu_operator_o = ALU_MAXU; - imm_b_mux_sel_o = IMMB_VU; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b01000_0: begin // cv.srl - alu_operator_o = ALU_SRL; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b01001_0: begin // cv.sra - alu_operator_o = ALU_SRA; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b01010_0: begin // cv.sll - alu_operator_o = ALU_SLL; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b01011_0: begin // cv.or - alu_operator_o = ALU_OR; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b01100_0: begin // cv.xor - alu_operator_o = ALU_XOR; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b01101_0: begin // cv.and - alu_operator_o = ALU_AND; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b01110_0: begin // cv.abs - alu_operator_o = ALU_ABS; - imm_b_mux_sel_o = IMMB_VS; - if (!(instr_rdata_i[14:12] == 3'b000 || instr_rdata_i[14:12] == 3'b001)) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[25:20] != 6'b000000) begin - illegal_insn_o = 1'b1; - end - end - 6'b11000_0: begin // cv.shuffle, cv.shuffleI0 - alu_operator_o = ALU_SHUF; - imm_b_mux_sel_o = IMMB_SHUF; - regb_used_o = 1'b1; - scalar_replication_o = 1'b0; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011 || instr_rdata_i[14:12] == 3'b100 - || instr_rdata_i[14:12] == 3'b101) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b11101_0, - 6'b11110_0, - 6'b11111_0: begin // cv.shuffleI1 cv.shuffleI2 cv.shuffleI3 - alu_operator_o = ALU_SHUF; - imm_b_mux_sel_o = IMMB_SHUF; - regb_used_o = 1'b1; - scalar_replication_o = 1'b0; - if (instr_rdata_i[14:12] != 3'b111) begin - illegal_insn_o = 1'b1; - end - end - 6'b11001_0: begin // cv.shuffle2 - alu_operator_o = ALU_SHUF2; - regb_used_o = 1'b1; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - scalar_replication_o = 1'b0; - if (!(instr_rdata_i[14:12] == 3'b000 || instr_rdata_i[14:12] == 3'b001)) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[25] != 1'b0) begin - illegal_insn_o = 1'b1; - end - end - 6'b11010_0: begin // cv.pack - alu_operator_o = instr_rdata_i[25] ? ALU_PCKHI : ALU_PCKLO; - regb_used_o = 1'b1; - if (instr_rdata_i[14:12] != 3'b000) begin - illegal_insn_o = 1'b1; - end - end - 6'b11011_0: begin // cv.packhi - alu_operator_o = ALU_PCKHI; - regb_used_o = 1'b1; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - if (instr_rdata_i[14:12] != 3'b001) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[25] != 1'b0) begin - illegal_insn_o = 1'b1; - end - end - 6'b11100_0: begin // cv.packlo - alu_operator_o = ALU_PCKLO; - regb_used_o = 1'b1; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - if (instr_rdata_i[14:12] != 3'b001) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[25] != 1'b0) begin - illegal_insn_o = 1'b1; - end - end - 6'b01111_0: begin // cv.extract - alu_operator_o = ALU_EXTS; - if (!(instr_rdata_i[14:12] == 3'b110 || instr_rdata_i[14:12] == 3'b111)) begin - illegal_insn_o = 1'b1; - end - end - 6'b10010_0: begin // cv.extractu - alu_operator_o = ALU_EXT; - if (!(instr_rdata_i[14:12] == 3'b110 || instr_rdata_i[14:12] == 3'b111)) begin - illegal_insn_o = 1'b1; - end - end - 6'b10110_0: begin // cv.insert - alu_operator_o = ALU_INS; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - alu_op_b_mux_sel_o = OP_B_REGC_OR_FWD; - if (!(instr_rdata_i[14:12] == 3'b110 || instr_rdata_i[14:12] == 3'b111)) begin - illegal_insn_o = 1'b1; - end - end - 6'b10000_0: begin // cv.dotup - alu_en = 1'b0; - mult_dot_en = 1'b1; - mult_dot_signed_o = 2'b00; - imm_b_mux_sel_o = IMMB_VU; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b10001_0: begin // cv.dotusp - alu_en = 1'b0; - mult_dot_en = 1'b1; - mult_dot_signed_o = 2'b01; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b10011_0: begin // cv.dotsp - alu_en = 1'b0; - mult_dot_en = 1'b1; - mult_dot_signed_o = 2'b11; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b10100_0: begin // cv.sdotup - alu_en = 1'b0; - mult_dot_en = 1'b1; - mult_dot_signed_o = 2'b00; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - imm_b_mux_sel_o = IMMB_VU; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b10101_0: begin // cv.sdotusp - alu_en = 1'b0; - mult_dot_en = 1'b1; - mult_dot_signed_o = 2'b01; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b10111_0: begin // cv.sdotsp - alu_en = 1'b0; - mult_dot_en = 1'b1; - mult_dot_signed_o = 2'b11; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - - /* COMPLEX INSTRUCTIONS */ - - 6'b01010_1: begin // cv.clpxmul.{r,i}.{/,div2,div4,div8} - alu_en = 1'b0; - mult_dot_en = 1'b1; - mult_dot_signed_o = 2'b11; - is_clpx_o = 1'b1; - regc_used_o = 1'b1; - regc_mux_o = REGC_RD; - scalar_replication_o = 1'b0; - alu_op_b_mux_sel_o = OP_B_REGB_OR_FWD; - regb_used_o = 1'b1; - illegal_insn_o = instr_rdata_i[12]; - end - - 6'b01101_1: begin // cv.subrotmj.{/,div2,div4,div8} - alu_operator_o = ALU_SUB; - is_clpx_o = 1'b1; - scalar_replication_o = 1'b0; - alu_op_b_mux_sel_o = OP_B_REGB_OR_FWD; - regb_used_o = 1'b1; - is_subrot_o = 1'b1; - if (instr_rdata_i[25] != 1'b0 || instr_rdata_i[12] != 1'b0) begin - illegal_insn_o = 1'b1; - end - end - - 6'b01011_1: begin // cv.cplxconj - alu_operator_o = ALU_ABS; - is_clpx_o = 1'b1; - scalar_replication_o = 1'b0; - regb_used_o = 1'b0; - if (instr_rdata_i[14:12] != 3'b000) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[25:20] != 6'b000000) begin - illegal_insn_o = 1'b1; - end - end - - 6'b01110_1: begin // cv.add.{div2,div4,div8} - alu_operator_o = ALU_ADD; - is_clpx_o = 1'b1; - scalar_replication_o = 1'b0; - alu_op_b_mux_sel_o = OP_B_REGB_OR_FWD; - regb_used_o = 1'b1; - if (!(instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b100 || instr_rdata_i[14:12] == 3'b110)) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[25] != 1'b0) begin - illegal_insn_o = 1'b1; - end - end - - 6'b01100_1: begin // cv.sub.{div2,div4,div8} - alu_operator_o = ALU_SUB; - is_clpx_o = 1'b1; - scalar_replication_o = 1'b0; - alu_op_b_mux_sel_o = OP_B_REGB_OR_FWD; - regb_used_o = 1'b1; - if (!(instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b100 || instr_rdata_i[14:12] == 3'b110)) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[25] != 1'b0) begin - illegal_insn_o = 1'b1; - end - end - - // comparisons, always have bit 26 set - 6'b00000_1: begin // cv.cmpeq - alu_operator_o = ALU_EQ; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00001_1: begin // cv.cmpne - alu_operator_o = ALU_NE; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00010_1: begin // cv.cmpgt - alu_operator_o = ALU_GTS; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00011_1: begin // cv.cmpge - alu_operator_o = ALU_GES; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00100_1: begin // cv.cmplt - alu_operator_o = ALU_LTS; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00101_1: begin // cv.cmple - alu_operator_o = ALU_LES; - imm_b_mux_sel_o = IMMB_VS; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00110_1: begin // cv.cmpgtu - alu_operator_o = ALU_GTU; - imm_b_mux_sel_o = IMMB_VU; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b00111_1: begin // cv.cmpgeu - alu_operator_o = ALU_GEU; - imm_b_mux_sel_o = IMMB_VU; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b01000_1: begin // cv.cmpltu - alu_operator_o = ALU_LTU; - imm_b_mux_sel_o = IMMB_VU; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - 6'b01001_1: begin // cv.cmpleu - alu_operator_o = ALU_LEU; - imm_b_mux_sel_o = IMMB_VU; - if (instr_rdata_i[14:12] == 3'b010 || instr_rdata_i[14:12] == 3'b011) begin - illegal_insn_o = 1'b1; - end - if (instr_rdata_i[14:12] != 3'b110 && instr_rdata_i[14:12] != 3'b111 && instr_rdata_i[25] != 1'b0 ) begin - illegal_insn_o = 1'b1; - end - end - - default: illegal_insn_o = 1'b1; - endcase - end else begin - illegal_insn_o = 1'b1; - end - end - - //////////////////////////////////////////////// - // ____ ____ _____ ____ ___ _ _ // - // / ___|| _ \| ____/ ___|_ _| / \ | | // - // \___ \| |_) | _|| | | | / _ \ | | // - // ___) | __/| |__| |___ | | / ___ \| |___ // - // |____/|_| |_____\____|___/_/ \_\_____| // - // // - //////////////////////////////////////////////// - - OPCODE_FENCE: begin - unique case (instr_rdata_i[14:12]) - 3'b000: begin // FENCE (FENCE.I instead, a bit more conservative) - // flush pipeline - fencei_insn_o = 1'b1; - end - - 3'b001: begin // FENCE.I - // flush prefetch buffer, flush pipeline - fencei_insn_o = 1'b1; - end - - default: begin - illegal_insn_o = 1'b1; - end - endcase - end - - OPCODE_SYSTEM: begin - if (instr_rdata_i[14:12] == 3'b000) - begin - // non CSR related SYSTEM instructions - if ( {instr_rdata_i[19:15], instr_rdata_i[11:7]} == '0) - begin - unique case (instr_rdata_i[31:20]) - 12'h000: // ECALL - begin - // environment (system) call - ecall_insn_o = 1'b1; - end - - 12'h001: // ebreak - begin - // debugger trap - ebrk_insn_o = 1'b1; - end - - 12'h302: // mret - begin - illegal_insn_o = (PULP_SECURE) ? current_priv_lvl_i != PRIV_LVL_M : 1'b0; - mret_insn_o = ~illegal_insn_o; - mret_dec_o = 1'b1; - end - - 12'h002: // uret - begin - illegal_insn_o = (PULP_SECURE) ? 1'b0 : 1'b1; - uret_insn_o = ~illegal_insn_o; - uret_dec_o = 1'b1; - end - - 12'h7b2: // dret - begin - illegal_insn_o = !debug_mode_i; - dret_insn_o = debug_mode_i; - dret_dec_o = 1'b1; - end - - 12'h105: // wfi - begin - wfi_o = 1'b1; - if (debug_wfi_no_sleep_i) begin - // Treat as NOP (do not cause sleep mode entry) - // Using decoding similar to ADDI, but without register reads/writes, i.e. - // keep regfile_alu_we = 0, rega_used_o = 0 - alu_op_b_mux_sel_o = OP_B_IMM; - imm_b_mux_sel_o = IMMB_I; - alu_operator_o = ALU_ADD; - end - end - - default: - begin - illegal_insn_o = 1'b1; - end - endcase - end else illegal_insn_o = 1'b1; - end - else - begin - // instruction to read/modify CSR - csr_access_o = 1'b1; - regfile_alu_we = 1'b1; - alu_op_b_mux_sel_o = OP_B_IMM; - imm_a_mux_sel_o = IMMA_Z; - imm_b_mux_sel_o = IMMB_I; // CSR address is encoded in I imm - - if (instr_rdata_i[14] == 1'b1) begin - // rs1 field is used as immediate - alu_op_a_mux_sel_o = OP_A_IMM; - end else begin - rega_used_o = 1'b1; - alu_op_a_mux_sel_o = OP_A_REGA_OR_FWD; - end - - // instr_rdata_i[19:14] = rs or immediate value - // if set or clear with rs==x0 or imm==0, - // then do not perform a write action - unique case (instr_rdata_i[13:12]) - 2'b01: csr_op = CSR_OP_WRITE; - 2'b10: csr_op = instr_rdata_i[19:15] == 5'b0 ? CSR_OP_READ : CSR_OP_SET; - 2'b11: csr_op = instr_rdata_i[19:15] == 5'b0 ? CSR_OP_READ : CSR_OP_CLEAR; - default: csr_illegal = 1'b1; - endcase - - if (instr_rdata_i[29:28] > current_priv_lvl_i) begin - // No access to higher privilege CSR - csr_illegal = 1'b1; - end - - // Determine if CSR access is illegal - case (instr_rdata_i[31:20]) - // Floating point - CSR_FFLAGS, - CSR_FRM, - CSR_FCSR : - if(!FPU) csr_illegal = 1'b1; - - // Writes to read only CSRs results in illegal instruction - CSR_MVENDORID, - CSR_MARCHID, - CSR_MIMPID, - CSR_MHARTID : - if(csr_op != CSR_OP_READ) csr_illegal = 1'b1; - - // These are valid CSR registers - CSR_MSTATUS, - CSR_MEPC, - CSR_MTVEC, - CSR_MCAUSE : - // Not illegal, but treat as status CSR for side effect handling - csr_status_o = 1'b1; - - // These are valid CSR registers - CSR_MISA, - CSR_MIE, - CSR_MSCRATCH, - CSR_MTVAL, - CSR_MIP : - ; // do nothing, not illegal - - // Hardware Performance Monitor - CSR_MCYCLE, - CSR_MINSTRET, - CSR_MHPMCOUNTER3, - CSR_MHPMCOUNTER4, CSR_MHPMCOUNTER5, CSR_MHPMCOUNTER6, CSR_MHPMCOUNTER7, - CSR_MHPMCOUNTER8, CSR_MHPMCOUNTER9, CSR_MHPMCOUNTER10, CSR_MHPMCOUNTER11, - CSR_MHPMCOUNTER12, CSR_MHPMCOUNTER13, CSR_MHPMCOUNTER14, CSR_MHPMCOUNTER15, - CSR_MHPMCOUNTER16, CSR_MHPMCOUNTER17, CSR_MHPMCOUNTER18, CSR_MHPMCOUNTER19, - CSR_MHPMCOUNTER20, CSR_MHPMCOUNTER21, CSR_MHPMCOUNTER22, CSR_MHPMCOUNTER23, - CSR_MHPMCOUNTER24, CSR_MHPMCOUNTER25, CSR_MHPMCOUNTER26, CSR_MHPMCOUNTER27, - CSR_MHPMCOUNTER28, CSR_MHPMCOUNTER29, CSR_MHPMCOUNTER30, CSR_MHPMCOUNTER31, - CSR_MCYCLEH, - CSR_MINSTRETH, - CSR_MHPMCOUNTER3H, - CSR_MHPMCOUNTER4H, CSR_MHPMCOUNTER5H, CSR_MHPMCOUNTER6H, CSR_MHPMCOUNTER7H, - CSR_MHPMCOUNTER8H, CSR_MHPMCOUNTER9H, CSR_MHPMCOUNTER10H, CSR_MHPMCOUNTER11H, - CSR_MHPMCOUNTER12H, CSR_MHPMCOUNTER13H, CSR_MHPMCOUNTER14H, CSR_MHPMCOUNTER15H, - CSR_MHPMCOUNTER16H, CSR_MHPMCOUNTER17H, CSR_MHPMCOUNTER18H, CSR_MHPMCOUNTER19H, - CSR_MHPMCOUNTER20H, CSR_MHPMCOUNTER21H, CSR_MHPMCOUNTER22H, CSR_MHPMCOUNTER23H, - CSR_MHPMCOUNTER24H, CSR_MHPMCOUNTER25H, CSR_MHPMCOUNTER26H, CSR_MHPMCOUNTER27H, - CSR_MHPMCOUNTER28H, CSR_MHPMCOUNTER29H, CSR_MHPMCOUNTER30H, CSR_MHPMCOUNTER31H, - CSR_MCOUNTINHIBIT, - CSR_MHPMEVENT3, - CSR_MHPMEVENT4, CSR_MHPMEVENT5, CSR_MHPMEVENT6, CSR_MHPMEVENT7, - CSR_MHPMEVENT8, CSR_MHPMEVENT9, CSR_MHPMEVENT10, CSR_MHPMEVENT11, - CSR_MHPMEVENT12, CSR_MHPMEVENT13, CSR_MHPMEVENT14, CSR_MHPMEVENT15, - CSR_MHPMEVENT16, CSR_MHPMEVENT17, CSR_MHPMEVENT18, CSR_MHPMEVENT19, - CSR_MHPMEVENT20, CSR_MHPMEVENT21, CSR_MHPMEVENT22, CSR_MHPMEVENT23, - CSR_MHPMEVENT24, CSR_MHPMEVENT25, CSR_MHPMEVENT26, CSR_MHPMEVENT27, - CSR_MHPMEVENT28, CSR_MHPMEVENT29, CSR_MHPMEVENT30, CSR_MHPMEVENT31 : - // Not illegal, but treat as status CSR to get accurate counts - csr_status_o = 1'b1; - - // Hardware Performance Monitor (unprivileged read-only mirror CSRs) - CSR_CYCLE, - CSR_INSTRET, - CSR_HPMCOUNTER3, - CSR_HPMCOUNTER4, CSR_HPMCOUNTER5, CSR_HPMCOUNTER6, CSR_HPMCOUNTER7, - CSR_HPMCOUNTER8, CSR_HPMCOUNTER9, CSR_HPMCOUNTER10, CSR_HPMCOUNTER11, - CSR_HPMCOUNTER12, CSR_HPMCOUNTER13, CSR_HPMCOUNTER14, CSR_HPMCOUNTER15, - CSR_HPMCOUNTER16, CSR_HPMCOUNTER17, CSR_HPMCOUNTER18, CSR_HPMCOUNTER19, - CSR_HPMCOUNTER20, CSR_HPMCOUNTER21, CSR_HPMCOUNTER22, CSR_HPMCOUNTER23, - CSR_HPMCOUNTER24, CSR_HPMCOUNTER25, CSR_HPMCOUNTER26, CSR_HPMCOUNTER27, - CSR_HPMCOUNTER28, CSR_HPMCOUNTER29, CSR_HPMCOUNTER30, CSR_HPMCOUNTER31, - CSR_CYCLEH, - CSR_INSTRETH, - CSR_HPMCOUNTER3H, - CSR_HPMCOUNTER4H, CSR_HPMCOUNTER5H, CSR_HPMCOUNTER6H, CSR_HPMCOUNTER7H, - CSR_HPMCOUNTER8H, CSR_HPMCOUNTER9H, CSR_HPMCOUNTER10H, CSR_HPMCOUNTER11H, - CSR_HPMCOUNTER12H, CSR_HPMCOUNTER13H, CSR_HPMCOUNTER14H, CSR_HPMCOUNTER15H, - CSR_HPMCOUNTER16H, CSR_HPMCOUNTER17H, CSR_HPMCOUNTER18H, CSR_HPMCOUNTER19H, - CSR_HPMCOUNTER20H, CSR_HPMCOUNTER21H, CSR_HPMCOUNTER22H, CSR_HPMCOUNTER23H, - CSR_HPMCOUNTER24H, CSR_HPMCOUNTER25H, CSR_HPMCOUNTER26H, CSR_HPMCOUNTER27H, - CSR_HPMCOUNTER28H, CSR_HPMCOUNTER29H, CSR_HPMCOUNTER30H, CSR_HPMCOUNTER31H : - // Read-only and readable from user mode only if the bit of mcounteren is set - if((csr_op != CSR_OP_READ) || (PULP_SECURE && (current_priv_lvl_i != PRIV_LVL_M) && !mcounteren_i[instr_rdata_i[24:20]])) begin - csr_illegal = 1'b1; - end else begin - csr_status_o = 1'b1; - end - - // This register only exists in user mode - CSR_MCOUNTEREN : - if(!PULP_SECURE) begin - csr_illegal = 1'b1; - end else begin - csr_status_o = 1'b1; - end - - // Debug register access - CSR_DCSR, - CSR_DPC, - CSR_DSCRATCH0, - CSR_DSCRATCH1 : - if(!debug_mode_i) begin - csr_illegal = 1'b1; - end else begin - csr_status_o = 1'b1; - end - - // Debug Trigger register access - CSR_TSELECT, - CSR_TDATA1, - CSR_TDATA2, - CSR_TDATA3, - CSR_TINFO, - CSR_MCONTEXT, - CSR_SCONTEXT : - if(DEBUG_TRIGGER_EN != 1) - csr_illegal = 1'b1; - - // Hardware Loop register, UHARTID access - CSR_LPSTART0, - CSR_LPEND0, - CSR_LPCOUNT0, - CSR_LPSTART1, - CSR_LPEND1, - CSR_LPCOUNT1, - CSR_UHARTID : - if(!PULP_XPULP) csr_illegal = 1'b1; - - // PRIVLV access - CSR_PRIVLV : - if(!PULP_XPULP) begin - csr_illegal = 1'b1; - end else begin - csr_status_o = 1'b1; - end - - // PMP register access - CSR_PMPCFG0, - CSR_PMPCFG1, - CSR_PMPCFG2, - CSR_PMPCFG3, - CSR_PMPADDR0, - CSR_PMPADDR1, - CSR_PMPADDR2, - CSR_PMPADDR3, - CSR_PMPADDR4, - CSR_PMPADDR5, - CSR_PMPADDR6, - CSR_PMPADDR7, - CSR_PMPADDR8, - CSR_PMPADDR9, - CSR_PMPADDR10, - CSR_PMPADDR11, - CSR_PMPADDR12, - CSR_PMPADDR13, - CSR_PMPADDR14, - CSR_PMPADDR15 : - if(!USE_PMP) csr_illegal = 1'b1; - - // User register access - CSR_USTATUS, - CSR_UEPC, - CSR_UTVEC, - CSR_UCAUSE : - if (!PULP_SECURE) begin - csr_illegal = 1'b1; - end else begin - csr_status_o = 1'b1; - end - - default : csr_illegal = 1'b1; - - endcase // case (instr_rdata_i[31:20]) - - illegal_insn_o = csr_illegal; - - end - - end - - - /////////////////////////////////////////////// - // _ ___ ___ ___ ___ ____ // - // | | | \ \ / / | / _ \ / _ \| _ \ // - // | |_| |\ \ /\ / /| | | | | | | | | |_) | // - // | _ | \ V V / | |__| |_| | |_| | __/ // - // |_| |_| \_/\_/ |_____\___/ \___/|_| // - // // - /////////////////////////////////////////////// - - OPCODE_HWLOOP: begin - if(PULP_XPULP) begin : HWLOOP_FEATURE_ENABLED - hwlp_target_mux_sel_o = 1'b0; - - unique case (instr_rdata_i[14:12]) - 3'b000: begin - // lp.starti: set start address to PC + I-type immediate - hwlp_we[0] = 1'b1; - hwlp_start_mux_sel_o = 1'b0; - if(instr_rdata_i[19:15] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end - - 3'b001: begin - // lp.endi: set end address to PC + I-type immediate - hwlp_we[1] = 1'b1; - if(instr_rdata_i[19:15] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end - - 3'b010: begin - // lp.count: initialize counter from rs1 - hwlp_we[2] = 1'b1; - hwlp_cnt_mux_sel_o = 1'b1; - rega_used_o = 1'b1; - if(instr_rdata_i[31:20] != 12'b0) begin - illegal_insn_o = 1'b1; - end - end - - 3'b011: begin - // lp.counti: initialize counter from I-type immediate - hwlp_we[2] = 1'b1; - hwlp_cnt_mux_sel_o = 1'b0; - if(instr_rdata_i[19:15] != 5'b0) begin - illegal_insn_o = 1'b1; - end - end - - 3'b100: begin - // lp.setup: initialize counter from rs1, set start address to - // next instruction and end address to PC + I-type immediate - hwlp_we = 3'b111; - hwlp_start_mux_sel_o = 1'b1; - hwlp_cnt_mux_sel_o = 1'b1; - rega_used_o = 1'b1; - end - - 3'b101: begin - // lp.setupi: initialize counter from immediate, set start address to - // next instruction and end address to PC + I-type immediate - hwlp_we = 3'b111; - hwlp_target_mux_sel_o = 1'b1; - hwlp_start_mux_sel_o = 1'b1; - hwlp_cnt_mux_sel_o = 1'b0; - end - - default: begin - illegal_insn_o = 1'b1; - end - endcase // case (instr_rdata_i[14:12]) - - if(instr_rdata_i[11:8] != 4'b0) begin - illegal_insn_o = 1'b1; - end - - - - end else begin // block: HWLOOP_FEATURE_ENABLED - illegal_insn_o = 1'b1; - end - end // case: OPCODE_HWLOOP - - default: begin - illegal_insn_o = 1'b1; - end - endcase - - - // make sure invalid compressed instruction causes an exception - if (illegal_c_insn_i) begin - illegal_insn_o = 1'b1; - end - - end - - // deassert we signals (in case of stalls) - assign alu_en_o = (deassert_we_i) ? 1'b0 : alu_en; - assign apu_en_o = (deassert_we_i) ? 1'b0 : apu_en; - assign mult_int_en_o = (deassert_we_i) ? 1'b0 : mult_int_en; - assign mult_dot_en_o = (deassert_we_i) ? 1'b0 : mult_dot_en; - assign regfile_mem_we_o = (deassert_we_i) ? 1'b0 : regfile_mem_we; - assign regfile_alu_we_o = (deassert_we_i) ? 1'b0 : regfile_alu_we; - assign data_req_o = (deassert_we_i) ? 1'b0 : data_req; - assign hwlp_we_o = (deassert_we_i) ? 3'b0 : hwlp_we; - assign csr_op_o = (deassert_we_i) ? CSR_OP_READ : csr_op; - assign ctrl_transfer_insn_in_id_o = (deassert_we_i) ? BRANCH_NONE : ctrl_transfer_insn; - - assign ctrl_transfer_insn_in_dec_o = ctrl_transfer_insn; - assign regfile_alu_we_dec_o = regfile_alu_we; - -endmodule // cv32e40p_decoder diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/algo.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/algo.h new file mode 100644 index 0000000..1707868 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/algo.h @@ -0,0 +1,114 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_ALGO_H +#define __SGI_STL_ALGO_H + +#include +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES + +// Names from +using __STD::for_each; +using __STD::find; +using __STD::find_if; +using __STD::adjacent_find; +using __STD::count; +using __STD::count_if; +using __STD::search; +using __STD::search_n; +using __STD::swap_ranges; +using __STD::transform; +using __STD::replace; +using __STD::replace_if; +using __STD::replace_copy; +using __STD::replace_copy_if; +using __STD::generate; +using __STD::generate_n; +using __STD::remove; +using __STD::remove_if; +using __STD::remove_copy; +using __STD::remove_copy_if; +using __STD::unique; +using __STD::unique_copy; +using __STD::reverse; +using __STD::reverse_copy; +using __STD::rotate; +using __STD::rotate_copy; +using __STD::random_shuffle; +using __STD::random_sample; +using __STD::random_sample_n; +using __STD::partition; +using __STD::stable_partition; +using __STD::sort; +using __STD::stable_sort; +using __STD::partial_sort; +using __STD::partial_sort_copy; +using __STD::nth_element; +using __STD::lower_bound; +using __STD::upper_bound; +using __STD::equal_range; +using __STD::binary_search; +using __STD::merge; +using __STD::inplace_merge; +using __STD::includes; +using __STD::set_union; +using __STD::set_intersection; +using __STD::set_difference; +using __STD::set_symmetric_difference; +using __STD::min_element; +using __STD::max_element; +using __STD::next_permutation; +using __STD::prev_permutation; +using __STD::find_first_of; +using __STD::find_end; +using __STD::is_sorted; +using __STD::is_heap; + +// Names from stl_heap.h +using __STD::push_heap; +using __STD::pop_heap; +using __STD::make_heap; +using __STD::sort_heap; + +// Names from +using __STD::accumulate; +using __STD::inner_product; +using __STD::partial_sum; +using __STD::adjacent_difference; +using __STD::power; +using __STD::iota; + +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_ALGO_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/algobase.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/algobase.h new file mode 100644 index 0000000..f35e7af --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/algobase.h @@ -0,0 +1,71 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_ALGOBASE_H +#define __SGI_STL_ALGOBASE_H + +#ifndef __SGI_STL_PAIR_H +#include +#endif +#ifndef __SGI_STL_ITERATOR_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_ALGOBASE_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_UNINITIALIZED_H +#include +#endif + +#ifdef __STL_USE_NAMESPACES + +// Names from stl_algobase.h +using __STD::iter_swap; +using __STD::swap; +using __STD::min; +using __STD::max; +using __STD::copy; +using __STD::copy_backward; +using __STD::copy_n; +using __STD::fill; +using __STD::fill_n; +using __STD::mismatch; +using __STD::equal; +using __STD::lexicographical_compare; +using __STD::lexicographical_compare_3way; + +// Names from stl_uninitialized.h +using __STD::uninitialized_copy; +using __STD::uninitialized_copy_n; +using __STD::uninitialized_fill; +using __STD::uninitialized_fill_n; + +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_ALGOBASE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/algorithm b/src/UWE_projectCode/SGI STL源码/SGI STL源码/algorithm new file mode 100644 index 0000000..1ba584f --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/algorithm @@ -0,0 +1,40 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_ALGORITHM +#define __SGI_STL_ALGORITHM + +#include +#include +#include +#include +#include + +#endif /* __SGI_STL_ALGORITHM */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/alloc.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/alloc.h new file mode 100644 index 0000000..f99a862 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/alloc.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 1996-1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_ALLOC_H +#define __SGI_STL_ALLOC_H + +#ifndef __STL_CONFIG_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_ALLOC_H +#include +#endif + +#ifdef __STL_USE_NAMESPACES + +using __STD::__malloc_alloc_template; +using __STD::malloc_alloc; +using __STD::simple_alloc; +using __STD::debug_alloc; +using __STD::__default_alloc_template; +using __STD::alloc; +using __STD::single_client_alloc; +#ifdef __STL_STATIC_TEMPLATE_MEMBER_BUG +using __STD::__malloc_alloc_oom_handler; +#endif /* __STL_STATIC_TEMPLATE_MEMBER_BUG */ +#ifdef __STL_USE_STD_ALLOCATORS +using __STD::allocator; +#endif /* __STL_USE_STD_ALLOCATORS */ + +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_ALLOC_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/bitset b/src/UWE_projectCode/SGI STL源码/SGI STL源码/bitset new file mode 100644 index 0000000..8328b20 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/bitset @@ -0,0 +1,1074 @@ +/* + * Copyright (c) 1998 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_BITSET +#define __SGI_STL_BITSET + +// A bitset of size N has N % (sizeof(unsigned long) * CHAR_BIT) unused +// bits. (They are the high- order bits in the highest word.) It is +// a class invariant of class bitset<> that those unused bits are +// always zero. + +// Most of the actual code isn't contained in bitset<> itself, but in the +// base class _Base_bitset. The base class works with whole words, not with +// individual bits. This allows us to specialize _Base_bitset for the +// important special case where the bitset is only a single word. + +// The C++ standard does not define the precise semantics of operator[]. +// In this implementation the const version of operator[] is equivalent +// to test(), except that it does no range checking. The non-const version +// returns a reference to a bit, again without doing any range checking. + + +#include // for size_t +#include // for memset +#include +#include // for invalid_argument, out_of_range, overflow_error + +#ifdef __STL_USE_NEW_IOSTREAMS +#include +#else +#include // for istream, ostream +#endif + +#define __BITS_PER_WORD (CHAR_BIT*sizeof(unsigned long)) +#define __BITSET_WORDS(__n) \ + ((__n) < 1 ? 1 : ((__n) + __BITS_PER_WORD - 1)/__BITS_PER_WORD) + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1209 +#endif + +// structure to aid in counting bits +template +struct _Bit_count { + static unsigned char _S_bit_count[256]; +}; + +// Mapping from 8 bit unsigned integers to the index of the first one +// bit: +template +struct _First_one { + static unsigned char _S_first_one[256]; +}; + +// +// Base class: general case. +// + +template +struct _Base_bitset { + typedef unsigned long _WordT; + + _WordT _M_w[_Nw]; // 0 is the least significant word. + + _Base_bitset( void ) { _M_do_reset(); } + _Base_bitset(unsigned long __val) { + _M_do_reset(); + _M_w[0] = __val; + } + + static size_t _S_whichword( size_t __pos ) + { return __pos / __BITS_PER_WORD; } + static size_t _S_whichbyte( size_t __pos ) + { return (__pos % __BITS_PER_WORD) / CHAR_BIT; } + static size_t _S_whichbit( size_t __pos ) + { return __pos % __BITS_PER_WORD; } + static _WordT _S_maskbit( size_t __pos ) + { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } + + _WordT& _M_getword(size_t __pos) { return _M_w[_S_whichword(__pos)]; } + _WordT _M_getword(size_t __pos) const { return _M_w[_S_whichword(__pos)]; } + + _WordT& _M_hiword() { return _M_w[_Nw - 1]; } + _WordT _M_hiword() const { return _M_w[_Nw - 1]; } + + void _M_do_and(const _Base_bitset<_Nw>& __x) { + for ( size_t __i = 0; __i < _Nw; __i++ ) { + _M_w[__i] &= __x._M_w[__i]; + } + } + + void _M_do_or(const _Base_bitset<_Nw>& __x) { + for ( size_t __i = 0; __i < _Nw; __i++ ) { + _M_w[__i] |= __x._M_w[__i]; + } + } + + void _M_do_xor(const _Base_bitset<_Nw>& __x) { + for ( size_t __i = 0; __i < _Nw; __i++ ) { + _M_w[__i] ^= __x._M_w[__i]; + } + } + + void _M_do_left_shift(size_t __shift); + void _M_do_right_shift(size_t __shift); + + void _M_do_flip() { + for ( size_t __i = 0; __i < _Nw; __i++ ) { + _M_w[__i] = ~_M_w[__i]; + } + } + + void _M_do_set() { + for ( size_t __i = 0; __i < _Nw; __i++ ) { + _M_w[__i] = ~static_cast<_WordT>(0); + } + } + + void _M_do_reset() { memset(_M_w, 0, _Nw * sizeof(_WordT)); } + + bool _M_is_equal(const _Base_bitset<_Nw>& __x) const { + for (size_t __i = 0; __i < _Nw; ++__i) { + if (_M_w[__i] != __x._M_w[__i]) + return false; + } + return true; + } + + bool _M_is_any() const { + for ( size_t __i = 0; __i < _Nw; __i++ ) { + if ( _M_w[__i] != static_cast<_WordT>(0) ) + return true; + } + return false; + } + + size_t _M_do_count() const { + size_t __result = 0; + const unsigned char* __byte_ptr = (const unsigned char*)_M_w; + const unsigned char* __end_ptr = (const unsigned char*)(_M_w+_Nw); + + while ( __byte_ptr < __end_ptr ) { + __result += _Bit_count::_S_bit_count[*__byte_ptr]; + __byte_ptr++; + } + return __result; + } + + unsigned long _M_do_to_ulong() const; + + // find first "on" bit + size_t _M_do_find_first(size_t __not_found) const; + + // find the next "on" bit that follows "prev" + size_t _M_do_find_next(size_t __prev, size_t __not_found) const; +}; + +// +// Definitions of non-inline functions from _Base_bitset. +// + +template +void _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) +{ + if (__shift != 0) { + const size_t __wshift = __shift / __BITS_PER_WORD; + const size_t __offset = __shift % __BITS_PER_WORD; + + if (__offset == 0) + for (size_t __n = _Nw - 1; __n >= __wshift; --__n) + _M_w[__n] = _M_w[__n - __wshift]; + + else { + const size_t __sub_offset = __BITS_PER_WORD - __offset; + for (size_t __n = _Nw - 1; __n > __wshift; --__n) + _M_w[__n] = (_M_w[__n - __wshift] << __offset) | + (_M_w[__n - __wshift - 1] >> __sub_offset); + _M_w[__wshift] = _M_w[0] << __offset; + } + + fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0)); + } +} + +template +void _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) +{ + if (__shift != 0) { + const size_t __wshift = __shift / __BITS_PER_WORD; + const size_t __offset = __shift % __BITS_PER_WORD; + const size_t __limit = _Nw - __wshift - 1; + + if (__offset == 0) + for (size_t __n = 0; __n <= __limit; ++__n) + _M_w[__n] = _M_w[__n + __wshift]; + + else { + const size_t __sub_offset = __BITS_PER_WORD - __offset; + for (size_t __n = 0; __n < __limit; ++__n) + _M_w[__n] = (_M_w[__n + __wshift] >> __offset) | + (_M_w[__n + __wshift + 1] << __sub_offset); + _M_w[__limit] = _M_w[_Nw-1] >> __offset; + } + + fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0)); + } +} + +template +unsigned long _Base_bitset<_Nw>::_M_do_to_ulong() const +{ + for (size_t __i = 1; __i < _Nw; ++__i) + if (_M_w[__i]) + __STL_THROW(overflow_error("bitset")); + + return _M_w[0]; +} + +template +size_t _Base_bitset<_Nw>::_M_do_find_first(size_t __not_found) const +{ + for ( size_t __i = 0; __i < _Nw; __i++ ) { + _WordT __thisword = _M_w[__i]; + if ( __thisword != static_cast<_WordT>(0) ) { + // find byte within word + for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) { + unsigned char __this_byte + = static_cast(__thisword & (~(unsigned char)0)); + if ( __this_byte ) + return __i*__BITS_PER_WORD + __j*CHAR_BIT + + _First_one::_S_first_one[__this_byte]; + + __thisword >>= CHAR_BIT; + } + } + } + // not found, so return an indication of failure. + return __not_found; +} + +template +size_t +_Base_bitset<_Nw>::_M_do_find_next(size_t __prev, size_t __not_found) const +{ + // make bound inclusive + ++__prev; + + // check out of bounds + if ( __prev >= _Nw * __BITS_PER_WORD ) + return __not_found; + + // search first word + size_t __i = _S_whichword(__prev); + _WordT __thisword = _M_w[__i]; + + // mask off bits below bound + __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev); + + if ( __thisword != static_cast<_WordT>(0) ) { + // find byte within word + // get first byte into place + __thisword >>= _S_whichbyte(__prev) * CHAR_BIT; + for ( size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++ ) { + unsigned char __this_byte + = static_cast(__thisword & (~(unsigned char)0)); + if ( __this_byte ) + return __i*__BITS_PER_WORD + __j*CHAR_BIT + + _First_one::_S_first_one[__this_byte]; + + __thisword >>= CHAR_BIT; + } + } + + // check subsequent words + __i++; + for ( ; __i < _Nw; __i++ ) { + _WordT __thisword = _M_w[__i]; + if ( __thisword != static_cast<_WordT>(0) ) { + // find byte within word + for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) { + unsigned char __this_byte + = static_cast(__thisword & (~(unsigned char)0)); + if ( __this_byte ) + return __i*__BITS_PER_WORD + __j*CHAR_BIT + + _First_one::_S_first_one[__this_byte]; + + __thisword >>= CHAR_BIT; + } + } + } + + // not found, so return an indication of failure. + return __not_found; +} // end _M_do_find_next + + +// ------------------------------------------------------------ + +// +// Base class: specialization for a single word. +// + +__STL_TEMPLATE_NULL struct _Base_bitset<1> { + typedef unsigned long _WordT; + _WordT _M_w; + + _Base_bitset( void ) : _M_w(0) {} + _Base_bitset(unsigned long __val) : _M_w(__val) {} + + static size_t _S_whichword( size_t __pos ) + { return __pos / __BITS_PER_WORD; } + static size_t _S_whichbyte( size_t __pos ) + { return (__pos % __BITS_PER_WORD) / CHAR_BIT; } + static size_t _S_whichbit( size_t __pos ) + { return __pos % __BITS_PER_WORD; } + static _WordT _S_maskbit( size_t __pos ) + { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } + + _WordT& _M_getword(size_t) { return _M_w; } + _WordT _M_getword(size_t) const { return _M_w; } + + _WordT& _M_hiword() { return _M_w; } + _WordT _M_hiword() const { return _M_w; } + + void _M_do_and(const _Base_bitset<1>& __x) { _M_w &= __x._M_w; } + void _M_do_or(const _Base_bitset<1>& __x) { _M_w |= __x._M_w; } + void _M_do_xor(const _Base_bitset<1>& __x) { _M_w ^= __x._M_w; } + void _M_do_left_shift(size_t __shift) { _M_w <<= __shift; } + void _M_do_right_shift(size_t __shift) { _M_w >>= __shift; } + void _M_do_flip() { _M_w = ~_M_w; } + void _M_do_set() { _M_w = ~static_cast<_WordT>(0); } + void _M_do_reset() { _M_w = 0; } + + bool _M_is_equal(const _Base_bitset<1>& __x) const + { return _M_w == __x._M_w; } + bool _M_is_any() const + { return _M_w != 0; } + + size_t _M_do_count() const { + size_t __result = 0; + const unsigned char* __byte_ptr = (const unsigned char*)&_M_w; + const unsigned char* __end_ptr + = ((const unsigned char*)&_M_w)+sizeof(_M_w); + while ( __byte_ptr < __end_ptr ) { + __result += _Bit_count::_S_bit_count[*__byte_ptr]; + __byte_ptr++; + } + return __result; + } + + unsigned long _M_do_to_ulong() const { return _M_w; } + + size_t _M_do_find_first(size_t __not_found) const; + + // find the next "on" bit that follows "prev" + size_t _M_do_find_next(size_t __prev, size_t __not_found) const; + +}; + +// +// Definitions of non-inline functions from the single-word version of +// _Base_bitset. +// + +size_t _Base_bitset<1>::_M_do_find_first(size_t __not_found) const +{ + _WordT __thisword = _M_w; + + if ( __thisword != static_cast<_WordT>(0) ) { + // find byte within word + for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) { + unsigned char __this_byte + = static_cast(__thisword & (~(unsigned char)0)); + if ( __this_byte ) + return __j*CHAR_BIT + _First_one::_S_first_one[__this_byte]; + + __thisword >>= CHAR_BIT; + } + } + // not found, so return a value that indicates failure. + return __not_found; +} + +size_t _Base_bitset<1>::_M_do_find_next(size_t __prev, size_t __not_found ) const +{ + // make bound inclusive + ++__prev; + + // check out of bounds + if ( __prev >= __BITS_PER_WORD ) + return __not_found; + + // search first (and only) word + _WordT __thisword = _M_w; + + // mask off bits below bound + __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev); + + if ( __thisword != static_cast<_WordT>(0) ) { + // find byte within word + // get first byte into place + __thisword >>= _S_whichbyte(__prev) * CHAR_BIT; + for ( size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++ ) { + unsigned char __this_byte + = static_cast(__thisword & (~(unsigned char)0)); + if ( __this_byte ) + return __j*CHAR_BIT + _First_one::_S_first_one[__this_byte]; + + __thisword >>= CHAR_BIT; + } + } + + // not found, so return a value that indicates failure. + return __not_found; +} // end _M_do_find_next + + +// ------------------------------------------------------------ +// Helper class to zero out the unused high-order bits in the highest word. + +template struct _Sanitize { + static void _M_do_sanitize(unsigned long& __val) + { __val &= ~((~static_cast(0)) << _Extrabits); } +}; + +__STL_TEMPLATE_NULL struct _Sanitize<0> { + static void _M_do_sanitize(unsigned long) {} +}; + + + +// ------------------------------------------------------------ +// Class bitset. +// _Nb may be any nonzero number of type size_t. + +template +class bitset : private _Base_bitset<__BITSET_WORDS(_Nb)> +{ +private: + typedef _Base_bitset<__BITSET_WORDS(_Nb)> _Base; + typedef unsigned long _WordT; + +private: + void _M_do_sanitize() { + _Sanitize<_Nb%__BITS_PER_WORD>::_M_do_sanitize(this->_M_hiword()); + } + +public: + + // bit reference: + class reference; + friend class reference; + + class reference { + friend class bitset; + + _WordT *_M_wp; + size_t _M_bpos; + + // left undefined + reference(); + + public: + reference( bitset& __b, size_t __pos ) { + _M_wp = &__b._M_getword(__pos); + _M_bpos = _Base::_S_whichbit(__pos); + } + + ~reference() {} + + // for b[i] = __x; + reference& operator=(bool __x) { + if ( __x ) + *_M_wp |= _Base::_S_maskbit(_M_bpos); + else + *_M_wp &= ~_Base::_S_maskbit(_M_bpos); + + return *this; + } + + // for b[i] = b[__j]; + reference& operator=(const reference& __j) { + if ( (*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos)) ) + *_M_wp |= _Base::_S_maskbit(_M_bpos); + else + *_M_wp &= ~_Base::_S_maskbit(_M_bpos); + + return *this; + } + + // flips the bit + bool operator~() const + { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; } + + // for __x = b[i]; + operator bool() const + { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; } + + // for b[i].flip(); + reference& flip() { + *_M_wp ^= _Base::_S_maskbit(_M_bpos); + return *this; + } + }; + + // 23.3.5.1 constructors: + bitset() {} + bitset(unsigned long __val) : _Base_bitset<__BITSET_WORDS(_Nb)>(__val) + { _M_do_sanitize(); } + +#ifdef __STL_MEMBER_TEMPLATES + template + explicit bitset(const basic_string<_CharT, _Traits, _Alloc>& __s, + size_t __pos = 0) + : _Base() + { + if (__pos > __s.size()) + __STL_THROW(out_of_range("bitset")); + _M_copy_from_string(__s, __pos, + basic_string<_CharT, _Traits, _Alloc>::npos); + } + template + bitset(const basic_string<_CharT, _Traits, _Alloc>& __s, + size_t __pos, + size_t __n) + : _Base() + { + if (__pos > __s.size()) + __STL_THROW(out_of_range("bitset")); + _M_copy_from_string(__s, __pos, __n); + } +#else /* __STL_MEMBER_TEMPLATES */ + explicit bitset(const basic_string& __s, + size_t __pos = 0, + size_t __n = basic_string::npos) + : _Base() + { + if (__pos > __s.size()) + __STL_THROW(out_of_range("bitset")); + _M_copy_from_string(__s, __pos, __n); + } +#endif /* __STL_MEMBER_TEMPLATES */ + + // 23.3.5.2 bitset operations: + bitset<_Nb>& operator&=(const bitset<_Nb>& __rhs) { + this->_M_do_and(__rhs); + return *this; + } + + bitset<_Nb>& operator|=(const bitset<_Nb>& __rhs) { + this->_M_do_or(__rhs); + return *this; + } + + bitset<_Nb>& operator^=(const bitset<_Nb>& __rhs) { + this->_M_do_xor(__rhs); + return *this; + } + + bitset<_Nb>& operator<<=(size_t __pos) { + this->_M_do_left_shift(__pos); + this->_M_do_sanitize(); + return *this; + } + + bitset<_Nb>& operator>>=(size_t __pos) { + this->_M_do_right_shift(__pos); + this->_M_do_sanitize(); + return *this; + } + + // + // Extension: + // Versions of single-bit set, reset, flip, test with no range checking. + // + + bitset<_Nb>& _Unchecked_set(size_t __pos) { + this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); + return *this; + } + + bitset<_Nb>& _Unchecked_set(size_t __pos, int __val) { + if (__val) + this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); + else + this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); + + return *this; + } + + bitset<_Nb>& _Unchecked_reset(size_t __pos) { + this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); + return *this; + } + + bitset<_Nb>& _Unchecked_flip(size_t __pos) { + this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos); + return *this; + } + + bool _Unchecked_test(size_t __pos) const { + return (this->_M_getword(__pos) & _Base::_S_maskbit(__pos)) + != static_cast<_WordT>(0); + } + + // Set, reset, and flip. + + bitset<_Nb>& set() { + this->_M_do_set(); + this->_M_do_sanitize(); + return *this; + } + + bitset<_Nb>& set(size_t __pos) { + if (__pos >= _Nb) + __STL_THROW(out_of_range("bitset")); + + return _Unchecked_set(__pos); + } + + bitset<_Nb>& set(size_t __pos, int __val) { + if (__pos >= _Nb) + __STL_THROW(out_of_range("bitset")); + + return _Unchecked_set(__pos, __val); + } + + bitset<_Nb>& reset() { + this->_M_do_reset(); + return *this; + } + + bitset<_Nb>& reset(size_t __pos) { + if (__pos >= _Nb) + __STL_THROW(out_of_range("bitset")); + + return _Unchecked_reset(__pos); + } + + bitset<_Nb>& flip() { + this->_M_do_flip(); + this->_M_do_sanitize(); + return *this; + } + + bitset<_Nb>& flip(size_t __pos) { + if (__pos >= _Nb) + __STL_THROW(out_of_range("bitset")); + + return _Unchecked_flip(__pos); + } + + bitset<_Nb> operator~() const { + return bitset<_Nb>(*this).flip(); + } + + // element access: + //for b[i]; + reference operator[](size_t __pos) { return reference(*this,__pos); } + bool operator[](size_t __pos) const { return _Unchecked_test(__pos); } + + unsigned long to_ulong() const { return this->_M_do_to_ulong(); } + +#if defined(__STL_MEMBER_TEMPLATES) && \ + defined(__STL_EXPLICIT_FUNCTION_TMPL_ARGS) + template + basic_string<_CharT, _Traits, _Alloc> to_string() const { + basic_string<_CharT, _Traits, _Alloc> __result; + _M_copy_to_string(__result); + return __result; + } +#endif /* member templates and explicit function template args */ + + // Helper functions for string operations. +#ifdef __STL_MEMBER_TEMPLATES + template + void _M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s, + size_t, + size_t); + + template + void _M_copy_to_string(basic_string<_CharT,_Traits,_Alloc>&) const; +#else /* __STL_MEMBER_TEMPLATES */ + void _M_copy_from_string(const basic_string&, size_t, size_t); + void _M_copy_to_string(basic_string&) const; +#endif /* __STL_MEMBER_TEMPLATES */ + + size_t count() const { return this->_M_do_count(); } + + size_t size() const { return _Nb; } + + bool operator==(const bitset<_Nb>& __rhs) const { + return this->_M_is_equal(__rhs); + } + bool operator!=(const bitset<_Nb>& __rhs) const { + return !this->_M_is_equal(__rhs); + } + + bool test(size_t __pos) const { + if (__pos > _Nb) + __STL_THROW(out_of_range("bitset")); + + return _Unchecked_test(__pos); + } + + bool any() const { return this->_M_is_any(); } + bool none() const { return !this->_M_is_any(); } + + bitset<_Nb> operator<<(size_t __pos) const + { return bitset<_Nb>(*this) <<= __pos; } + bitset<_Nb> operator>>(size_t __pos) const + { return bitset<_Nb>(*this) >>= __pos; } + + // + // EXTENSIONS: bit-find operations. These operations are + // experimental, and are subject to change or removal in future + // versions. + // + + // find the index of the first "on" bit + size_t _Find_first() const + { return this->_M_do_find_first(_Nb); } + + // find the index of the next "on" bit after prev + size_t _Find_next( size_t __prev ) const + { return this->_M_do_find_next(__prev, _Nb); } + +}; + +// +// Definitions of non-inline member functions. +// + +#ifdef __STL_MEMBER_TEMPLATES + +template +template +void bitset<_Nb> + ::_M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s, + size_t __pos, + size_t __n) +{ + reset(); + const size_t __nbits = min(_Nb, min(__n, __s.size() - __pos)); + for (size_t __i = 0; __i < __nbits; ++__i) { + switch(__s[__pos + __nbits - __i - 1]) { + case '0': + break; + case '1': + set(__i); + break; + default: + __STL_THROW(invalid_argument("bitset")); + } + } +} + +template +template +void bitset<_Nb> + ::_M_copy_to_string(basic_string<_CharT, _Traits, _Alloc>& __s) const +{ + __s.assign(_Nb, '0'); + + for (size_t __i = 0; __i < _Nb; ++__i) + if (_Unchecked_test(__i)) + __s[_Nb - 1 - __i] = '1'; +} + +#else /* __STL_MEMBER_TEMPLATES */ + +template +void bitset<_Nb>::_M_copy_from_string(const basic_string& __s, + size_t __pos, size_t __n) +{ + reset(); + size_t __tmp = _Nb; + const size_t __nbits = min(__tmp, min(__n, __s.size() - __pos)); + for (size_t __i = 0; __i < __nbits; ++__i) { + switch(__s[__pos + __nbits - __i - 1]) { + case '0': + break; + case '1': + set(__i); + break; + default: + __STL_THROW(invalid_argument("bitset")); + } + } +} + +template +void bitset<_Nb>::_M_copy_to_string(basic_string& __s) const +{ + __s.assign(_Nb, '0'); + + for (size_t __i = 0; __i < _Nb; ++__i) + if (_Unchecked_test(__i)) + __s[_Nb - 1 - __i] = '1'; +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +// ------------------------------------------------------------ + +// +// 23.3.5.3 bitset operations: +// + +template +inline bitset<_Nb> operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) { + bitset<_Nb> __result(__x); + __result &= __y; + return __result; +} + + +template +inline bitset<_Nb> operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) { + bitset<_Nb> __result(__x); + __result |= __y; + return __result; +} + +template +inline bitset<_Nb> operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) { + bitset<_Nb> __result(__x); + __result ^= __y; + return __result; +} + +#ifdef __STL_USE_NEW_IOSTREAMS + +template +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x) +{ + basic_string<_CharT, _Traits> __tmp; + __tmp.reserve(_Nb); + + // Skip whitespace + typename basic_istream<_CharT, _Traits>::sentry __sentry(__is); + if (__sentry) { + basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf(); + for (size_t __i = 0; __i < _Nb; ++__i) { + static _Traits::int_type __eof = _Traits::eof(); + + typename _Traits::int_type __c1 = __buf->sbumpc(); + if (_Traits::eq_int_type(__c1, __eof)) { + __is.setstate(ios_base::eofbit); + break; + } + else { + char __c2 = _Traits::to_char_type(__c1); + char __c = __is.narrow(__c2, '*'); + + if (__c == '0' || __c == '1') + __tmp.push_back(__c); + else if (_Traits::eq_int_type(__buf->sputbackc(__c2), __eof)) { + __is.setstate(ios_base::failbit); + break; + } + } + } + + if (__tmp.empty()) + __is.setstate(ios_base::failbit); + else + __x._M_copy_from_string(__tmp, static_cast(0), _Nb); + } + + return __is; +} + +template +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Nb>& __x) +{ + basic_string<_CharT, _Traits> __tmp; + __x._M_copy_to_string(__tmp); + return __os << __tmp; +} + +#else /* __STL_USE_NEW_IOSTREAMS */ + +template +istream& operator>>(istream& __is, bitset<_Nb>& __x) { + string __tmp; + __tmp.reserve(_Nb); + + if (__is.flags() & ios::skipws) { + char __c; + do + __is.get(__c); + while (__is && isspace(__c)); + if (__is) + __is.putback(__c); + } + + for (size_t __i = 0; __i < _Nb; ++__i) { + char __c; + __is.get(__c); + + if (!__is) + break; + else if (__c != '0' && __c != '1') { + __is.putback(__c); + break; + } + else + __tmp.push_back(__c); + } + + if (__tmp.empty()) + __is.clear(__is.rdstate() | ios::failbit); + else + __x._M_copy_from_string(__tmp, static_cast(0), _Nb); + + return __is; +} + +template +ostream& operator<<(ostream& __os, const bitset<_Nb>& __x) { + string __tmp; + __x._M_copy_to_string(__tmp); + return __os << __tmp; +} + +#endif /* __STL_USE_NEW_IOSTREAMS */ + +// ------------------------------------------------------------ +// Lookup tables for find and count operations. + +template +unsigned char _Bit_count<__dummy>::_S_bit_count[] = { + 0, /* 0 */ 1, /* 1 */ 1, /* 2 */ 2, /* 3 */ 1, /* 4 */ + 2, /* 5 */ 2, /* 6 */ 3, /* 7 */ 1, /* 8 */ 2, /* 9 */ + 2, /* 10 */ 3, /* 11 */ 2, /* 12 */ 3, /* 13 */ 3, /* 14 */ + 4, /* 15 */ 1, /* 16 */ 2, /* 17 */ 2, /* 18 */ 3, /* 19 */ + 2, /* 20 */ 3, /* 21 */ 3, /* 22 */ 4, /* 23 */ 2, /* 24 */ + 3, /* 25 */ 3, /* 26 */ 4, /* 27 */ 3, /* 28 */ 4, /* 29 */ + 4, /* 30 */ 5, /* 31 */ 1, /* 32 */ 2, /* 33 */ 2, /* 34 */ + 3, /* 35 */ 2, /* 36 */ 3, /* 37 */ 3, /* 38 */ 4, /* 39 */ + 2, /* 40 */ 3, /* 41 */ 3, /* 42 */ 4, /* 43 */ 3, /* 44 */ + 4, /* 45 */ 4, /* 46 */ 5, /* 47 */ 2, /* 48 */ 3, /* 49 */ + 3, /* 50 */ 4, /* 51 */ 3, /* 52 */ 4, /* 53 */ 4, /* 54 */ + 5, /* 55 */ 3, /* 56 */ 4, /* 57 */ 4, /* 58 */ 5, /* 59 */ + 4, /* 60 */ 5, /* 61 */ 5, /* 62 */ 6, /* 63 */ 1, /* 64 */ + 2, /* 65 */ 2, /* 66 */ 3, /* 67 */ 2, /* 68 */ 3, /* 69 */ + 3, /* 70 */ 4, /* 71 */ 2, /* 72 */ 3, /* 73 */ 3, /* 74 */ + 4, /* 75 */ 3, /* 76 */ 4, /* 77 */ 4, /* 78 */ 5, /* 79 */ + 2, /* 80 */ 3, /* 81 */ 3, /* 82 */ 4, /* 83 */ 3, /* 84 */ + 4, /* 85 */ 4, /* 86 */ 5, /* 87 */ 3, /* 88 */ 4, /* 89 */ + 4, /* 90 */ 5, /* 91 */ 4, /* 92 */ 5, /* 93 */ 5, /* 94 */ + 6, /* 95 */ 2, /* 96 */ 3, /* 97 */ 3, /* 98 */ 4, /* 99 */ + 3, /* 100 */ 4, /* 101 */ 4, /* 102 */ 5, /* 103 */ 3, /* 104 */ + 4, /* 105 */ 4, /* 106 */ 5, /* 107 */ 4, /* 108 */ 5, /* 109 */ + 5, /* 110 */ 6, /* 111 */ 3, /* 112 */ 4, /* 113 */ 4, /* 114 */ + 5, /* 115 */ 4, /* 116 */ 5, /* 117 */ 5, /* 118 */ 6, /* 119 */ + 4, /* 120 */ 5, /* 121 */ 5, /* 122 */ 6, /* 123 */ 5, /* 124 */ + 6, /* 125 */ 6, /* 126 */ 7, /* 127 */ 1, /* 128 */ 2, /* 129 */ + 2, /* 130 */ 3, /* 131 */ 2, /* 132 */ 3, /* 133 */ 3, /* 134 */ + 4, /* 135 */ 2, /* 136 */ 3, /* 137 */ 3, /* 138 */ 4, /* 139 */ + 3, /* 140 */ 4, /* 141 */ 4, /* 142 */ 5, /* 143 */ 2, /* 144 */ + 3, /* 145 */ 3, /* 146 */ 4, /* 147 */ 3, /* 148 */ 4, /* 149 */ + 4, /* 150 */ 5, /* 151 */ 3, /* 152 */ 4, /* 153 */ 4, /* 154 */ + 5, /* 155 */ 4, /* 156 */ 5, /* 157 */ 5, /* 158 */ 6, /* 159 */ + 2, /* 160 */ 3, /* 161 */ 3, /* 162 */ 4, /* 163 */ 3, /* 164 */ + 4, /* 165 */ 4, /* 166 */ 5, /* 167 */ 3, /* 168 */ 4, /* 169 */ + 4, /* 170 */ 5, /* 171 */ 4, /* 172 */ 5, /* 173 */ 5, /* 174 */ + 6, /* 175 */ 3, /* 176 */ 4, /* 177 */ 4, /* 178 */ 5, /* 179 */ + 4, /* 180 */ 5, /* 181 */ 5, /* 182 */ 6, /* 183 */ 4, /* 184 */ + 5, /* 185 */ 5, /* 186 */ 6, /* 187 */ 5, /* 188 */ 6, /* 189 */ + 6, /* 190 */ 7, /* 191 */ 2, /* 192 */ 3, /* 193 */ 3, /* 194 */ + 4, /* 195 */ 3, /* 196 */ 4, /* 197 */ 4, /* 198 */ 5, /* 199 */ + 3, /* 200 */ 4, /* 201 */ 4, /* 202 */ 5, /* 203 */ 4, /* 204 */ + 5, /* 205 */ 5, /* 206 */ 6, /* 207 */ 3, /* 208 */ 4, /* 209 */ + 4, /* 210 */ 5, /* 211 */ 4, /* 212 */ 5, /* 213 */ 5, /* 214 */ + 6, /* 215 */ 4, /* 216 */ 5, /* 217 */ 5, /* 218 */ 6, /* 219 */ + 5, /* 220 */ 6, /* 221 */ 6, /* 222 */ 7, /* 223 */ 3, /* 224 */ + 4, /* 225 */ 4, /* 226 */ 5, /* 227 */ 4, /* 228 */ 5, /* 229 */ + 5, /* 230 */ 6, /* 231 */ 4, /* 232 */ 5, /* 233 */ 5, /* 234 */ + 6, /* 235 */ 5, /* 236 */ 6, /* 237 */ 6, /* 238 */ 7, /* 239 */ + 4, /* 240 */ 5, /* 241 */ 5, /* 242 */ 6, /* 243 */ 5, /* 244 */ + 6, /* 245 */ 6, /* 246 */ 7, /* 247 */ 5, /* 248 */ 6, /* 249 */ + 6, /* 250 */ 7, /* 251 */ 6, /* 252 */ 7, /* 253 */ 7, /* 254 */ + 8 /* 255 */ +}; // end _Bit_count + +template +unsigned char _First_one<__dummy>::_S_first_one[] = { + 0, /* 0 */ 0, /* 1 */ 1, /* 2 */ 0, /* 3 */ 2, /* 4 */ + 0, /* 5 */ 1, /* 6 */ 0, /* 7 */ 3, /* 8 */ 0, /* 9 */ + 1, /* 10 */ 0, /* 11 */ 2, /* 12 */ 0, /* 13 */ 1, /* 14 */ + 0, /* 15 */ 4, /* 16 */ 0, /* 17 */ 1, /* 18 */ 0, /* 19 */ + 2, /* 20 */ 0, /* 21 */ 1, /* 22 */ 0, /* 23 */ 3, /* 24 */ + 0, /* 25 */ 1, /* 26 */ 0, /* 27 */ 2, /* 28 */ 0, /* 29 */ + 1, /* 30 */ 0, /* 31 */ 5, /* 32 */ 0, /* 33 */ 1, /* 34 */ + 0, /* 35 */ 2, /* 36 */ 0, /* 37 */ 1, /* 38 */ 0, /* 39 */ + 3, /* 40 */ 0, /* 41 */ 1, /* 42 */ 0, /* 43 */ 2, /* 44 */ + 0, /* 45 */ 1, /* 46 */ 0, /* 47 */ 4, /* 48 */ 0, /* 49 */ + 1, /* 50 */ 0, /* 51 */ 2, /* 52 */ 0, /* 53 */ 1, /* 54 */ + 0, /* 55 */ 3, /* 56 */ 0, /* 57 */ 1, /* 58 */ 0, /* 59 */ + 2, /* 60 */ 0, /* 61 */ 1, /* 62 */ 0, /* 63 */ 6, /* 64 */ + 0, /* 65 */ 1, /* 66 */ 0, /* 67 */ 2, /* 68 */ 0, /* 69 */ + 1, /* 70 */ 0, /* 71 */ 3, /* 72 */ 0, /* 73 */ 1, /* 74 */ + 0, /* 75 */ 2, /* 76 */ 0, /* 77 */ 1, /* 78 */ 0, /* 79 */ + 4, /* 80 */ 0, /* 81 */ 1, /* 82 */ 0, /* 83 */ 2, /* 84 */ + 0, /* 85 */ 1, /* 86 */ 0, /* 87 */ 3, /* 88 */ 0, /* 89 */ + 1, /* 90 */ 0, /* 91 */ 2, /* 92 */ 0, /* 93 */ 1, /* 94 */ + 0, /* 95 */ 5, /* 96 */ 0, /* 97 */ 1, /* 98 */ 0, /* 99 */ + 2, /* 100 */ 0, /* 101 */ 1, /* 102 */ 0, /* 103 */ 3, /* 104 */ + 0, /* 105 */ 1, /* 106 */ 0, /* 107 */ 2, /* 108 */ 0, /* 109 */ + 1, /* 110 */ 0, /* 111 */ 4, /* 112 */ 0, /* 113 */ 1, /* 114 */ + 0, /* 115 */ 2, /* 116 */ 0, /* 117 */ 1, /* 118 */ 0, /* 119 */ + 3, /* 120 */ 0, /* 121 */ 1, /* 122 */ 0, /* 123 */ 2, /* 124 */ + 0, /* 125 */ 1, /* 126 */ 0, /* 127 */ 7, /* 128 */ 0, /* 129 */ + 1, /* 130 */ 0, /* 131 */ 2, /* 132 */ 0, /* 133 */ 1, /* 134 */ + 0, /* 135 */ 3, /* 136 */ 0, /* 137 */ 1, /* 138 */ 0, /* 139 */ + 2, /* 140 */ 0, /* 141 */ 1, /* 142 */ 0, /* 143 */ 4, /* 144 */ + 0, /* 145 */ 1, /* 146 */ 0, /* 147 */ 2, /* 148 */ 0, /* 149 */ + 1, /* 150 */ 0, /* 151 */ 3, /* 152 */ 0, /* 153 */ 1, /* 154 */ + 0, /* 155 */ 2, /* 156 */ 0, /* 157 */ 1, /* 158 */ 0, /* 159 */ + 5, /* 160 */ 0, /* 161 */ 1, /* 162 */ 0, /* 163 */ 2, /* 164 */ + 0, /* 165 */ 1, /* 166 */ 0, /* 167 */ 3, /* 168 */ 0, /* 169 */ + 1, /* 170 */ 0, /* 171 */ 2, /* 172 */ 0, /* 173 */ 1, /* 174 */ + 0, /* 175 */ 4, /* 176 */ 0, /* 177 */ 1, /* 178 */ 0, /* 179 */ + 2, /* 180 */ 0, /* 181 */ 1, /* 182 */ 0, /* 183 */ 3, /* 184 */ + 0, /* 185 */ 1, /* 186 */ 0, /* 187 */ 2, /* 188 */ 0, /* 189 */ + 1, /* 190 */ 0, /* 191 */ 6, /* 192 */ 0, /* 193 */ 1, /* 194 */ + 0, /* 195 */ 2, /* 196 */ 0, /* 197 */ 1, /* 198 */ 0, /* 199 */ + 3, /* 200 */ 0, /* 201 */ 1, /* 202 */ 0, /* 203 */ 2, /* 204 */ + 0, /* 205 */ 1, /* 206 */ 0, /* 207 */ 4, /* 208 */ 0, /* 209 */ + 1, /* 210 */ 0, /* 211 */ 2, /* 212 */ 0, /* 213 */ 1, /* 214 */ + 0, /* 215 */ 3, /* 216 */ 0, /* 217 */ 1, /* 218 */ 0, /* 219 */ + 2, /* 220 */ 0, /* 221 */ 1, /* 222 */ 0, /* 223 */ 5, /* 224 */ + 0, /* 225 */ 1, /* 226 */ 0, /* 227 */ 2, /* 228 */ 0, /* 229 */ + 1, /* 230 */ 0, /* 231 */ 3, /* 232 */ 0, /* 233 */ 1, /* 234 */ + 0, /* 235 */ 2, /* 236 */ 0, /* 237 */ 1, /* 238 */ 0, /* 239 */ + 4, /* 240 */ 0, /* 241 */ 1, /* 242 */ 0, /* 243 */ 2, /* 244 */ + 0, /* 245 */ 1, /* 246 */ 0, /* 247 */ 3, /* 248 */ 0, /* 249 */ + 1, /* 250 */ 0, /* 251 */ 2, /* 252 */ 0, /* 253 */ 1, /* 254 */ + 0, /* 255 */ +}; // end _First_one + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1209 +#endif + +__STL_END_NAMESPACE + + +#undef __BITS_PER_WORD +#undef __BITSET_WORDS + +#endif /* __SGI_STL_BITSET */ + + +// Local Variables: +// mode:C++ +// End: + diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/bvector.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/bvector.h new file mode 100644 index 0000000..af494c5 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/bvector.h @@ -0,0 +1,52 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_BVECTOR_H +#define __SGI_STL_BVECTOR_H + +#include +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION +#include +#else +#include +#include +#endif + +#include + +#ifdef __STL_USE_NAMESPACES + +using __STD::bit_vector; + +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_BVECTOR_H */ + +// Local Variables: +// mode:C++ +// End: + + diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/char_traits.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/char_traits.h new file mode 100644 index 0000000..091efc2 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/char_traits.h @@ -0,0 +1,152 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_CHAR_TRAITS_H +#define __SGI_STL_CHAR_TRAITS_H + +#include +#include + +#if defined(__STL_USE_NEW_IOSTREAMS) && !defined(__SGI_STL_IOSFWD) +#include +#endif /* use new iostreams */ + +__STL_BEGIN_NAMESPACE + +// Class __char_traits_base. + +template class __char_traits_base { +public: + typedef _CharT char_type; + typedef _IntT int_type; +#ifdef __STL_USE_NEW_IOSTREAMS + typedef streamoff off_type; + typedef streampos pos_type; + typedef mbstate_t state_type; +#endif /* __STL_USE_NEW_IOSTREAMS */ + + static void assign(char_type& __c1, const char_type& __c2) { __c1 = __c2; } + static bool eq(const _CharT& __c1, const _CharT& __c2) + { return __c1 == __c2; } + static bool lt(const _CharT& __c1, const _CharT& __c2) + { return __c1 < __c2; } + + static int compare(const _CharT* __s1, const _CharT* __s2, size_t __n) { + for (size_t __i = 0; __i < __n; ++__i) + if (!eq(__s1[__i], __s2[__i])) + return __s1[__i] < __s2[__i] ? -1 : 1; + return 0; + } + + static size_t length(const _CharT* __s) { + const _CharT __nullchar = _CharT(); + size_t __i; + for (__i = 0; !eq(__s[__i], __nullchar); ++__i) + {} + return __i; + } + + static const _CharT* find(const _CharT* __s, size_t __n, const _CharT& __c) + { + for ( ; __n > 0 ; ++__s, --__n) + if (eq(*__s, __c)) + return __s; + return 0; + } + + static _CharT* move(_CharT* __s1, const _CharT* __s2, size_t __n) { + memmove(__s1, __s2, __n * sizeof(_CharT)); + return __s1; + } + + static _CharT* copy(_CharT* __s1, const _CharT* __s2, size_t __n) { + memcpy(__s1, __s2, __n * sizeof(_CharT)); + return __s1; + } + + static _CharT* assign(_CharT* __s, size_t __n, _CharT __c) { + for (size_t __i = 0; __i < __n; ++__i) + __s[__i] = __c; + return __s; + } + + static int_type not_eof(const int_type& __c) { + return !eq_int_type(__c, eof()) ? __c : 0; + } + + static char_type to_char_type(const int_type& __c) { + return static_cast(__c); + } + + static int_type to_int_type(const char_type& __c) { + return static_cast(__c); + } + + static bool eq_int_type(const int_type& __c1, const int_type& __c2) { + return __c1 == __c2; + } + + static int_type eof() { + return static_cast(-1); + } +}; + +// Generic char_traits class. Note that this class is provided only +// as a base for explicit specialization; it is unlikely to be useful +// as is for any particular user-defined type. In particular, it +// *will not work* for a non-POD type. + +template class char_traits + : public __char_traits_base<_CharT, _CharT> +{}; + +// Specialization for char. + +__STL_TEMPLATE_NULL class char_traits + : public __char_traits_base +{ +public: + static char_type to_char_type(const int_type& __c) { + return static_cast(static_cast(__c)); + } + + static int_type to_int_type(const char_type& __c) { + return static_cast(__c); + } + + static int compare(const char* __s1, const char* __s2, size_t __n) + { return memcmp(__s1, __s2, __n); } + + static size_t length(const char* __s) { return strlen(__s); } + + static void assign(char& __c1, const char& __c2) { __c1 = __c2; } + + static char* assign(char* __s, size_t __n, char __c) + { memset(__s, __c, __n); return __s; } +}; + +// Specialization for wchar_t. + +__STL_TEMPLATE_NULL class char_traits + : public __char_traits_base +{}; + + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_CHAR_TRAITS_H */ + +// Local Variables: +// mode:C++ +// End: + diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/concept_checks.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/concept_checks.h new file mode 100644 index 0000000..36df283 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/concept_checks.h @@ -0,0 +1,811 @@ +/* + * Copyright (c) 1999 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __CONCEPT_CHECKS_H +#define __CONCEPT_CHECKS_H + +/* + Use these macro like assertions, but they assert properties + on types (usually template arguments). In technical terms they + verify whether a type "models" a "concept". + + This set of requirements and the terminology used here is derived + from the book "Generic Programming and the STL" by Matt Austern + (Addison Wesley). For further information please consult that + book. The requirements also are intended to match the ANSI/ISO C++ + standard. + + This file covers the basic concepts and the iterator concepts. + There are several other files that provide the requirements + for the STL containers: + container_concepts.h + sequence_concepts.h + assoc_container_concepts.h + + Jeremy Siek, 1999 + + TO DO: + - some issues with regards to concept classification and mutability + including AssociativeContianer -> ForwardContainer + and SortedAssociativeContainer -> ReversibleContainer + - HashedAssociativeContainer + - Allocator + - Function Object Concepts + + */ + +#ifndef __STL_USE_CONCEPT_CHECKS + +// Some compilers lack the features that are necessary for concept checks. +// On those compilers we define the concept check macros to do nothing. +#define __STL_REQUIRES(__type_var, __concept) do {} while(0) +#define __STL_CLASS_REQUIRES(__type_var, __concept) \ + static int __##__type_var##_##__concept +#define __STL_CONVERTIBLE(__type_x, __type_y) do {} while(0) +#define __STL_REQUIRES_SAME_TYPE(__type_x, __type_y) do {} while(0) +#define __STL_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \ + static int __##__type_x##__type_y##_require_same_type +#define __STL_GENERATOR_CHECK(__func, __ret) do {} while(0) +#define __STL_CLASS_GENERATOR_CHECK(__func, __ret) \ + static int __##__func##__ret##_generator_check +#define __STL_UNARY_FUNCTION_CHECK(__func, __ret, __arg) do {} while(0) +#define __STL_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \ + static int __##__func##__ret##__arg##_unary_function_check +#define __STL_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \ + do {} while(0) +#define __STL_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \ + static int __##__func##__ret##__first##__second##_binary_function_check +#define __STL_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \ + do {} while(0) +#define __STL_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \ + static int __##__opname##__ret##__first##__second##_require_binary_op + +#else /* __STL_USE_CONCEPT_CHECKS */ + +// This macro tests whether the template argument "__type_var" +// satisfies the requirements of "__concept". Here is a list of concepts +// that we know how to check: +// _Allocator +// _Assignable +// _DefaultConstructible +// _EqualityComparable +// _LessThanComparable +// _TrivialIterator +// _InputIterator +// _OutputIterator +// _ForwardIterator +// _BidirectionalIterator +// _RandomAccessIterator +// _Mutable_TrivialIterator +// _Mutable_ForwardIterator +// _Mutable_BidirectionalIterator +// _Mutable_RandomAccessIterator + +#define __STL_REQUIRES(__type_var, __concept) \ +do { \ + void (*__x)( __type_var ) = __concept##_concept_specification< __type_var >\ + ::__concept##_requirement_violation; __x = __x; } while (0) + +// Use this to check whether type X is convertible to type Y +#define __STL_CONVERTIBLE(__type_x, __type_y) \ +do { \ + void (*__x)( __type_x , __type_y ) = _STL_CONVERT_ERROR< __type_x , \ + __type_y >::__type_X_is_not_convertible_to_type_Y; \ + __x = __x; } while (0) + +// Use this to test whether two template arguments are the same type +#define __STL_REQUIRES_SAME_TYPE(__type_x, __type_y) \ +do { \ + void (*__x)( __type_x , __type_y ) = _STL_SAME_TYPE_ERROR< __type_x, \ + __type_y >::__type_X_not_same_as_type_Y; \ + __x = __x; } while (0) + + +// function object checks +#define __STL_GENERATOR_CHECK(__func, __ret) \ +do { \ + __ret (*__x)( __func&) = \ + _STL_GENERATOR_ERROR< \ + __func, __ret>::__generator_requirement_violation; \ + __x = __x; } while (0) + + +#define __STL_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \ +do { \ + __ret (*__x)( __func&, const __arg& ) = \ + _STL_UNARY_FUNCTION_ERROR< \ + __func, __ret, __arg>::__unary_function_requirement_violation; \ + __x = __x; } while (0) + + +#define __STL_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \ +do { \ + __ret (*__x)( __func&, const __first&, const __second& ) = \ + _STL_BINARY_FUNCTION_ERROR< \ + __func, __ret, __first, __second>::__binary_function_requirement_violation; \ + __x = __x; } while (0) + + +#define __STL_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \ + do { \ + __ret (*__x)( __first&, __second& ) = _STL_BINARY##__opname##_ERROR< \ + __ret, __first, __second>::__binary_operator_requirement_violation; \ + __ret (*__y)( const __first&, const __second& ) = \ + _STL_BINARY##__opname##_ERROR< __ret, __first, __second>:: \ + __const_binary_operator_requirement_violation; \ + __y = __y; __x = __x; } while (0) + + +#ifdef __STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE + +#define __STL_CLASS_REQUIRES(__type_var, __concept) +#define __STL_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) +#define __STL_CLASS_GENERATOR_CHECK(__func, __ret) +#define __STL_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) +#define __STL_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) +#define __STL_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) + +#else + +// Use this macro inside of template classes, where you would +// like to place requirements on the template arguments to the class +// Warning: do not pass pointers and such (e.g. T*) in as the __type_var, +// since the type_var is used to construct identifiers. Instead typedef +// the pointer type, then use the typedef name for the __type_var. +#define __STL_CLASS_REQUIRES(__type_var, __concept) \ + typedef void (* __func##__type_var##__concept)( __type_var ); \ + template <__func##__type_var##__concept _Tp1> \ + struct __dummy_struct_##__type_var##__concept { }; \ + static __dummy_struct_##__type_var##__concept< \ + __concept##_concept_specification< \ + __type_var>::__concept##_requirement_violation> \ + __dummy_ptr_##__type_var##__concept + + +#define __STL_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \ + typedef void (* __func_##__type_x##__type_y##same_type)( __type_x, \ + __type_y ); \ + template < __func_##__type_x##__type_y##same_type _Tp1> \ + struct __dummy_struct_##__type_x##__type_y##_same_type { }; \ + static __dummy_struct_##__type_x##__type_y##_same_type< \ + _STL_SAME_TYPE_ERROR<__type_x, __type_y>::__type_X_not_same_as_type_Y> \ + __dummy_ptr_##__type_x##__type_y##_same_type + + +#define __STL_CLASS_GENERATOR_CHECK(__func, __ret) \ + typedef __ret (* __f_##__func##__ret##_generator)( __func& ); \ + template <__f_##__func##__ret##_generator _Tp1> \ + struct __dummy_struct_##__func##__ret##_generator { }; \ + static __dummy_struct_##__func##__ret##_generator< \ + _STL_GENERATOR_ERROR< \ + __func, __ret>::__generator_requirement_violation> \ + __dummy_ptr_##__func##__ret##_generator + + +#define __STL_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \ + typedef __ret (* __f_##__func##__ret##__arg##_unary_check)( __func&, \ + const __arg& ); \ + template <__f_##__func##__ret##__arg##_unary_check _Tp1> \ + struct __dummy_struct_##__func##__ret##__arg##_unary_check { }; \ + static __dummy_struct_##__func##__ret##__arg##_unary_check< \ + _STL_UNARY_FUNCTION_ERROR< \ + __func, __ret, __arg>::__unary_function_requirement_violation> \ + __dummy_ptr_##__func##__ret##__arg##_unary_check + + +#define __STL_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \ + typedef __ret (* __f_##__func##__ret##__first##__second##_binary_check)( __func&, const __first&,\ + const __second& ); \ + template <__f_##__func##__ret##__first##__second##_binary_check _Tp1> \ + struct __dummy_struct_##__func##__ret##__first##__second##_binary_check { }; \ + static __dummy_struct_##__func##__ret##__first##__second##_binary_check< \ + _STL_BINARY_FUNCTION_ERROR<__func, __ret, __first, __second>:: \ + __binary_function_requirement_violation> \ + __dummy_ptr_##__func##__ret##__first##__second##_binary_check + + +#define __STL_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \ + typedef __ret (* __f_##__func##__ret##__first##__second##_binary_op)(const __first&, \ + const __second& ); \ + template <__f_##__func##__ret##__first##__second##_binary_op _Tp1> \ + struct __dummy_struct_##__func##__ret##__first##__second##_binary_op { }; \ + static __dummy_struct_##__func##__ret##__first##__second##_binary_op< \ + _STL_BINARY##__opname##_ERROR<__ret, __first, __second>:: \ + __binary_operator_requirement_violation> \ + __dummy_ptr_##__func##__ret##__first##__second##_binary_op + +#endif + +/* helper class for finding non-const version of a type. Need to have + something to assign to etc. when testing constant iterators. */ + +template +struct _Mutable_trait { + typedef _Tp _Type; +}; +template +struct _Mutable_trait { + typedef _Tp _Type; +}; + + +/* helper function for avoiding compiler warnings about unused variables */ +template +void __sink_unused_warning(_Type) { } + +template +struct _STL_CONVERT_ERROR { + static void + __type_X_is_not_convertible_to_type_Y(_TypeX __x, _TypeY) { + _TypeY __y = __x; + __sink_unused_warning(__y); + } +}; + + +template struct __check_equal { }; + +template +struct _STL_SAME_TYPE_ERROR { + static void + __type_X_not_same_as_type_Y(_TypeX , _TypeY ) { + __check_equal<_TypeX> t1 = __check_equal<_TypeY>(); + } +}; + + +// Some Functon Object Checks + +template +struct _STL_GENERATOR_ERROR { + static _Ret __generator_requirement_violation(_Func& __f) { + return __f(); + } +}; + +template +struct _STL_GENERATOR_ERROR<_Func, void> { + static void __generator_requirement_violation(_Func& __f) { + __f(); + } +}; + + +template +struct _STL_UNARY_FUNCTION_ERROR { + static _Ret + __unary_function_requirement_violation(_Func& __f, + const _Arg& __arg) { + return __f(__arg); + } +}; + +template +struct _STL_UNARY_FUNCTION_ERROR<_Func, void, _Arg> { + static void + __unary_function_requirement_violation(_Func& __f, + const _Arg& __arg) { + __f(__arg); + } +}; + +template +struct _STL_BINARY_FUNCTION_ERROR { + static _Ret + __binary_function_requirement_violation(_Func& __f, + const _First& __first, + const _Second& __second) { + return __f(__first, __second); + } +}; + +template +struct _STL_BINARY_FUNCTION_ERROR<_Func, void, _First, _Second> { + static void + __binary_function_requirement_violation(_Func& __f, + const _First& __first, + const _Second& __second) { + __f(__first, __second); + } +}; + + +#define __STL_DEFINE_BINARY_OP_CHECK(_OP, _NAME) \ +template \ +struct _STL_BINARY##_NAME##_ERROR { \ + static _Ret \ + __const_binary_operator_requirement_violation(const _First& __first, \ + const _Second& __second) { \ + return __first _OP __second; \ + } \ + static _Ret \ + __binary_operator_requirement_violation(_First& __first, \ + _Second& __second) { \ + return __first _OP __second; \ + } \ +} + +__STL_DEFINE_BINARY_OP_CHECK(==, _OP_EQUAL); +__STL_DEFINE_BINARY_OP_CHECK(!=, _OP_NOT_EQUAL); +__STL_DEFINE_BINARY_OP_CHECK(<, _OP_LESS_THAN); +__STL_DEFINE_BINARY_OP_CHECK(<=, _OP_LESS_EQUAL); +__STL_DEFINE_BINARY_OP_CHECK(>, _OP_GREATER_THAN); +__STL_DEFINE_BINARY_OP_CHECK(>=, _OP_GREATER_EQUAL); +__STL_DEFINE_BINARY_OP_CHECK(+, _OP_PLUS); +__STL_DEFINE_BINARY_OP_CHECK(*, _OP_TIMES); +__STL_DEFINE_BINARY_OP_CHECK(/, _OP_DIVIDE); +__STL_DEFINE_BINARY_OP_CHECK(-, _OP_SUBTRACT); +__STL_DEFINE_BINARY_OP_CHECK(%, _OP_MOD); +// ... + +// TODO, add unary operators (prefix and postfix) + +/* + The presence of this class is just to trick EDG into displaying + these error messages before any other errors. Without the + classes, the errors in the functions get reported after + other class errors deep inside the library. The name + choice just makes for an eye catching error message :) + */ +struct _STL_ERROR { + + template + static _Type + __default_constructor_requirement_violation(_Type) { + return _Type(); + } + template + static _Type + __assignment_operator_requirement_violation(_Type __a) { + __a = __a; + return __a; + } + template + static _Type + __copy_constructor_requirement_violation(_Type __a) { + _Type __c(__a); + return __c; + } + template + static _Type + __const_parameter_required_for_copy_constructor(_Type /* __a */, + const _Type& __b) { + _Type __c(__b); + return __c; + } + template + static _Type + __const_parameter_required_for_assignment_operator(_Type __a, + const _Type& __b) { + __a = __b; + return __a; + } + template + static _Type + __less_than_comparable_requirement_violation(_Type __a, _Type __b) { + if (__a < __b || __a > __b || __a <= __b || __a >= __b) return __a; + return __b; + } + template + static _Type + __equality_comparable_requirement_violation(_Type __a, _Type __b) { + if (__a == __b || __a != __b) return __a; + return __b; + } + template + static void + __dereference_operator_requirement_violation(_Iterator __i) { + __sink_unused_warning(*__i); + } + template + static void + __dereference_operator_and_assignment_requirement_violation(_Iterator __i) { + *__i = *__i; + } + template + static void + __preincrement_operator_requirement_violation(_Iterator __i) { + ++__i; + } + template + static void + __postincrement_operator_requirement_violation(_Iterator __i) { + __i++; + } + template + static void + __predecrement_operator_requirement_violation(_Iterator __i) { + --__i; + } + template + static void + __postdecrement_operator_requirement_violation(_Iterator __i) { + __i--; + } + template + static void + __postincrement_operator_and_assignment_requirement_violation(_Iterator __i, + _Type __t) { + *__i++ = __t; + } + template + static _Iterator + __iterator_addition_assignment_requirement_violation(_Iterator __i, + _Distance __n) { + __i += __n; + return __i; + } + template + static _Iterator + __iterator_addition_requirement_violation(_Iterator __i, _Distance __n) { + __i = __i + __n; + __i = __n + __i; + return __i; + } + template + static _Iterator + __iterator_subtraction_assignment_requirement_violation(_Iterator __i, + _Distance __n) { + __i -= __n; + return __i; + } + template + static _Iterator + __iterator_subtraction_requirement_violation(_Iterator __i, _Distance __n) { + __i = __i - __n; + return __i; + } + template + static _Distance + __difference_operator_requirement_violation(_Iterator __i, _Iterator __j, + _Distance __n) { + __n = __i - __j; + return __n; + } + template + static _Type + __element_access_operator_requirement_violation(_Exp __x, _Type*, + _Distance __n) { + return __x[__n]; + } + template + static void + __element_assignment_operator_requirement_violation(_Exp __x, + _Type* __t, + _Distance __n) { + __x[__n] = *__t; + } + +}; /* _STL_ERROR */ + +/* Associated Type Requirements */ + +__STL_BEGIN_NAMESPACE +template struct iterator_traits; +__STL_END_NAMESPACE + +template +struct __value_type_type_definition_requirement_violation { + typedef typename __STD::iterator_traits<_Iter>::value_type value_type; +}; + +template +struct __difference_type_type_definition_requirement_violation { + typedef typename __STD::iterator_traits<_Iter>::difference_type + difference_type; +}; + +template +struct __reference_type_definition_requirement_violation { + typedef typename __STD::iterator_traits<_Iter>::reference reference; +}; + +template +struct __pointer_type_definition_requirement_violation { + typedef typename __STD::iterator_traits<_Iter>::pointer pointer; +}; + +template +struct __iterator_category_type_definition_requirement_violation { + typedef typename __STD::iterator_traits<_Iter>::iterator_category + iterator_category; +}; + +/* Assignable Requirements */ + + +template +struct _Assignable_concept_specification { + static void _Assignable_requirement_violation(_Type __a) { + _STL_ERROR::__assignment_operator_requirement_violation(__a); + _STL_ERROR::__copy_constructor_requirement_violation(__a); + _STL_ERROR::__const_parameter_required_for_copy_constructor(__a,__a); + _STL_ERROR::__const_parameter_required_for_assignment_operator(__a,__a); + } +}; + +/* DefaultConstructible Requirements */ + + +template +struct _DefaultConstructible_concept_specification { + static void _DefaultConstructible_requirement_violation(_Type __a) { + _STL_ERROR::__default_constructor_requirement_violation(__a); + } +}; + +/* EqualityComparable Requirements */ + +template +struct _EqualityComparable_concept_specification { + static void _EqualityComparable_requirement_violation(_Type __a) { + _STL_ERROR::__equality_comparable_requirement_violation(__a, __a); + } +}; + +/* LessThanComparable Requirements */ +template +struct _LessThanComparable_concept_specification { + static void _LessThanComparable_requirement_violation(_Type __a) { + _STL_ERROR::__less_than_comparable_requirement_violation(__a, __a); + } +}; + +/* TrivialIterator Requirements */ + +template +struct _TrivialIterator_concept_specification { +static void +_TrivialIterator_requirement_violation(_TrivialIterator __i) { + typedef typename + __value_type_type_definition_requirement_violation<_TrivialIterator>:: + value_type __T; + // Refinement of Assignable + _Assignable_concept_specification<_TrivialIterator>:: + _Assignable_requirement_violation(__i); + // Refinement of DefaultConstructible + _DefaultConstructible_concept_specification<_TrivialIterator>:: + _DefaultConstructible_requirement_violation(__i); + // Refinement of EqualityComparable + _EqualityComparable_concept_specification<_TrivialIterator>:: + _EqualityComparable_requirement_violation(__i); + // Valid Expressions + _STL_ERROR::__dereference_operator_requirement_violation(__i); +} +}; + +template +struct _Mutable_TrivialIterator_concept_specification { +static void +_Mutable_TrivialIterator_requirement_violation(_TrivialIterator __i) { + _TrivialIterator_concept_specification<_TrivialIterator>:: + _TrivialIterator_requirement_violation(__i); + // Valid Expressions + _STL_ERROR::__dereference_operator_and_assignment_requirement_violation(__i); +} +}; + +/* InputIterator Requirements */ + +template +struct _InputIterator_concept_specification { +static void +_InputIterator_requirement_violation(_InputIterator __i) { + // Refinement of TrivialIterator + _TrivialIterator_concept_specification<_InputIterator>:: + _TrivialIterator_requirement_violation(__i); + // Associated Types + __difference_type_type_definition_requirement_violation<_InputIterator>(); + __reference_type_definition_requirement_violation<_InputIterator>(); + __pointer_type_definition_requirement_violation<_InputIterator>(); + __iterator_category_type_definition_requirement_violation<_InputIterator>(); + // Valid Expressions + _STL_ERROR::__preincrement_operator_requirement_violation(__i); + _STL_ERROR::__postincrement_operator_requirement_violation(__i); +} +}; + +/* OutputIterator Requirements */ + +template +struct _OutputIterator_concept_specification { +static void +_OutputIterator_requirement_violation(_OutputIterator __i) { + // Refinement of Assignable + _Assignable_concept_specification<_OutputIterator>:: + _Assignable_requirement_violation(__i); + // Associated Types + __iterator_category_type_definition_requirement_violation<_OutputIterator>(); + // Valid Expressions + _STL_ERROR::__dereference_operator_requirement_violation(__i); + _STL_ERROR::__preincrement_operator_requirement_violation(__i); + _STL_ERROR::__postincrement_operator_requirement_violation(__i); + _STL_ERROR:: + __postincrement_operator_and_assignment_requirement_violation(__i, *__i); +} +}; + +/* ForwardIterator Requirements */ + +template +struct _ForwardIterator_concept_specification { +static void +_ForwardIterator_requirement_violation(_ForwardIterator __i) { + // Refinement of InputIterator + _InputIterator_concept_specification<_ForwardIterator>:: + _InputIterator_requirement_violation(__i); +} +}; + +template +struct _Mutable_ForwardIterator_concept_specification { +static void +_Mutable_ForwardIterator_requirement_violation(_ForwardIterator __i) { + _ForwardIterator_concept_specification<_ForwardIterator>:: + _ForwardIterator_requirement_violation(__i); + // Refinement of OutputIterator + _OutputIterator_concept_specification<_ForwardIterator>:: + _OutputIterator_requirement_violation(__i); +} +}; + +/* BidirectionalIterator Requirements */ + +template +struct _BidirectionalIterator_concept_specification { +static void +_BidirectionalIterator_requirement_violation(_BidirectionalIterator __i) { + // Refinement of ForwardIterator + _ForwardIterator_concept_specification<_BidirectionalIterator>:: + _ForwardIterator_requirement_violation(__i); + // Valid Expressions + _STL_ERROR::__predecrement_operator_requirement_violation(__i); + _STL_ERROR::__postdecrement_operator_requirement_violation(__i); +} +}; + +template +struct _Mutable_BidirectionalIterator_concept_specification { +static void +_Mutable_BidirectionalIterator_requirement_violation( + _BidirectionalIterator __i) +{ + _BidirectionalIterator_concept_specification<_BidirectionalIterator>:: + _BidirectionalIterator_requirement_violation(__i); + // Refinement of mutable_ForwardIterator + _Mutable_ForwardIterator_concept_specification<_BidirectionalIterator>:: + _Mutable_ForwardIterator_requirement_violation(__i); + typedef typename + __value_type_type_definition_requirement_violation< + _BidirectionalIterator>::value_type __T; + typename _Mutable_trait<__T>::_Type* __tmp_ptr = 0; + // Valid Expressions + _STL_ERROR:: + __postincrement_operator_and_assignment_requirement_violation(__i, + *__tmp_ptr); +} +}; + +/* RandomAccessIterator Requirements */ + +template +struct _RandomAccessIterator_concept_specification { +static void +_RandomAccessIterator_requirement_violation(_RandAccIter __i) { + // Refinement of BidirectionalIterator + _BidirectionalIterator_concept_specification<_RandAccIter>:: + _BidirectionalIterator_requirement_violation(__i); + // Refinement of LessThanComparable + _LessThanComparable_concept_specification<_RandAccIter>:: + _LessThanComparable_requirement_violation(__i); + typedef typename + __value_type_type_definition_requirement_violation<_RandAccIter> + ::value_type + value_type; + typedef typename + __difference_type_type_definition_requirement_violation<_RandAccIter> + ::difference_type + _Dist; + typedef typename _Mutable_trait<_Dist>::_Type _MutDist; + + // Valid Expressions + _STL_ERROR::__iterator_addition_assignment_requirement_violation(__i, + _MutDist()); + _STL_ERROR::__iterator_addition_requirement_violation(__i, + _MutDist()); + _STL_ERROR:: + __iterator_subtraction_assignment_requirement_violation(__i, + _MutDist()); + _STL_ERROR::__iterator_subtraction_requirement_violation(__i, + _MutDist()); + _STL_ERROR::__difference_operator_requirement_violation(__i, __i, + _MutDist()); + typename _Mutable_trait::_Type* __dummy_ptr = 0; + _STL_ERROR::__element_access_operator_requirement_violation(__i, + __dummy_ptr, + _MutDist()); +} +}; + +template +struct _Mutable_RandomAccessIterator_concept_specification { +static void +_Mutable_RandomAccessIterator_requirement_violation(_RandAccIter __i) +{ + _RandomAccessIterator_concept_specification<_RandAccIter>:: + _RandomAccessIterator_requirement_violation(__i); + // Refinement of mutable_BidirectionalIterator + _Mutable_BidirectionalIterator_concept_specification<_RandAccIter>:: + _Mutable_BidirectionalIterator_requirement_violation(__i); + typedef typename + __value_type_type_definition_requirement_violation<_RandAccIter> + ::value_type + value_type; + typedef typename + __difference_type_type_definition_requirement_violation<_RandAccIter> + ::difference_type + _Dist; + + typename _Mutable_trait::_Type* __tmp_ptr = 0; + // Valid Expressions + _STL_ERROR::__element_assignment_operator_requirement_violation(__i, + __tmp_ptr, _Dist()); +} +}; + +#define __STL_TYPEDEF_REQUIREMENT(__REQUIREMENT) \ +template \ +struct __##__REQUIREMENT##__typedef_requirement_violation { \ + typedef typename Type::__REQUIREMENT __REQUIREMENT; \ +} + +__STL_TYPEDEF_REQUIREMENT(value_type); +__STL_TYPEDEF_REQUIREMENT(difference_type); +__STL_TYPEDEF_REQUIREMENT(size_type); +__STL_TYPEDEF_REQUIREMENT(reference); +__STL_TYPEDEF_REQUIREMENT(const_reference); +__STL_TYPEDEF_REQUIREMENT(pointer); +__STL_TYPEDEF_REQUIREMENT(const_pointer); + + +template +struct _Allocator_concept_specification { +static void +_Allocator_requirement_violation(_Alloc __a) { + // Refinement of DefaultConstructible + _DefaultConstructible_concept_specification<_Alloc>:: + _DefaultConstructible_requirement_violation(__a); + // Refinement of EqualityComparable + _EqualityComparable_concept_specification<_Alloc>:: + _EqualityComparable_requirement_violation(__a); + // Associated Types + __value_type__typedef_requirement_violation<_Alloc>(); + __difference_type__typedef_requirement_violation<_Alloc>(); + __size_type__typedef_requirement_violation<_Alloc>(); + __reference__typedef_requirement_violation<_Alloc>(); + __const_reference__typedef_requirement_violation<_Alloc>(); + __pointer__typedef_requirement_violation<_Alloc>(); + __const_pointer__typedef_requirement_violation<_Alloc>(); + typedef typename _Alloc::value_type _Tp; + //__STL_REQUIRES_SAME_TYPE(typename _Alloc::__STL_TEMPLATE rebind<_Tp>::other, + // _Alloc); +} +}; + +#endif /* __STL_USE_CONCEPT_CHECKS */ + +#endif /* __CONCEPT_CHECKS_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/container_concepts.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/container_concepts.h new file mode 100644 index 0000000..10db8de --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/container_concepts.h @@ -0,0 +1,247 @@ +/* + * Copyright (c) 1999 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __STL_CONTAINER_CONCEPTS_H +#define __STL_CONTAINER_CONCEPTS_H + + +#include + +#ifdef __STL_USE_CONCEPT_CHECKS + + +// This file covers the following concepts: +// _Container +// _ForwardContainer +// _ReversibleContainer +// _const_ReversibleContainer +// _RandomAccessContainer +// + +struct _ERROR_IN_STL_CONTAINER { + + /* Container expresssions */ + + template + static void + __begin_iterator_accessor_requirement_violation(_Container __c) { + __c.begin(); + } + template + static void + __const_begin_iterator_accessor_requirement_violation(const _Container& __c) { + __c.begin(); + } + template + static void + __end_iterator_accessor_requirement_violation(_Container __c) { + __c.end(); + } + template + static void + __const_end_iterator_accessor_requirement_violation(const _Container& __c) { + __c.end(); + } + + template + static void + __rbegin_iterator_accessor_requirement_violation(_Container __c) { + __c.rbegin(); + } + template + static void + __const_rbegin_iterator_accessor_requirement_violation(const _Container& __c) { + __c.rbegin(); + } + template + static void + __rend_iterator_accessor_requirement_violation(_Container __c) { + __c.rend(); + } + template + static void + __const_rend_iterator_accessor_requirement_violation(const _Container& __c) { + __c.rend(); + } + template + static void + __size_function_must_be_const(const _Container& __c) { + __c.size(); + } + template + static void + __size_function_requirement_violation(_Container& __c) { + __c.size(); + __size_function_must_be_const(__c); + } + template + static void + __max_size_function_must_be_const(const _Container& __c) { + __c.max_size(); + } + template + static void + __max_size_function_requirement_violation(_Container& __c) { + __c.max_size(); + __max_size_function_must_be_const(__c); + } + template + static void + __empty_function_must_be_const(const _Container& __c) { + __c.empty(); + } + template + static void + __empty_function_requirement_violation(_Container& __c) { + __c.empty(); + __empty_function_must_be_const(__c); + } + template + static void + __swap_function_requirement_violation(_Container& __c) { + __c.swap(__c); + } + +}; + + +__STL_TYPEDEF_REQUIREMENT(iterator); +__STL_TYPEDEF_REQUIREMENT(const_iterator); + +/* Containers */ + +template +struct _Container_concept_specification { +static void +_Container_requirement_violation(_Container __c) { + // Refinement of Assignable + _Assignable_concept_specification<_Container>::_Assignable_requirement_violation(__c); + // Associated Types + __value_type__typedef_requirement_violation<_Container>(); + __difference_type__typedef_requirement_violation<_Container>(); + __size_type__typedef_requirement_violation<_Container>(); + __reference__typedef_requirement_violation<_Container>(); + __const_reference__typedef_requirement_violation<_Container>(); + __pointer__typedef_requirement_violation<_Container>(); + __const_pointer__typedef_requirement_violation<_Container>(); + __iterator__typedef_requirement_violation<_Container>(); + __const_iterator__typedef_requirement_violation<_Container>(); + // Valid Expressions + _ERROR_IN_STL_CONTAINER::__const_begin_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__const_end_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__begin_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__end_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__size_function_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__max_size_function_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__empty_function_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__swap_function_requirement_violation(__c); + // Requirements on Iterators + typedef typename _Container::iterator iter; + typedef typename _Container::const_iterator const_iter; + _InputIterator_concept_specification::_InputIterator_requirement_violation(const_iter()); + _InputIterator_concept_specification::_InputIterator_requirement_violation(iter()); +} +}; + +template +struct _ForwardContainer_concept_specification { +static void +_ForwardContainer_requirement_violation(_ForwardContainer __c) { + // Refinement of Container + _Container_concept_specification<_ForwardContainer>::_Container_requirement_violation(__c); + // Requirements on Iterators + typedef typename _ForwardContainer::iterator iter; + typedef typename _ForwardContainer::const_iterator const_iter; + _ForwardIterator_concept_specification::_ForwardIterator_requirement_violation(const_iter()); + _Mutable_ForwardIterator_concept_specification::_Mutable_ForwardIterator_requirement_violation(iter()); +} +}; + + +__STL_TYPEDEF_REQUIREMENT(reverse_iterator); +__STL_TYPEDEF_REQUIREMENT(const_reverse_iterator); + +template +struct _ReversibleContainer_concept_specification { +static void +_ReversibleContainer_requirement_violation(_ReversibleContainer __c) { + // Refinement of ForwardContainer + _ForwardContainer_concept_specification<_ReversibleContainer>::_ForwardContainer_requirement_violation(__c); + // Associated types + __reverse_iterator__typedef_requirement_violation<_ReversibleContainer>(); + __const_reverse_iterator__typedef_requirement_violation<_ReversibleContainer>(); + // Valid Expressions + _ERROR_IN_STL_CONTAINER::__const_rbegin_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__const_rend_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__rbegin_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__rend_iterator_accessor_requirement_violation(__c); + // Requirements on Iterators + typedef typename _ReversibleContainer::iterator iter; + typedef typename _ReversibleContainer::const_iterator const_iter; + _BidirectionalIterator_concept_specification::_BidirectionalIterator_requirement_violation(const_iter()); + _Mutable_BidirectionalIterator_concept_specification::_Mutable_BidirectionalIterator_requirement_violation(iter()); +} +}; + +template +struct _const_ReversibleContainer_concept_specification { +static void +_const_ReversibleContainer_requirement_violation(_ReversibleContainer __c) { + // Refinement of Container (JGS, not ForwardContainer) + _Container_concept_specification<_ReversibleContainer>::_Container_requirement_violation(__c); + // Associated types + __reverse_iterator__typedef_requirement_violation<_ReversibleContainer>(); + __const_reverse_iterator__typedef_requirement_violation<_ReversibleContainer>(); + // Valid Expressions + _ERROR_IN_STL_CONTAINER::__const_rbegin_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__const_rend_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__rbegin_iterator_accessor_requirement_violation(__c); + _ERROR_IN_STL_CONTAINER::__rend_iterator_accessor_requirement_violation(__c); + // Requirements on Iterators + typedef typename _ReversibleContainer::iterator iter; + typedef typename _ReversibleContainer::const_iterator const_iter; + + // This line won't compile on gcc 2.91 due to a compiler bug. +#if !(__GNUC__ == 2 && __GNUC_MINOR__ == 91) + __BidirectionalIterator_concept_specification::_BidirectionalIterator_requirement_violation(const_iter()); +#endif +} +}; + + +template +struct _RandomAccessContainer_concept_specification { +static void +_RandomAccessContainer_requirement_violation(_RandomAccessContainer __c) { + // Refinement of ReversibleContainer + _ReversibleContainer_concept_specification<_RandomAccessContainer>::_ReversibleContainer_requirement_violation(__c); + // Valid Expressions + typedef typename _RandomAccessContainer::value_type __T; + typedef typename _RandomAccessContainer::difference_type _Dist; + typedef typename _Mutable_trait<__T>::_Type Type; + typedef Type* _TypePtr; + typedef typename _Mutable_trait<_Dist>::_Type Dist; + _STL_ERROR::__element_access_operator_requirement_violation(__c, + _TypePtr(), + Dist()); + // Requirements on Iterators + typedef typename _RandomAccessContainer::iterator iter; + typedef typename _RandomAccessContainer::const_iterator const_iter; + _RandomAccessIterator_concept_specification::_RandomAccessIterator_requirement_violation(const_iter()); + _Mutable_RandomAccessIterator_concept_specification::_Mutable_RandomAccessIterator_requirement_violation(iter()); +} +}; + +#endif /* if __STL_USE_CONCEPT_CHECKS */ + +#endif /* __STL_CONTAINER_CONCEPTS_H */ diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/defalloc.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/defalloc.h new file mode 100644 index 0000000..0bfcc2c --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/defalloc.h @@ -0,0 +1,87 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +// Inclusion of this file is DEPRECATED. This is the original HP +// default allocator. It is provided only for backward compatibility. +// This file WILL BE REMOVED in a future release. +// +// DO NOT USE THIS FILE unless you have an old container implementation +// that requires an allocator with the HP-style interface. +// +// Standard-conforming allocators have a very different interface. The +// standard default allocator is declared in the header . + +#ifndef DEFALLOC_H +#define DEFALLOC_H + +#include +#include +#include +#include +#include +#include + + +template +inline T* allocate(ptrdiff_t size, T*) { + set_new_handler(0); + T* tmp = (T*)(::operator new((size_t)(size * sizeof(T)))); + if (tmp == 0) { + cerr << "out of memory" << endl; + exit(1); + } + return tmp; +} + + +template +inline void deallocate(T* buffer) { + ::operator delete(buffer); +} + +template +class allocator { +public: + typedef T value_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef T& reference; + typedef const T& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + pointer allocate(size_type n) { + return ::allocate((difference_type)n, (pointer)0); + } + void deallocate(pointer p) { ::deallocate(p); } + pointer address(reference x) { return (pointer)&x; } + const_pointer const_address(const_reference x) { + return (const_pointer)&x; + } + size_type init_page_size() { + return max(size_type(1), size_type(4096/sizeof(T))); + } + size_type max_size() const { + return max(size_type(1), size_type(UINT_MAX/sizeof(T))); + } +}; + +class allocator { +public: + typedef void* pointer; +}; + + + +#endif diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/deque b/src/UWE_projectCode/SGI STL源码/SGI STL源码/deque new file mode 100644 index 0000000..b823fa4 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/deque @@ -0,0 +1,41 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_DEQUE +#define __SGI_STL_DEQUE + +#include +#include +#include +#include +#include +#include + +#endif /* __SGI_STL_DEQUE */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/deque.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/deque.h new file mode 100644 index 0000000..2ffeba2 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/deque.h @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_DEQUE_H +#define __SGI_STL_DEQUE_H + +#include +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::deque; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_DEQUE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/function.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/function.h new file mode 100644 index 0000000..6474dd9 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/function.h @@ -0,0 +1,118 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_FUNCTION_H +#define __SGI_STL_FUNCTION_H + +#ifndef __STL_CONFIG_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_RELOPS +#include +#endif +#include +#ifndef __SGI_STL_INTERNAL_FUNCTION_H +#include +#endif + +#ifdef __STL_USE_NAMESPACE_FOR_RELOPS + +// Names from stl_relops.h +using __STD_RELOPS::operator!=; +using __STD_RELOPS::operator>; +using __STD_RELOPS::operator<=; +using __STD_RELOPS::operator>=; + +#endif /* __STL_USE_NAMESPACE_FOR_RELOPS */ + +#ifdef __STL_USE_NAMESPACES + +// Names from stl_function.h +using __STD::unary_function; +using __STD::binary_function; +using __STD::plus; +using __STD::minus; +using __STD::multiplies; +using __STD::divides; +using __STD::identity_element; +using __STD::modulus; +using __STD::negate; +using __STD::equal_to; +using __STD::not_equal_to; +using __STD::greater; +using __STD::less; +using __STD::greater_equal; +using __STD::less_equal; +using __STD::logical_and; +using __STD::logical_or; +using __STD::logical_not; +using __STD::unary_negate; +using __STD::binary_negate; +using __STD::not1; +using __STD::not2; +using __STD::binder1st; +using __STD::binder2nd; +using __STD::bind1st; +using __STD::bind2nd; +using __STD::unary_compose; +using __STD::binary_compose; +using __STD::compose1; +using __STD::compose2; +using __STD::pointer_to_unary_function; +using __STD::pointer_to_binary_function; +using __STD::ptr_fun; +using __STD::identity; +using __STD::select1st; +using __STD::select2nd; +using __STD::project1st; +using __STD::project2nd; +using __STD::constant_void_fun; +using __STD::constant_unary_fun; +using __STD::constant_binary_fun; +using __STD::constant0; +using __STD::constant1; +using __STD::constant2; +using __STD::subtractive_rng; +using __STD::mem_fun_t; +using __STD::const_mem_fun_t; +using __STD::mem_fun_ref_t; +using __STD::const_mem_fun_ref_t; +using __STD::mem_fun1_t; +using __STD::const_mem_fun1_t; +using __STD::mem_fun1_ref_t; +using __STD::const_mem_fun1_ref_t; +using __STD::mem_fun; +using __STD::mem_fun_ref; +using __STD::mem_fun1; +using __STD::mem_fun1_ref; + +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_FUNCTION_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/functional b/src/UWE_projectCode/SGI STL源码/SGI STL源码/functional new file mode 100644 index 0000000..d046dbb --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/functional @@ -0,0 +1,26 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __SGI_STL_FUNCTIONAL +#define __SGI_STL_FUNCTIONAL + +#include +#include +#include + +#endif /* __SGI_STL_FUNCTIONAL */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_map b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_map new file mode 100644 index 0000000..f7421e0 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_map @@ -0,0 +1,40 @@ +/* + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __SGI_STL_HASH_MAP +#define __SGI_STL_HASH_MAP + +#ifndef __SGI_STL_INTERNAL_HASHTABLE_H +#include +#endif + +#include + +#endif /* __SGI_STL_HASH_MAP */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_map.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_map.h new file mode 100644 index 0000000..f347162 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_map.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __SGI_STL_HASH_MAP_H +#define __SGI_STL_HASH_MAP_H + +#ifndef __SGI_STL_INTERNAL_HASHTABLE_H +#include +#endif + +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::hash; +using __STD::hashtable; +using __STD::hash_map; +using __STD::hash_multimap; +#endif /* __STL_USE_NAMESPACES */ + + +#endif /* __SGI_STL_HASH_MAP_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_set b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_set new file mode 100644 index 0000000..2244f47 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_set @@ -0,0 +1,40 @@ +/* + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __SGI_STL_HASH_SET +#define __SGI_STL_HASH_SET + +#ifndef __SGI_STL_INTERNAL_HASHTABLE_H +#include +#endif + +#include + +#endif /* __SGI_STL_HASH_SET */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_set.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_set.h new file mode 100644 index 0000000..d3e93c0 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hash_set.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __SGI_STL_HASH_SET_H +#define __SGI_STL_HASH_SET_H + +#ifndef __SGI_STL_INTERNAL_HASHTABLE_H +#include +#endif + +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::hash; +using __STD::hashtable; +using __STD::hash_set; +using __STD::hash_multiset; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_HASH_SET_H */ diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/hashtable.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hashtable.h new file mode 100644 index 0000000..15dbfc9 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/hashtable.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_HASHTABLE_H +#define __SGI_STL_HASHTABLE_H + +#include +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::hash; +using __STD::hashtable; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_HASHTABLE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/heap.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/heap.h new file mode 100644 index 0000000..2ec93c0 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/heap.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_HEAP_H +#define __SGI_STL_HEAP_H + +#include +#include + +#ifdef __STL_USE_NAMESPACES + +using __STD::push_heap; +using __STD::pop_heap; +using __STD::make_heap; +using __STD::sort_heap; + +#endif /* __STL_USE_NAMESPACES */ + + +#endif /* __SGI_STL_HEAP_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/iterator b/src/UWE_projectCode/SGI STL源码/SGI STL源码/iterator new file mode 100644 index 0000000..fe2b8e8 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/iterator @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_ITERATOR +#define __SGI_STL_ITERATOR + +#include +#include +#include + +#ifdef __STL_USE_NEW_IOSTREAMS +#include +#else /* __STL_USE_NEW_IOSTREAMS */ +#include +#endif /* __STL_USE_NEW_IOSTREAMS */ + +#include +#include + +#endif /* __SGI_STL_ITERATOR */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/iterator.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/iterator.h new file mode 100644 index 0000000..197278b --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/iterator.h @@ -0,0 +1,113 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_ITERATOR_H +#define __SGI_STL_ITERATOR_H + +#ifndef __SGI_STL_FUNCTION_H +#include +#endif +#include + +#ifdef __STL_USE_NEW_IOSTREAMS +#include +#else /* __STL_USE_NEW_IOSTREAMS */ +#include +#endif /* __STL_USE_NEW_IOSTREAMS */ + +#ifndef __SGI_STL_INTERNAL_ITERATOR_BASE_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_ITERATOR_H +#include +#endif +#ifndef __TYPE_TRAITS_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_RAW_STORAGE_ITERATOR_H +#include +#endif + +#ifdef __STL_USE_NAMESPACES + +// Names from stl_iterator.h + +using __STD::input_iterator_tag; +using __STD::output_iterator_tag; +using __STD::forward_iterator_tag; +using __STD::bidirectional_iterator_tag; +using __STD::random_access_iterator_tag; + +#if 0 +using __STD::iterator; +#endif +using __STD::input_iterator; +using __STD::output_iterator; +using __STD::forward_iterator; +using __STD::bidirectional_iterator; +using __STD::random_access_iterator; + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION +using __STD::iterator_traits; +#endif + +using __STD::iterator_category; +using __STD::distance_type; +using __STD::value_type; + +using __STD::distance; +using __STD::advance; + +using __STD::insert_iterator; +using __STD::front_insert_iterator; +using __STD::back_insert_iterator; +using __STD::inserter; +using __STD::front_inserter; +using __STD::back_inserter; + +using __STD::reverse_iterator; +using __STD::reverse_bidirectional_iterator; + +using __STD::istream_iterator; +using __STD::ostream_iterator; + +// Names from stl_construct.h +using __STD::construct; +using __STD::destroy; + +// Names from stl_raw_storage_iter.h +using __STD::raw_storage_iterator; + +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_ITERATOR_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/limits b/src/UWE_projectCode/SGI STL源码/SGI STL源码/limits new file mode 100644 index 0000000..f1a9a09 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/limits @@ -0,0 +1,537 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is not portable code. Parts of numeric_limits<> are + * inherently machine-dependent. At present this file is suitable + * for the MIPS and ia32 architectures. + */ + +#ifndef __SGI_CPP_LIMITS +#define __SGI_CPP_LIMITS + +#include +#include +#include + +__STL_BEGIN_NAMESPACE + +enum float_round_style { + round_indeterminate = -1, + round_toward_zero = 0, + round_to_nearest = 1, + round_toward_infinity = 2, + round_toward_neg_infinity = 3 +}; + +enum float_denorm_style { + denorm_indeterminate = -1, + denorm_absent = 0, + denorm_present = 1 +}; + +// The C++ standard (section 18.2.1) requires that some of the members of +// numeric_limits be static const data members that are given constant- +// initializers within the class declaration. On compilers where the +// __STL_STATIC_CONST_INIT_BUG macro is defined, it is impossible to write +// a standard-conforming numeric_limits class. +// +// There are two possible workarounds: either initialize the data +// members outside the class, or change them from data members to +// enums. Neither workaround is satisfactory: the former makes it +// impossible to use the data members in constant-expressions, and the +// latter means they have the wrong type and that it is impossible to +// take their addresses. We choose the former workaround. + +#ifdef __STL_STATIC_CONST_INIT_BUG +# define __STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \ + enum { __mem_name = __mem_value } +#else /* __STL_STATIC_CONST_INIT_BUG */ +# define __STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \ + static const __mem_type __mem_name = __mem_value +#endif /* __STL_STATIC_CONST_INIT_BUG */ + +// Base class for all specializations of numeric_limits. + +template +class _Numeric_limits_base { +public: + __STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, false); + + static __number min() __STL_NOTHROW { return __number(); } + static __number max() __STL_NOTHROW { return __number(); } + + __STL_DECLARE_LIMITS_MEMBER(int, digits, 0); + __STL_DECLARE_LIMITS_MEMBER(int, digits10, 0); + + __STL_DECLARE_LIMITS_MEMBER(bool, is_signed, false); + __STL_DECLARE_LIMITS_MEMBER(bool, is_integer, false); + __STL_DECLARE_LIMITS_MEMBER(bool, is_exact, false); + + __STL_DECLARE_LIMITS_MEMBER(int, radix, 0); + + static __number epsilon() __STL_NOTHROW { return __number(); } + static __number round_error() __STL_NOTHROW { return __number(); } + + __STL_DECLARE_LIMITS_MEMBER(int, min_exponent, 0); + __STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, 0); + __STL_DECLARE_LIMITS_MEMBER(int, max_exponent, 0); + __STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, 0); + + __STL_DECLARE_LIMITS_MEMBER(bool, has_infinity, false); + __STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN, false); + __STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, false); + __STL_DECLARE_LIMITS_MEMBER(float_denorm_style, + has_denorm, + denorm_absent); + __STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss, false); + + static __number infinity() __STL_NOTHROW { return __number(); } + static __number quiet_NaN() __STL_NOTHROW { return __number(); } + static __number signaling_NaN() __STL_NOTHROW { return __number(); } + static __number denorm_min() __STL_NOTHROW { return __number(); } + + __STL_DECLARE_LIMITS_MEMBER(bool, is_iec559, false); + __STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, false); + __STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, false); + + __STL_DECLARE_LIMITS_MEMBER(bool, traps, false); + __STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false); + __STL_DECLARE_LIMITS_MEMBER(float_round_style, + round_style, + round_toward_zero); +}; + +#ifdef __STL_STATIC_CONST_INIT_BUG +# define __STL_DEFINE_NUMERIC_BASE_MEMBER(__type, __mem) +#else /* __STL_STATIC_CONST_INIT_BUG */ +# define __STL_DEFINE_NUMERIC_BASE_MEMBER(__type, __mem) \ + template \ + const __type _Numeric_limits_base<__number>:: __mem +#endif /* __STL_STATIC_CONST_INIT_BUG */ + +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_specialized); +__STL_DEFINE_NUMERIC_BASE_MEMBER(int, digits); +__STL_DEFINE_NUMERIC_BASE_MEMBER(int, digits10); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_signed); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_integer); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_exact); +__STL_DEFINE_NUMERIC_BASE_MEMBER(int, radix); +__STL_DEFINE_NUMERIC_BASE_MEMBER(int, min_exponent); +__STL_DEFINE_NUMERIC_BASE_MEMBER(int, max_exponent); +__STL_DEFINE_NUMERIC_BASE_MEMBER(int, min_exponent10); +__STL_DEFINE_NUMERIC_BASE_MEMBER(int, max_exponent10); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, has_infinity); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, has_quiet_NaN); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, has_signaling_NaN); +__STL_DEFINE_NUMERIC_BASE_MEMBER(float_denorm_style, has_denorm); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, has_denorm_loss); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_iec559); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_bounded); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_modulo); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, traps); +__STL_DEFINE_NUMERIC_BASE_MEMBER(bool, tinyness_before); +__STL_DEFINE_NUMERIC_BASE_MEMBER(float_round_style, round_style); + + +// Base class for integers. + +template +class _Integer_limits : public _Numeric_limits_base<_Int> +{ +public: + __STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true); + + static _Int min() __STL_NOTHROW { return __imin; } + static _Int max() __STL_NOTHROW { return __imax; } + + __STL_DECLARE_LIMITS_MEMBER(int, + digits, + (__idigits < 0) ? (int)(sizeof(_Int) * CHAR_BIT) + - (__imin == 0 ? 0 : 1) + : __idigits); + __STL_DECLARE_LIMITS_MEMBER(int, digits10, (digits * 301) / 1000); + // log 2 = 0.301029995664... + + __STL_DECLARE_LIMITS_MEMBER(bool, is_signed, __imin != 0); + __STL_DECLARE_LIMITS_MEMBER(bool, is_integer, true); + __STL_DECLARE_LIMITS_MEMBER(bool, is_exact, true); + __STL_DECLARE_LIMITS_MEMBER(int, radix, 2); + + __STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true); + __STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, __ismod); +}; + +#ifdef __STL_STATIC_CONST_INIT_BUG +# define __STL_DEFINE_INTEGER_LIMITS_MEMBER(__type, __mem) +#else /* __STL_STATIC_CONST_INIT_BUG */ +# define __STL_DEFINE_INTEGER_LIMITS_MEMBER(__type, __mem) \ + template \ + const __type _Integer_limits<_Int, __imin, __imax, __idig, __ismod>::__mem +#endif /* __STL_STATIC_CONST_INIT_BUG */ + +__STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_specialized); +__STL_DEFINE_INTEGER_LIMITS_MEMBER(int, digits); +__STL_DEFINE_INTEGER_LIMITS_MEMBER(int, digits10); +__STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_signed); +__STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_integer); +__STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_exact); +__STL_DEFINE_INTEGER_LIMITS_MEMBER(int, radix); +__STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_bounded); +__STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_modulo); + + +// Base class for floating-point numbers. +template +class _Floating_limits : public _Numeric_limits_base<__number> +{ +public: + __STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true); + + __STL_DECLARE_LIMITS_MEMBER(int, digits, __Digits); + __STL_DECLARE_LIMITS_MEMBER(int, digits10, __Digits10); + + __STL_DECLARE_LIMITS_MEMBER(bool, is_signed, true); + + __STL_DECLARE_LIMITS_MEMBER(int, radix, 2); + + __STL_DECLARE_LIMITS_MEMBER(int, min_exponent, __MinExp); + __STL_DECLARE_LIMITS_MEMBER(int, max_exponent, __MaxExp); + __STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, __MinExp10); + __STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, __MaxExp10); + + __STL_DECLARE_LIMITS_MEMBER(bool, has_infinity, true); + __STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN, true); + __STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, true); + __STL_DECLARE_LIMITS_MEMBER(float_denorm_style, + has_denorm, + denorm_indeterminate); + __STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss, false); + + __STL_DECLARE_LIMITS_MEMBER(bool, is_iec559, __IsIEC559); + __STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true); + __STL_DECLARE_LIMITS_MEMBER(bool, traps, true); + __STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false); + + __STL_DECLARE_LIMITS_MEMBER(float_round_style, round_style, __RoundStyle); +}; + +#ifdef __STL_STATIC_CONST_INIT_BUG +# define __STL_DEFINE_FLOAT_LIMITS_MEMBER(__type, __mem) +#else /* __STL_STATIC_CONST_INIT_BUG */ +# define __STL_DEFINE_FLOAT_LIMITS_MEMBER(__type, __mem) \ + template \ + const __type _Floating_limits<__Num, __Dig, __Dig10, \ + __MnX, __MxX, __MnX10, __MxX10, \ + __IsIEEE, __Sty>:: __mem +#endif /* __STL_STATIC_CONST_INIT_BUG */ + +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, is_specialized); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(int, digits); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(int, digits10); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, is_signed); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(int, radix); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(int, min_exponent); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(int, max_exponent); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(int, min_exponent10); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(int, max_exponent10); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, has_infinity); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, has_quiet_NaN); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, has_signaling_NaN); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(float_denorm_style, has_denorm); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, has_denorm_loss); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, is_iec559); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, is_bounded); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, traps); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, tinyness_before); +__STL_DEFINE_FLOAT_LIMITS_MEMBER(float_round_style, round_style); + + +#undef __STL_DECLARE_NUMERIC_LIMITS_MEMBER +#undef __STL_DEFINE_NUMERIC_BASE_MEMBER +#undef __STL_DEFINE_INTEGER_LIMITS_MEMBER +#undef __STL_DEFINE_FLOAT_LIMITS_MEMBER + +// Class numeric_limits + +// The unspecialized class. + +template +class numeric_limits : public _Numeric_limits_base<_Tp> {}; + +// Specializations for all built-in integral types. + +#ifndef __STL_NO_BOOL + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +#endif /* __STL_NO_BOOL */ + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +#ifdef __STL_HAS_WCHAR_T + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +#endif + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +#ifdef __STL_LONG_LONG + +// Some compilers have long long, but don't define the +// LONGLONG_MIN and LONGLONG_MAX macros in limits.h. This +// assumes that long long is 64 bits. +#if !defined(LONGLONG_MIN) && !defined(LONGLONG_MAX) \ + && !defined(ULONGLONG_MAX) + +#define ULONGLONG_MAX 0xffffffffffffffffLLU +#define LONGLONG_MAX 0x7fffffffffffffffLL +#define LONGLONG_MIN (-LONGLONG_MAX - 1LL) + +#endif + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +__STL_TEMPLATE_NULL +class numeric_limits + : public _Integer_limits +{}; + +#endif /* __STL_LONG_LONG */ + +// Specializations for all built-in floating-point type. + +__STL_TEMPLATE_NULL class numeric_limits + : public _Floating_limits +{ +public: + static float min() __STL_NOTHROW { return FLT_MIN; } + static float denorm_min() __STL_NOTHROW { return FLT_MIN; } + static float max() __STL_NOTHROW { return FLT_MAX; } + static float epsilon() __STL_NOTHROW { return FLT_EPSILON; } + static float round_error() __STL_NOTHROW { return 0.5f; } // Units: ulps. + static float infinity() __STL_NOTHROW; + static float quiet_NaN() __STL_NOTHROW; + static float signaling_NaN() __STL_NOTHROW; +}; + +__STL_TEMPLATE_NULL class numeric_limits + : public _Floating_limits +{ +public: + static double min() __STL_NOTHROW { return DBL_MIN; } + static double denorm_min() __STL_NOTHROW { return DBL_MIN; } + static double max() __STL_NOTHROW { return DBL_MAX; } + static double epsilon() __STL_NOTHROW { return DBL_EPSILON; } + static double round_error() __STL_NOTHROW { return 0.5; } // Units: ulps. + static double infinity() __STL_NOTHROW; + static double quiet_NaN() __STL_NOTHROW; + static double signaling_NaN() __STL_NOTHROW; +}; + +__STL_TEMPLATE_NULL class numeric_limits + : public _Floating_limits +{ +public: + static long double min() __STL_NOTHROW { return LDBL_MIN; } + static long double denorm_min() __STL_NOTHROW { return LDBL_MIN; } + static long double max() __STL_NOTHROW { return LDBL_MAX; } + static long double epsilon() __STL_NOTHROW { return LDBL_EPSILON; } + static long double round_error() __STL_NOTHROW { return 4; } // Units: ulps. + static long double infinity() __STL_NOTHROW; + static long double quiet_NaN() __STL_NOTHROW; + static long double signaling_NaN() __STL_NOTHROW; +}; + +// We write special values (Inf and NaN) as bit patterns and +// cast the the appropriate floating-point types. + +#if defined(_MIPSEB) +// Big-endian MIPS. float is 32 bits, double 64, long double 128. + +#define _Define_float(__f, __h, __l) \ + inline float numeric_limits::__f() __STL_NOTHROW { \ + static const unsigned short __x[2] = { __h, __l }; \ + return *reinterpret_cast(__x); } +#define _Define_double(__f, __h, __l) \ + inline double numeric_limits::__f() __STL_NOTHROW { \ + static const unsigned short __x[4] = { __h, __l }; \ + return *reinterpret_cast(__x); } +#define _Define_ldouble(__f, __h, __l) \ + inline long double numeric_limits::__f() __STL_NOTHROW { \ + static const unsigned short __x[8] = { __h, __l }; \ + return *reinterpret_cast(__x); } + +_Define_float(infinity, 0x7f80, 0) +_Define_float(quiet_NaN, 0x7f81, 0) +_Define_float(signaling_NaN, 0x7fc1, 0) + +_Define_double(infinity, 0x7ff0, 0) +_Define_double(quiet_NaN, 0x7ff1, 0) +_Define_double(signaling_NaN, 0x7ff9, 0) + +_Define_ldouble(infinity, 0x7ff0, 0) +_Define_ldouble(quiet_NaN, 0x7ff1, 0) +_Define_ldouble(signaling_NaN, 0x7ff9, 0) + +#elif defined(__i386) || defined(_M_IX86) +// Little-endian ia32. float is 32 bits, double 64, long double 80. + +#define _Define_float(__f, __h, __l) \ + inline float numeric_limits::__f() __STL_NOTHROW { \ + static const unsigned short __x[2] = { __l, __h }; \ + return *reinterpret_cast(__x); } +#define _Define_double(__f, __h, __l) \ + inline double numeric_limits::__f() __STL_NOTHROW { \ + static const unsigned short __x[4] = { 0, 0, __l, __h }; \ + return *reinterpret_cast(__x); } +#define _Define_ldouble(__f, __h, __l) \ + inline long double numeric_limits::__f() __STL_NOTHROW { \ + static const unsigned short __x[5] = { 0, 0, 0, __l, __h }; \ + return *reinterpret_cast(__x); } + +_Define_float(infinity, 0x7f80, 0) +_Define_float(quiet_NaN, 0x7fa0, 0) +_Define_float(signaling_NaN, 0x7fc0, 0) + +_Define_double(infinity, 0x7ff0, 0) +_Define_double(quiet_NaN, 0x7ff4, 0) +_Define_double(signaling_NaN, 0x7ff8, 0) + +_Define_ldouble(infinity, 0x7fff, 0x8000) +_Define_ldouble(quiet_NaN, 0x7fff, 0xa000) +_Define_ldouble(signaling_NaN, 0x7fff, 0xc000) + +#else + +/* This is an architecture we don't know how to handle. Return some + obviously wrong values. */ + +#define _Define_float(__f) \ + inline float numeric_limits::__f() __STL_NOTHROW { \ + return 0; } +#define _Define_double(__f) \ + inline double numeric_limits::__f() __STL_NOTHROW { \ + return 0; } +#define _Define_ldouble(__f) \ + inline long double numeric_limits::__f() __STL_NOTHROW { \ + return 0; } + +_Define_float(infinity) +_Define_float(quiet_NaN) +_Define_float(signaling_NaN) + +_Define_double(infinity) +_Define_double(quiet_NaN) +_Define_double(signaling_NaN) + +_Define_ldouble(infinity) +_Define_ldouble(quiet_NaN) +_Define_ldouble(signaling_NaN) + +#endif + +#undef _Define_float +#undef _Define_double +#undef _Define_ldouble + +__STL_END_NAMESPACE + +#endif /* __SGI_CPP_LIMITS */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/list b/src/UWE_projectCode/SGI STL源码/SGI STL源码/list new file mode 100644 index 0000000..5294f39 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/list @@ -0,0 +1,40 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_LIST +#define __SGI_STL_LIST + +#include +#include +#include +#include +#include + +#endif /* __SGI_STL_LIST */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/list.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/list.h new file mode 100644 index 0000000..4e6ee0b --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/list.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_LIST_H +#define __SGI_STL_LIST_H + +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::list; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_LIST_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/map b/src/UWE_projectCode/SGI STL源码/SGI STL源码/map new file mode 100644 index 0000000..4cfb765 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/map @@ -0,0 +1,40 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_MAP +#define __SGI_STL_MAP + +#ifndef __SGI_STL_INTERNAL_TREE_H +#include +#endif +#include +#include + +#endif /* __SGI_STL_MAP */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/map.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/map.h new file mode 100644 index 0000000..902f66e --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/map.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_MAP_H +#define __SGI_STL_MAP_H + +#ifndef __SGI_STL_INTERNAL_TREE_H +#include +#endif +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::rb_tree; +using __STD::map; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_MAP_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/memory b/src/UWE_projectCode/SGI STL源码/SGI STL源码/memory new file mode 100644 index 0000000..a1b096c --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/memory @@ -0,0 +1,134 @@ +/* + * Copyright (c) 1997-1999 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __SGI_STL_MEMORY +#define __SGI_STL_MEMORY + +#include +#include +#include +#include +#include +#include + + +__STL_BEGIN_NAMESPACE + +#if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \ + defined(__STL_MEMBER_TEMPLATES) + +template struct auto_ptr_ref { + _Tp1* _M_ptr; + auto_ptr_ref(_Tp1* __p) : _M_ptr(__p) {} +}; + +#endif + +template class auto_ptr { +private: + _Tp* _M_ptr; + +public: + typedef _Tp element_type; + + explicit auto_ptr(_Tp* __p = 0) __STL_NOTHROW : _M_ptr(__p) {} + auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {} + +#ifdef __STL_MEMBER_TEMPLATES + template auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW + : _M_ptr(__a.release()) {} +#endif /* __STL_MEMBER_TEMPLATES */ + + auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW { + if (&__a != this) { + delete _M_ptr; + _M_ptr = __a.release(); + } + return *this; + } + +#ifdef __STL_MEMBER_TEMPLATES + template + auto_ptr& operator=(auto_ptr<_Tp1>& __a) __STL_NOTHROW { + if (__a.get() != this->get()) { + delete _M_ptr; + _M_ptr = __a.release(); + } + return *this; + } +#endif /* __STL_MEMBER_TEMPLATES */ + + // Note: The C++ standard says there is supposed to be an empty throw + // specification here, but omitting it is standard conforming. Its + // presence can be detected only if _Tp::~_Tp() throws, but (17.4.3.6/2) + // this is prohibited. + ~auto_ptr() { delete _M_ptr; } + + _Tp& operator*() const __STL_NOTHROW { + return *_M_ptr; + } + _Tp* operator->() const __STL_NOTHROW { + return _M_ptr; + } + _Tp* get() const __STL_NOTHROW { + return _M_ptr; + } + _Tp* release() __STL_NOTHROW { + _Tp* __tmp = _M_ptr; + _M_ptr = 0; + return __tmp; + } + void reset(_Tp* __p = 0) __STL_NOTHROW { + if (__p != _M_ptr) { + delete _M_ptr; + _M_ptr = __p; + } + } + + // According to the C++ standard, these conversions are required. Most + // present-day compilers, however, do not enforce that requirement---and, + // in fact, most present-day compilers do not support the language + // features that these conversions rely on. + +#if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \ + defined(__STL_MEMBER_TEMPLATES) + +public: + auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW + : _M_ptr(__ref._M_ptr) {} + + auto_ptr& operator=(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW { + if (__ref._M_ptr != this->get()) { + delete _M_ptr; + _M_ptr = __ref._M_ptr; + } + return *this; + } + + template operator auto_ptr_ref<_Tp1>() __STL_NOTHROW + { return auto_ptr_ref<_Tp1>(this->release()); } + template operator auto_ptr<_Tp1>() __STL_NOTHROW + { return auto_ptr<_Tp1>(this->release()); } + +#endif /* auto ptr conversions && member templates */ +}; + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_MEMORY */ + + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/multimap.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/multimap.h new file mode 100644 index 0000000..44b26be --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/multimap.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_MULTIMAP_H +#define __SGI_STL_MULTIMAP_H + +#ifndef __SGI_STL_INTERNAL_TREE_H +#include +#endif +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::rb_tree; +using __STD::multimap; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_MULTIMAP_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/multiset.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/multiset.h new file mode 100644 index 0000000..91f0379 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/multiset.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_MULTISET_H +#define __SGI_STL_MULTISET_H + +#ifndef __SGI_STL_INTERNAL_TREE_H +#include +#endif +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::rb_tree; +using __STD::multiset; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_MULTISET_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/numeric b/src/UWE_projectCode/SGI STL源码/SGI STL源码/numeric new file mode 100644 index 0000000..98e3237 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/numeric @@ -0,0 +1,49 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_NUMERIC +#define __SGI_STL_NUMERIC + +#include +#include +#include + +#ifdef __STL_USE_NEW_IOSTREAMS +#include +#else /* __STL_USE_NEW_IOSTREAMS */ +#include +#endif /* __STL_USE_NEW_IOSTREAMS */ + +#include +#include +#include +#include + +#endif /* __SGI_STL_NUMERIC */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/pair.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/pair.h new file mode 100644 index 0000000..00f5cad --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/pair.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_PAIR_H +#define __SGI_STL_PAIR_H + +#ifndef __STL_CONFIG_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_RELOPS +#include +#endif +#ifndef __SGI_STL_INTERNAL_PAIR_H +#include +#endif + +#ifdef __STL_USE_NAMESPACES + +using __STD::pair; +using __STD::make_pair; + +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_PAIR_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/pthread_alloc b/src/UWE_projectCode/SGI STL源码/SGI STL源码/pthread_alloc new file mode 100644 index 0000000..33073da --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/pthread_alloc @@ -0,0 +1,495 @@ +/* + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_PTHREAD_ALLOC +#define __SGI_STL_PTHREAD_ALLOC + +// Pthread-specific node allocator. +// This is similar to the default allocator, except that free-list +// information is kept separately for each thread, avoiding locking. +// This should be reasonably fast even in the presence of threads. +// The down side is that storage may not be well-utilized. +// It is not an error to allocate memory in thread A and deallocate +// it in thread B. But this effectively transfers ownership of the memory, +// so that it can only be reallocated by thread B. Thus this can effectively +// result in a storage leak if it's done on a regular basis. +// It can also result in frequent sharing of +// cache lines among processors, with potentially serious performance +// consequences. + +#include +#include +#include +#ifndef __RESTRICT +# define __RESTRICT +#endif + +#ifndef __STL_NO_BAD_ALLOC +# include +#endif + +__STL_BEGIN_NAMESPACE + +#define __STL_DATA_ALIGNMENT 8 + +union _Pthread_alloc_obj { + union _Pthread_alloc_obj * __free_list_link; + char __client_data[__STL_DATA_ALIGNMENT]; /* The client sees this. */ +}; + +// Pthread allocators don't appear to the client to have meaningful +// instances. We do in fact need to associate some state with each +// thread. That state is represented by +// _Pthread_alloc_per_thread_state<_Max_size>. + +template +struct _Pthread_alloc_per_thread_state { + typedef _Pthread_alloc_obj __obj; + enum { _S_NFREELISTS = _Max_size/__STL_DATA_ALIGNMENT }; + _Pthread_alloc_obj* volatile __free_list[_S_NFREELISTS]; + _Pthread_alloc_per_thread_state<_Max_size> * __next; + // Free list link for list of available per thread structures. + // When one of these becomes available for reuse due to thread + // termination, any objects in its free list remain associated + // with it. The whole structure may then be used by a newly + // created thread. + _Pthread_alloc_per_thread_state() : __next(0) + { + memset((void *)__free_list, 0, (size_t) _S_NFREELISTS * sizeof(__obj *)); + } + // Returns an object of size __n, and possibly adds to size n free list. + void *_M_refill(size_t __n); +}; + +// Pthread-specific allocator. +// The argument specifies the largest object size allocated from per-thread +// free lists. Larger objects are allocated using malloc_alloc. +// Max_size must be a power of 2. +template +class _Pthread_alloc_template { + +public: // but only for internal use: + + typedef _Pthread_alloc_obj __obj; + + // Allocates a chunk for nobjs of size size. nobjs may be reduced + // if it is inconvenient to allocate the requested number. + static char *_S_chunk_alloc(size_t __size, int &__nobjs); + + enum {_S_ALIGN = __STL_DATA_ALIGNMENT}; + + static size_t _S_round_up(size_t __bytes) { + return (((__bytes) + (int) _S_ALIGN-1) & ~((int) _S_ALIGN - 1)); + } + static size_t _S_freelist_index(size_t __bytes) { + return (((__bytes) + (int) _S_ALIGN-1)/(int)_S_ALIGN - 1); + } + +private: + // Chunk allocation state. And other shared state. + // Protected by _S_chunk_allocator_lock. + static pthread_mutex_t _S_chunk_allocator_lock; + static char *_S_start_free; + static char *_S_end_free; + static size_t _S_heap_size; + static _Pthread_alloc_per_thread_state<_Max_size>* _S_free_per_thread_states; + static pthread_key_t _S_key; + static bool _S_key_initialized; + // Pthread key under which per thread state is stored. + // Allocator instances that are currently unclaimed by any thread. + static void _S_destructor(void *instance); + // Function to be called on thread exit to reclaim per thread + // state. + static _Pthread_alloc_per_thread_state<_Max_size> *_S_new_per_thread_state(); + // Return a recycled or new per thread state. + static _Pthread_alloc_per_thread_state<_Max_size> *_S_get_per_thread_state(); + // ensure that the current thread has an associated + // per thread state. + class _M_lock; + friend class _M_lock; + class _M_lock { + public: + _M_lock () { pthread_mutex_lock(&_S_chunk_allocator_lock); } + ~_M_lock () { pthread_mutex_unlock(&_S_chunk_allocator_lock); } + }; + +public: + + /* n must be > 0 */ + static void * allocate(size_t __n) + { + __obj * volatile * __my_free_list; + __obj * __RESTRICT __result; + _Pthread_alloc_per_thread_state<_Max_size>* __a; + + if (__n > _Max_size) { + return(malloc_alloc::allocate(__n)); + } + if (!_S_key_initialized || + !(__a = (_Pthread_alloc_per_thread_state<_Max_size>*) + pthread_getspecific(_S_key))) { + __a = _S_get_per_thread_state(); + } + __my_free_list = __a -> __free_list + _S_freelist_index(__n); + __result = *__my_free_list; + if (__result == 0) { + void *__r = __a -> _M_refill(_S_round_up(__n)); + return __r; + } + *__my_free_list = __result -> __free_list_link; + return (__result); + }; + + /* p may not be 0 */ + static void deallocate(void *__p, size_t __n) + { + __obj *__q = (__obj *)__p; + __obj * volatile * __my_free_list; + _Pthread_alloc_per_thread_state<_Max_size>* __a; + + if (__n > _Max_size) { + malloc_alloc::deallocate(__p, __n); + return; + } + if (!_S_key_initialized || + !(__a = (_Pthread_alloc_per_thread_state<_Max_size> *) + pthread_getspecific(_S_key))) { + __a = _S_get_per_thread_state(); + } + __my_free_list = __a->__free_list + _S_freelist_index(__n); + __q -> __free_list_link = *__my_free_list; + *__my_free_list = __q; + } + + static void * reallocate(void *__p, size_t __old_sz, size_t __new_sz); + +} ; + +typedef _Pthread_alloc_template<> pthread_alloc; + + +template +void _Pthread_alloc_template<_Max_size>::_S_destructor(void * __instance) +{ + _M_lock __lock_instance; // Need to acquire lock here. + _Pthread_alloc_per_thread_state<_Max_size>* __s = + (_Pthread_alloc_per_thread_state<_Max_size> *)__instance; + __s -> __next = _S_free_per_thread_states; + _S_free_per_thread_states = __s; +} + +template +_Pthread_alloc_per_thread_state<_Max_size> * +_Pthread_alloc_template<_Max_size>::_S_new_per_thread_state() +{ + /* lock already held here. */ + if (0 != _S_free_per_thread_states) { + _Pthread_alloc_per_thread_state<_Max_size> *__result = + _S_free_per_thread_states; + _S_free_per_thread_states = _S_free_per_thread_states -> __next; + return __result; + } else { + return new _Pthread_alloc_per_thread_state<_Max_size>; + } +} + +template +_Pthread_alloc_per_thread_state<_Max_size> * +_Pthread_alloc_template<_Max_size>::_S_get_per_thread_state() +{ + /*REFERENCED*/ + _M_lock __lock_instance; // Need to acquire lock here. + int __ret_code; + _Pthread_alloc_per_thread_state<_Max_size> * __result; + if (!_S_key_initialized) { + if (pthread_key_create(&_S_key, _S_destructor)) { + __THROW_BAD_ALLOC; // defined in stl_alloc.h + } + _S_key_initialized = true; + } + __result = _S_new_per_thread_state(); + __ret_code = pthread_setspecific(_S_key, __result); + if (__ret_code) { + if (__ret_code == ENOMEM) { + __THROW_BAD_ALLOC; + } else { + // EINVAL + abort(); + } + } + return __result; +} + +/* We allocate memory in large chunks in order to avoid fragmenting */ +/* the malloc heap too much. */ +/* We assume that size is properly aligned. */ +template +char *_Pthread_alloc_template<_Max_size> +::_S_chunk_alloc(size_t __size, int &__nobjs) +{ + { + char * __result; + size_t __total_bytes; + size_t __bytes_left; + /*REFERENCED*/ + _M_lock __lock_instance; // Acquire lock for this routine + + __total_bytes = __size * __nobjs; + __bytes_left = _S_end_free - _S_start_free; + if (__bytes_left >= __total_bytes) { + __result = _S_start_free; + _S_start_free += __total_bytes; + return(__result); + } else if (__bytes_left >= __size) { + __nobjs = __bytes_left/__size; + __total_bytes = __size * __nobjs; + __result = _S_start_free; + _S_start_free += __total_bytes; + return(__result); + } else { + size_t __bytes_to_get = + 2 * __total_bytes + _S_round_up(_S_heap_size >> 4); + // Try to make use of the left-over piece. + if (__bytes_left > 0) { + _Pthread_alloc_per_thread_state<_Max_size>* __a = + (_Pthread_alloc_per_thread_state<_Max_size>*) + pthread_getspecific(_S_key); + __obj * volatile * __my_free_list = + __a->__free_list + _S_freelist_index(__bytes_left); + + ((__obj *)_S_start_free) -> __free_list_link = *__my_free_list; + *__my_free_list = (__obj *)_S_start_free; + } +# ifdef _SGI_SOURCE + // Try to get memory that's aligned on something like a + // cache line boundary, so as to avoid parceling out + // parts of the same line to different threads and thus + // possibly different processors. + { + const int __cache_line_size = 128; // probable upper bound + __bytes_to_get &= ~(__cache_line_size-1); + _S_start_free = (char *)memalign(__cache_line_size, __bytes_to_get); + if (0 == _S_start_free) { + _S_start_free = (char *)malloc_alloc::allocate(__bytes_to_get); + } + } +# else /* !SGI_SOURCE */ + _S_start_free = (char *)malloc_alloc::allocate(__bytes_to_get); +# endif + _S_heap_size += __bytes_to_get; + _S_end_free = _S_start_free + __bytes_to_get; + } + } + // lock is released here + return(_S_chunk_alloc(__size, __nobjs)); +} + + +/* Returns an object of size n, and optionally adds to size n free list.*/ +/* We assume that n is properly aligned. */ +/* We hold the allocation lock. */ +template +void *_Pthread_alloc_per_thread_state<_Max_size> +::_M_refill(size_t __n) +{ + int __nobjs = 128; + char * __chunk = + _Pthread_alloc_template<_Max_size>::_S_chunk_alloc(__n, __nobjs); + __obj * volatile * __my_free_list; + __obj * __result; + __obj * __current_obj, * __next_obj; + int __i; + + if (1 == __nobjs) { + return(__chunk); + } + __my_free_list = __free_list + + _Pthread_alloc_template<_Max_size>::_S_freelist_index(__n); + + /* Build free list in chunk */ + __result = (__obj *)__chunk; + *__my_free_list = __next_obj = (__obj *)(__chunk + __n); + for (__i = 1; ; __i++) { + __current_obj = __next_obj; + __next_obj = (__obj *)((char *)__next_obj + __n); + if (__nobjs - 1 == __i) { + __current_obj -> __free_list_link = 0; + break; + } else { + __current_obj -> __free_list_link = __next_obj; + } + } + return(__result); +} + +template +void *_Pthread_alloc_template<_Max_size> +::reallocate(void *__p, size_t __old_sz, size_t __new_sz) +{ + void * __result; + size_t __copy_sz; + + if (__old_sz > _Max_size + && __new_sz > _Max_size) { + return(realloc(__p, __new_sz)); + } + if (_S_round_up(__old_sz) == _S_round_up(__new_sz)) return(__p); + __result = allocate(__new_sz); + __copy_sz = __new_sz > __old_sz? __old_sz : __new_sz; + memcpy(__result, __p, __copy_sz); + deallocate(__p, __old_sz); + return(__result); +} + +template +_Pthread_alloc_per_thread_state<_Max_size> * +_Pthread_alloc_template<_Max_size>::_S_free_per_thread_states = 0; + +template +pthread_key_t _Pthread_alloc_template<_Max_size>::_S_key; + +template +bool _Pthread_alloc_template<_Max_size>::_S_key_initialized = false; + +template +pthread_mutex_t _Pthread_alloc_template<_Max_size>::_S_chunk_allocator_lock += PTHREAD_MUTEX_INITIALIZER; + +template +char *_Pthread_alloc_template<_Max_size> +::_S_start_free = 0; + +template +char *_Pthread_alloc_template<_Max_size> +::_S_end_free = 0; + +template +size_t _Pthread_alloc_template<_Max_size> +::_S_heap_size = 0; + +#ifdef __STL_USE_STD_ALLOCATORS + +template +class pthread_allocator { + typedef pthread_alloc _S_Alloc; // The underlying allocator. +public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + template struct rebind { + typedef pthread_allocator<_NewType> other; + }; + + pthread_allocator() __STL_NOTHROW {} + pthread_allocator(const pthread_allocator& a) __STL_NOTHROW {} + template + pthread_allocator(const pthread_allocator<_OtherType>&) + __STL_NOTHROW {} + ~pthread_allocator() __STL_NOTHROW {} + + pointer address(reference __x) const { return &__x; } + const_pointer address(const_reference __x) const { return &__x; } + + // __n is permitted to be 0. The C++ standard says nothing about what + // the return value is when __n == 0. + _Tp* allocate(size_type __n, const void* = 0) { + return __n != 0 ? static_cast<_Tp*>(_S_Alloc::allocate(__n * sizeof(_Tp))) + : 0; + } + + // p is not permitted to be a null pointer. + void deallocate(pointer __p, size_type __n) + { _S_Alloc::deallocate(__p, __n * sizeof(_Tp)); } + + size_type max_size() const __STL_NOTHROW + { return size_t(-1) / sizeof(_Tp); } + + void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); } + void destroy(pointer _p) { _p->~_Tp(); } +}; + +template<> +class pthread_allocator { +public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef void* pointer; + typedef const void* const_pointer; + typedef void value_type; + + template struct rebind { + typedef pthread_allocator<_NewType> other; + }; +}; + +template +inline bool operator==(const _Pthread_alloc_template<_Max_size>&, + const _Pthread_alloc_template<_Max_size>&) +{ + return true; +} + +template +inline bool operator==(const pthread_allocator<_T1>&, + const pthread_allocator<_T2>& a2) +{ + return true; +} + +template +inline bool operator!=(const pthread_allocator<_T1>&, + const pthread_allocator<_T2>&) +{ + return false; +} + +template +struct _Alloc_traits<_Tp, _Pthread_alloc_template<_Max_size> > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, _Pthread_alloc_template<_Max_size> > _Alloc_type; + typedef __allocator<_Tp, _Pthread_alloc_template<_Max_size> > + allocator_type; +}; + +template +struct _Alloc_traits<_Tp, __allocator<_Atype, _Pthread_alloc_template<_Max> > > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, _Pthread_alloc_template<_Max> > _Alloc_type; + typedef __allocator<_Tp, _Pthread_alloc_template<_Max> > allocator_type; +}; + +template +struct _Alloc_traits<_Tp, pthread_allocator<_Atype> > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, _Pthread_alloc_template<> > _Alloc_type; + typedef pthread_allocator<_Tp> allocator_type; +}; + + +#endif /* __STL_USE_STD_ALLOCATORS */ + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_PTHREAD_ALLOC */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/pthread_alloc.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/pthread_alloc.h new file mode 100644 index 0000000..774ef04 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/pthread_alloc.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 1996-1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_PTHREAD_ALLOC_H +#define __SGI_STL_PTHREAD_ALLOC_H + +#include + +#ifdef __STL_USE_NAMESPACES + +using __STD::_Pthread_alloc_template; +using __STD::pthread_alloc; + +#endif /* __STL_USE_NAMESPACES */ + + +#endif /* __SGI_STL_PTHREAD_ALLOC_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/queue b/src/UWE_projectCode/SGI STL源码/SGI STL源码/queue new file mode 100644 index 0000000..f9417fb --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/queue @@ -0,0 +1,45 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_QUEUE +#define __SGI_STL_QUEUE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif /* __SGI_STL_QUEUE */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/rope b/src/UWE_projectCode/SGI STL源码/SGI STL源码/rope new file mode 100644 index 0000000..f861500 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/rope @@ -0,0 +1,32 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_ROPE +#define __SGI_STL_ROPE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif /* __SGI_STL_ROPE */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/rope.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/rope.h new file mode 100644 index 0000000..d767fa3 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/rope.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_ROPE_H +#define __SGI_STL_ROPE_H + +#include +#include + +#ifdef __STL_USE_NAMESPACES + +using __STD::char_producer; +using __STD::sequence_buffer; +using __STD::rope; +using __STD::crope; +using __STD::wrope; + +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_ROPE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/ropeimpl.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/ropeimpl.h new file mode 100644 index 0000000..e847ecd --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/ropeimpl.h @@ -0,0 +1,1587 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +# include + +#ifdef __STL_USE_NEW_IOSTREAMS +# include +#else /* __STL_USE_NEW_IOSTREAMS */ +# include +#endif /* __STL_USE_NEW_IOSTREAMS */ + +#ifdef __STL_USE_EXCEPTIONS +# include +#endif + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#endif + +// Set buf_start, buf_end, and buf_ptr appropriately, filling tmp_buf +// if necessary. Assumes _M_path_end[leaf_index] and leaf_pos are correct. +// Results in a valid buf_ptr if the iterator can be legitimately +// dereferenced. +template +void _Rope_iterator_base<_CharT,_Alloc>::_S_setbuf( + _Rope_iterator_base<_CharT,_Alloc>& __x) +{ + const _RopeRep* __leaf = __x._M_path_end[__x._M_leaf_index]; + size_t __leaf_pos = __x._M_leaf_pos; + size_t __pos = __x._M_current_pos; + + switch(__leaf->_M_tag) { + case _RopeRep::_S_leaf: + __x._M_buf_start = + ((_Rope_RopeLeaf<_CharT,_Alloc>*)__leaf)->_M_data; + __x._M_buf_ptr = __x._M_buf_start + (__pos - __leaf_pos); + __x._M_buf_end = __x._M_buf_start + __leaf->_M_size; + break; + case _RopeRep::_S_function: + case _RopeRep::_S_substringfn: + { + size_t __len = _S_iterator_buf_len; + size_t __buf_start_pos = __leaf_pos; + size_t __leaf_end = __leaf_pos + __leaf->_M_size; + char_producer<_CharT>* __fn = + ((_Rope_RopeFunction<_CharT,_Alloc>*)__leaf)->_M_fn; + + if (__buf_start_pos + __len <= __pos) { + __buf_start_pos = __pos - __len/4; + if (__buf_start_pos + __len > __leaf_end) { + __buf_start_pos = __leaf_end - __len; + } + } + if (__buf_start_pos + __len > __leaf_end) { + __len = __leaf_end - __buf_start_pos; + } + (*__fn)(__buf_start_pos - __leaf_pos, __len, __x._M_tmp_buf); + __x._M_buf_ptr = __x._M_tmp_buf + (__pos - __buf_start_pos); + __x._M_buf_start = __x._M_tmp_buf; + __x._M_buf_end = __x._M_tmp_buf + __len; + } + break; + default: + __stl_assert(0); + } +} + +// Set path and buffer inside a rope iterator. We assume that +// pos and root are already set. +template +void _Rope_iterator_base<_CharT,_Alloc>::_S_setcache +(_Rope_iterator_base<_CharT,_Alloc>& __x) +{ + const _RopeRep* __path[_RopeRep::_S_max_rope_depth+1]; + const _RopeRep* __curr_rope; + int __curr_depth = -1; /* index into path */ + size_t __curr_start_pos = 0; + size_t __pos = __x._M_current_pos; + unsigned char __dirns = 0; // Bit vector marking right turns in the path + + __stl_assert(__pos <= __x._M_root->_M_size); + if (__pos >= __x._M_root->_M_size) { + __x._M_buf_ptr = 0; + return; + } + __curr_rope = __x._M_root; + if (0 != __curr_rope->_M_c_string) { + /* Treat the root as a leaf. */ + __x._M_buf_start = __curr_rope->_M_c_string; + __x._M_buf_end = __curr_rope->_M_c_string + __curr_rope->_M_size; + __x._M_buf_ptr = __curr_rope->_M_c_string + __pos; + __x._M_path_end[0] = __curr_rope; + __x._M_leaf_index = 0; + __x._M_leaf_pos = 0; + return; + } + for(;;) { + ++__curr_depth; + __stl_assert(__curr_depth <= _RopeRep::_S_max_rope_depth); + __path[__curr_depth] = __curr_rope; + switch(__curr_rope->_M_tag) { + case _RopeRep::_S_leaf: + case _RopeRep::_S_function: + case _RopeRep::_S_substringfn: + __x._M_leaf_pos = __curr_start_pos; + goto done; + case _RopeRep::_S_concat: + { + _Rope_RopeConcatenation<_CharT,_Alloc>* __c = + (_Rope_RopeConcatenation<_CharT,_Alloc>*)__curr_rope; + _RopeRep* __left = __c->_M_left; + size_t __left_len = __left->_M_size; + + __dirns <<= 1; + if (__pos >= __curr_start_pos + __left_len) { + __dirns |= 1; + __curr_rope = __c->_M_right; + __curr_start_pos += __left_len; + } else { + __curr_rope = __left; + } + } + break; + } + } + done: + // Copy last section of path into _M_path_end. + { + int __i = -1; + int __j = __curr_depth + 1 - _S_path_cache_len; + + if (__j < 0) __j = 0; + while (__j <= __curr_depth) { + __x._M_path_end[++__i] = __path[__j++]; + } + __x._M_leaf_index = __i; + } + __x._M_path_directions = __dirns; + _S_setbuf(__x); +} + +// Specialized version of the above. Assumes that +// the path cache is valid for the previous position. +template +void _Rope_iterator_base<_CharT,_Alloc>::_S_setcache_for_incr +(_Rope_iterator_base<_CharT,_Alloc>& __x) +{ + int __current_index = __x._M_leaf_index; + const _RopeRep* __current_node = __x._M_path_end[__current_index]; + size_t __len = __current_node->_M_size; + size_t __node_start_pos = __x._M_leaf_pos; + unsigned char __dirns = __x._M_path_directions; + _Rope_RopeConcatenation<_CharT,_Alloc>* __c; + + __stl_assert(__x._M_current_pos <= __x._M_root->_M_size); + if (__x._M_current_pos - __node_start_pos < __len) { + /* More stuff in this leaf, we just didn't cache it. */ + _S_setbuf(__x); + return; + } + __stl_assert(__node_start_pos + __len == __x._M_current_pos); + // node_start_pos is starting position of last_node. + while (--__current_index >= 0) { + if (!(__dirns & 1) /* Path turned left */) + break; + __current_node = __x._M_path_end[__current_index]; + __c = (_Rope_RopeConcatenation<_CharT,_Alloc>*)__current_node; + // Otherwise we were in the right child. Thus we should pop + // the concatenation node. + __node_start_pos -= __c->_M_left->_M_size; + __dirns >>= 1; + } + if (__current_index < 0) { + // We underflowed the cache. Punt. + _S_setcache(__x); + return; + } + __current_node = __x._M_path_end[__current_index]; + __c = (_Rope_RopeConcatenation<_CharT,_Alloc>*)__current_node; + // current_node is a concatenation node. We are positioned on the first + // character in its right child. + // node_start_pos is starting position of current_node. + __node_start_pos += __c->_M_left->_M_size; + __current_node = __c->_M_right; + __x._M_path_end[++__current_index] = __current_node; + __dirns |= 1; + while (_RopeRep::_S_concat == __current_node->_M_tag) { + ++__current_index; + if (_S_path_cache_len == __current_index) { + int __i; + for (__i = 0; __i < _S_path_cache_len-1; __i++) { + __x._M_path_end[__i] = __x._M_path_end[__i+1]; + } + --__current_index; + } + __current_node = + ((_Rope_RopeConcatenation<_CharT,_Alloc>*)__current_node)->_M_left; + __x._M_path_end[__current_index] = __current_node; + __dirns <<= 1; + // node_start_pos is unchanged. + } + __x._M_leaf_index = __current_index; + __x._M_leaf_pos = __node_start_pos; + __x._M_path_directions = __dirns; + _S_setbuf(__x); +} + +template +void _Rope_iterator_base<_CharT,_Alloc>::_M_incr(size_t __n) { + _M_current_pos += __n; + if (0 != _M_buf_ptr) { + size_t __chars_left = _M_buf_end - _M_buf_ptr; + if (__chars_left > __n) { + _M_buf_ptr += __n; + } else if (__chars_left == __n) { + _M_buf_ptr += __n; + _S_setcache_for_incr(*this); + } else { + _M_buf_ptr = 0; + } + } +} + +template +void _Rope_iterator_base<_CharT,_Alloc>::_M_decr(size_t __n) { + if (0 != _M_buf_ptr) { + size_t __chars_left = _M_buf_ptr - _M_buf_start; + if (__chars_left >= __n) { + _M_buf_ptr -= __n; + } else { + _M_buf_ptr = 0; + } + } + _M_current_pos -= __n; +} + +template +void _Rope_iterator<_CharT,_Alloc>::_M_check() { + if (_M_root_rope->_M_tree_ptr != _M_root) { + // _Rope was modified. Get things fixed up. + _RopeRep::_S_unref(_M_root); + _M_root = _M_root_rope->_M_tree_ptr; + _RopeRep::_S_ref(_M_root); + _M_buf_ptr = 0; + } +} + +template +inline +_Rope_const_iterator<_CharT, _Alloc>::_Rope_const_iterator( + const _Rope_iterator<_CharT,_Alloc>& __x) +: _Rope_iterator_base<_CharT,_Alloc>(__x) +{ } + +template +inline _Rope_iterator<_CharT,_Alloc>::_Rope_iterator( + rope<_CharT,_Alloc>& __r, size_t __pos) +: _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr, __pos), + _M_root_rope(&__r) +{ + _RopeRep::_S_ref(_M_root); +} + +template +inline size_t +rope<_CharT,_Alloc>::_S_char_ptr_len(const _CharT* __s) +{ + const _CharT* __p = __s; + + while (!_S_is0(*__p)) { ++__p; } + return (__p - __s); +} + + +#ifndef __GC + +template +inline void _Rope_RopeRep<_CharT,_Alloc>::_M_free_c_string() +{ + _CharT* __cstr = _M_c_string; + if (0 != __cstr) { + size_t __size = _M_size + 1; + destroy(__cstr, __cstr + __size); + _Data_deallocate(__cstr, __size); + } +} + + +template +#ifdef __STL_USE_STD_ALLOCATORS + inline void _Rope_RopeRep<_CharT,_Alloc>::_S_free_string(_CharT* __s, + size_t __n, + allocator_type __a) +#else + inline void _Rope_RopeRep<_CharT,_Alloc>::_S_free_string(_CharT* __s, + size_t __n) +#endif +{ + if (!_S_is_basic_char_type((_CharT*)0)) { + destroy(__s, __s + __n); + } +// This has to be a static member, so this gets a bit messy +# ifdef __STL_USE_STD_ALLOCATORS + __a.deallocate( + __s, _Rope_RopeLeaf<_CharT,_Alloc>::_S_rounded_up_size(__n)); +# else + _Data_deallocate( + __s, _Rope_RopeLeaf<_CharT,_Alloc>::_S_rounded_up_size(__n)); +# endif +} + + +// There are several reasons for not doing this with virtual destructors +// and a class specific delete operator: +// - A class specific delete operator can't easily get access to +// allocator instances if we need them. +// - Any virtual function would need a 4 or byte vtable pointer; +// this only requires a one byte tag per object. +template +void _Rope_RopeRep<_CharT,_Alloc>::_M_free_tree() +{ + switch(_M_tag) { + case _S_leaf: + { + _Rope_RopeLeaf<_CharT,_Alloc>* __l + = (_Rope_RopeLeaf<_CharT,_Alloc>*)this; + __l->_Rope_RopeLeaf<_CharT,_Alloc>::~_Rope_RopeLeaf(); + _L_deallocate(__l, 1); + break; + } + case _S_concat: + { + _Rope_RopeConcatenation<_CharT,_Alloc>* __c + = (_Rope_RopeConcatenation<_CharT,_Alloc>*)this; + __c->_Rope_RopeConcatenation<_CharT,_Alloc>:: + ~_Rope_RopeConcatenation(); + _C_deallocate(__c, 1); + break; + } + case _S_function: + { + _Rope_RopeFunction<_CharT,_Alloc>* __f + = (_Rope_RopeFunction<_CharT,_Alloc>*)this; + __f->_Rope_RopeFunction<_CharT,_Alloc>::~_Rope_RopeFunction(); + _F_deallocate(__f, 1); + break; + } + case _S_substringfn: + { + _Rope_RopeSubstring<_CharT,_Alloc>* __ss = + (_Rope_RopeSubstring<_CharT,_Alloc>*)this; + __ss->_Rope_RopeSubstring<_CharT,_Alloc>:: + ~_Rope_RopeSubstring(); + _S_deallocate(__ss, 1); + break; + } + } +} +#else + +template +#ifdef __STL_USE_STD_ALLOCATORS + inline void _Rope_RopeRep<_CharT,_Alloc>::_S_free_string + (const _CharT*, size_t, allocator_type) +#else + inline void _Rope_RopeRep<_CharT,_Alloc>::_S_free_string + (const _CharT*, size_t) +#endif +{} + +#endif + + +// Concatenate a C string onto a leaf rope by copying the rope data. +// Used for short ropes. +template +rope<_CharT,_Alloc>::_RopeLeaf* +rope<_CharT,_Alloc>::_S_leaf_concat_char_iter + (_RopeLeaf* __r, const _CharT* __iter, size_t __len) +{ + size_t __old_len = __r->_M_size; + _CharT* __new_data = (_CharT*) + _Data_allocate(_S_rounded_up_size(__old_len + __len)); + _RopeLeaf* __result; + + uninitialized_copy_n(__r->_M_data, __old_len, __new_data); + uninitialized_copy_n(__iter, __len, __new_data + __old_len); + _S_cond_store_eos(__new_data[__old_len + __len]); + __STL_TRY { + __result = _S_new_RopeLeaf(__new_data, __old_len + __len, + __r->get_allocator()); + } + __STL_UNWIND(_RopeRep::__STL_FREE_STRING(__new_data, __old_len + __len, + __r->get_allocator())); + return __result; +} + +#ifndef __GC +// As above, but it's OK to clobber original if refcount is 1 +template +rope<_CharT,_Alloc>::_RopeLeaf* +rope<_CharT,_Alloc>::_S_destr_leaf_concat_char_iter + (_RopeLeaf* __r, const _CharT* __iter, size_t __len) +{ + __stl_assert(__r->_M_ref_count >= 1); + if (__r->_M_ref_count > 1) + return _S_leaf_concat_char_iter(__r, __iter, __len); + size_t __old_len = __r->_M_size; + if (_S_allocated_capacity(__old_len) >= __old_len + __len) { + // The space has been partially initialized for the standard + // character types. But that doesn't matter for those types. + uninitialized_copy_n(__iter, __len, __r->_M_data + __old_len); + if (_S_is_basic_char_type((_CharT*)0)) { + _S_cond_store_eos(__r->_M_data[__old_len + __len]); + __stl_assert(__r->_M_c_string == __r->_M_data); + } else if (__r->_M_c_string != __r->_M_data && 0 != __r->_M_c_string) { + __r->_M_free_c_string(); + __r->_M_c_string = 0; + } + __r->_M_size = __old_len + __len; + __stl_assert(__r->_M_ref_count == 1); + __r->_M_ref_count = 2; + return __r; + } else { + _RopeLeaf* __result = _S_leaf_concat_char_iter(__r, __iter, __len); + __stl_assert(__result->_M_ref_count == 1); + return __result; + } +} +#endif + +// Assumes left and right are not 0. +// Does not increment (nor decrement on exception) child reference counts. +// Result has ref count 1. +template +rope<_CharT,_Alloc>::_RopeRep* +rope<_CharT,_Alloc>::_S_tree_concat (_RopeRep* __left, _RopeRep* __right) +{ + _RopeConcatenation* __result = + _S_new_RopeConcatenation(__left, __right, __left->get_allocator()); + size_t __depth = __result->_M_depth; + +# ifdef __STL_USE_STD_ALLOCATORS + __stl_assert(__left->get_allocator() == __right->get_allocator()); +# endif + if (__depth > 20 && (__result->_M_size < 1000 || + __depth > _RopeRep::_S_max_rope_depth)) { + _RopeRep* __balanced; + + __STL_TRY { + __balanced = _S_balance(__result); +# ifndef __GC + if (__result != __balanced) { + __stl_assert(1 == __result->_M_ref_count + && 1 == __balanced->_M_ref_count); + } +# endif + __result->_M_unref_nonnil(); + } + __STL_UNWIND((_C_deallocate(__result,1))); + // In case of exception, we need to deallocate + // otherwise dangling result node. But caller + // still owns its children. Thus unref is + // inappropriate. + return __balanced; + } else { + return __result; + } +} + +template +rope<_CharT,_Alloc>::_RopeRep* rope<_CharT,_Alloc>::_S_concat_char_iter + (_RopeRep* __r, const _CharT*__s, size_t __slen) +{ + _RopeRep* __result; + if (0 == __slen) { + _S_ref(__r); + return __r; + } + if (0 == __r) + return __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, + __r->get_allocator()); + if (_RopeRep::_S_leaf == __r->_M_tag && + __r->_M_size + __slen <= _S_copy_max) { + __result = _S_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen); +# ifndef __GC + __stl_assert(1 == __result->_M_ref_count); +# endif + return __result; + } + if (_RopeRep::_S_concat == __r->_M_tag + && _RopeRep::_S_leaf == ((_RopeConcatenation*)__r)->_M_right->_M_tag) { + _RopeLeaf* __right = + (_RopeLeaf* )(((_RopeConcatenation* )__r)->_M_right); + if (__right->_M_size + __slen <= _S_copy_max) { + _RopeRep* __left = ((_RopeConcatenation*)__r)->_M_left; + _RopeRep* __nright = + _S_leaf_concat_char_iter((_RopeLeaf*)__right, __s, __slen); + __left->_M_ref_nonnil(); + __STL_TRY { + __result = _S_tree_concat(__left, __nright); + } + __STL_UNWIND(_S_unref(__left); _S_unref(__nright)); +# ifndef __GC + __stl_assert(1 == __result->_M_ref_count); +# endif + return __result; + } + } + _RopeRep* __nright = + __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->get_allocator()); + __STL_TRY { + __r->_M_ref_nonnil(); + __result = _S_tree_concat(__r, __nright); + } + __STL_UNWIND(_S_unref(__r); _S_unref(__nright)); +# ifndef __GC + __stl_assert(1 == __result->_M_ref_count); +# endif + return __result; +} + +#ifndef __GC +template +rope<_CharT,_Alloc>::_RopeRep* +rope<_CharT,_Alloc>::_S_destr_concat_char_iter( + _RopeRep* __r, const _CharT* __s, size_t __slen) +{ + _RopeRep* __result; + if (0 == __r) + return __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, + __r->get_allocator()); + size_t __count = __r->_M_ref_count; + size_t __orig_size = __r->_M_size; + __stl_assert(__count >= 1); + if (__count > 1) return _S_concat_char_iter(__r, __s, __slen); + if (0 == __slen) { + __r->_M_ref_count = 2; // One more than before + return __r; + } + if (__orig_size + __slen <= _S_copy_max && + _RopeRep::_S_leaf == __r->_M_tag) { + __result = _S_destr_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen); + return __result; + } + if (_RopeRep::_S_concat == __r->_M_tag) { + _RopeLeaf* __right = (_RopeLeaf*)(((_RopeConcatenation*)__r)->_M_right); + if (_RopeRep::_S_leaf == __right->_M_tag + && __right->_M_size + __slen <= _S_copy_max) { + _RopeRep* __new_right = + _S_destr_leaf_concat_char_iter(__right, __s, __slen); + if (__right == __new_right) { + __stl_assert(__new_right->_M_ref_count == 2); + __new_right->_M_ref_count = 1; + } else { + __stl_assert(__new_right->_M_ref_count >= 1); + __right->_M_unref_nonnil(); + } + __stl_assert(__r->_M_ref_count == 1); + __r->_M_ref_count = 2; // One more than before. + ((_RopeConcatenation*)__r)->_M_right = __new_right; + __r->_M_size = __orig_size + __slen; + if (0 != __r->_M_c_string) { + __r->_M_free_c_string(); + __r->_M_c_string = 0; + } + return __r; + } + } + _RopeRep* __right = + __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->get_allocator()); + __r->_M_ref_nonnil(); + __STL_TRY { + __result = _S_tree_concat(__r, __right); + } + __STL_UNWIND(_S_unref(__r); _S_unref(__right)) + __stl_assert(1 == __result->_M_ref_count); + return __result; +} +#endif /* !__GC */ + +template +rope<_CharT,_Alloc>::_RopeRep* +rope<_CharT,_Alloc>::_S_concat(_RopeRep* __left, _RopeRep* __right) +{ + if (0 == __left) { + _S_ref(__right); + return __right; + } + if (0 == __right) { + __left->_M_ref_nonnil(); + return __left; + } + if (_RopeRep::_S_leaf == __right->_M_tag) { + if (_RopeRep::_S_leaf == __left->_M_tag) { + if (__right->_M_size + __left->_M_size <= _S_copy_max) { + return _S_leaf_concat_char_iter((_RopeLeaf*)__left, + ((_RopeLeaf*)__right)->_M_data, + __right->_M_size); + } + } else if (_RopeRep::_S_concat == __left->_M_tag + && _RopeRep::_S_leaf == + ((_RopeConcatenation*)__left)->_M_right->_M_tag) { + _RopeLeaf* __leftright = + (_RopeLeaf*)(((_RopeConcatenation*)__left)->_M_right); + if (__leftright->_M_size + __right->_M_size <= _S_copy_max) { + _RopeRep* __leftleft = ((_RopeConcatenation*)__left)->_M_left; + _RopeRep* __rest = _S_leaf_concat_char_iter(__leftright, + ((_RopeLeaf*)__right)->_M_data, + __right->_M_size); + __leftleft->_M_ref_nonnil(); + __STL_TRY { + return(_S_tree_concat(__leftleft, __rest)); + } + __STL_UNWIND(_S_unref(__leftleft); _S_unref(__rest)) + } + } + } + __left->_M_ref_nonnil(); + __right->_M_ref_nonnil(); + __STL_TRY { + return(_S_tree_concat(__left, __right)); + } + __STL_UNWIND(_S_unref(__left); _S_unref(__right)); +} + +template +rope<_CharT,_Alloc>::_RopeRep* +rope<_CharT,_Alloc>::_S_substring(_RopeRep* __base, + size_t __start, size_t __endp1) +{ + if (0 == __base) return 0; + size_t __len = __base->_M_size; + size_t __adj_endp1; + const size_t __lazy_threshold = 128; + + if (__endp1 >= __len) { + if (0 == __start) { + __base->_M_ref_nonnil(); + return __base; + } else { + __adj_endp1 = __len; + } + } else { + __adj_endp1 = __endp1; + } + switch(__base->_M_tag) { + case _RopeRep::_S_concat: + { + _RopeConcatenation* __c = (_RopeConcatenation*)__base; + _RopeRep* __left = __c->_M_left; + _RopeRep* __right = __c->_M_right; + size_t __left_len = __left->_M_size; + _RopeRep* __result; + + if (__adj_endp1 <= __left_len) { + return _S_substring(__left, __start, __endp1); + } else if (__start >= __left_len) { + return _S_substring(__right, __start - __left_len, + __adj_endp1 - __left_len); + } + _Self_destruct_ptr __left_result( + _S_substring(__left, __start, __left_len)); + _Self_destruct_ptr __right_result( + _S_substring(__right, 0, __endp1 - __left_len)); + __result = _S_concat(__left_result, __right_result); +# ifndef __GC + __stl_assert(1 == __result->_M_ref_count); +# endif + return __result; + } + case _RopeRep::_S_leaf: + { + _RopeLeaf* __l = (_RopeLeaf*)__base; + _RopeLeaf* __result; + size_t __result_len; + if (__start >= __adj_endp1) return 0; + __result_len = __adj_endp1 - __start; + if (__result_len > __lazy_threshold) goto lazy; +# ifdef __GC + const _CharT* __section = __l->_M_data + __start; + __result = _S_new_RopeLeaf(__section, __result_len, + __base->get_allocator()); + __result->_M_c_string = 0; // Not eos terminated. +# else + // We should sometimes create substring node instead. + __result = __STL_ROPE_FROM_UNOWNED_CHAR_PTR( + __l->_M_data + __start, __result_len, + __base->get_allocator()); +# endif + return __result; + } + case _RopeRep::_S_substringfn: + // Avoid introducing multiple layers of substring nodes. + { + _RopeSubstring* __old = (_RopeSubstring*)__base; + size_t __result_len; + if (__start >= __adj_endp1) return 0; + __result_len = __adj_endp1 - __start; + if (__result_len > __lazy_threshold) { + _RopeSubstring* __result = + _S_new_RopeSubstring(__old->_M_base, + __start + __old->_M_start, + __adj_endp1 - __start, + __base->get_allocator()); + return __result; + + } // *** else fall through: *** + } + case _RopeRep::_S_function: + { + _RopeFunction* __f = (_RopeFunction*)__base; + _CharT* __section; + size_t __result_len; + if (__start >= __adj_endp1) return 0; + __result_len = __adj_endp1 - __start; + + if (__result_len > __lazy_threshold) goto lazy; + __section = (_CharT*) + _Data_allocate(_S_rounded_up_size(__result_len)); + __STL_TRY { + (*(__f->_M_fn))(__start, __result_len, __section); + } + __STL_UNWIND(_RopeRep::__STL_FREE_STRING( + __section, __result_len, __base->get_allocator())); + _S_cond_store_eos(__section[__result_len]); + return _S_new_RopeLeaf(__section, __result_len, + __base->get_allocator()); + } + } + /*NOTREACHED*/ + __stl_assert(false); + lazy: + { + // Create substring node. + return _S_new_RopeSubstring(__base, __start, __adj_endp1 - __start, + __base->get_allocator()); + } +} + +template +class _Rope_flatten_char_consumer : public _Rope_char_consumer<_CharT> { + private: + _CharT* _M_buf_ptr; + public: + + _Rope_flatten_char_consumer(_CharT* __buffer) { + _M_buf_ptr = __buffer; + }; + ~_Rope_flatten_char_consumer() {} + bool operator() (const _CharT* __leaf, size_t __n) { + uninitialized_copy_n(__leaf, __n, _M_buf_ptr); + _M_buf_ptr += __n; + return true; + } +}; + +template +class _Rope_find_char_char_consumer : public _Rope_char_consumer<_CharT> { + private: + _CharT _M_pattern; + public: + size_t _M_count; // Number of nonmatching characters + _Rope_find_char_char_consumer(_CharT __p) + : _M_pattern(__p), _M_count(0) {} + ~_Rope_find_char_char_consumer() {} + bool operator() (const _CharT* __leaf, size_t __n) { + size_t __i; + for (__i = 0; __i < __n; __i++) { + if (__leaf[__i] == _M_pattern) { + _M_count += __i; return false; + } + } + _M_count += __n; return true; + } +}; + +#ifdef __STL_USE_NEW_IOSTREAMS + template + // Here _CharT is both the stream and rope character type. +#else + template + // Here _CharT is the rope character type. Unlike in the + // above case, we somewhat handle the case in which it doesn't + // match the stream character type, i.e. char. +#endif +class _Rope_insert_char_consumer : public _Rope_char_consumer<_CharT> { + private: +# ifdef __STL_USE_NEW_IOSTREAMS + typedef basic_ostream<_CharT,_Traits> _Insert_ostream; +# else + typedef ostream _Insert_ostream; +# endif + _Insert_ostream& _M_o; + public: + _Rope_insert_char_consumer(_Insert_ostream& __writer) + : _M_o(__writer) {}; + ~_Rope_insert_char_consumer() { }; + // Caller is presumed to own the ostream + bool operator() (const _CharT* __leaf, size_t __n); + // Returns true to continue traversal. +}; + +#ifdef __STL_USE_NEW_IOSTREAMS + template + bool _Rope_insert_char_consumer<_CharT, _Traits>::operator() + (const _CharT* __leaf, size_t __n) + { + size_t __i; + // We assume that formatting is set up correctly for each element. + for (__i = 0; __i < __n; __i++) _M_o.put(__leaf[__i]); + return true; + } + +#else + template + bool _Rope_insert_char_consumer<_CharT>::operator() + (const _CharT* __leaf, size_t __n) + { + size_t __i; + // We assume that formatting is set up correctly for each element. + for (__i = 0; __i < __n; __i++) _M_o << __leaf[__i]; + return true; + } + + + __STL_TEMPLATE_NULL + inline bool _Rope_insert_char_consumer::operator() + (const char* __leaf, size_t __n) + { + size_t __i; + for (__i = 0; __i < __n; __i++) _M_o.put(__leaf[__i]); + return true; + } +#endif + +template +bool rope<_CharT, _Alloc>::_S_apply_to_pieces( + _Rope_char_consumer<_CharT>& __c, + const _RopeRep* __r, + size_t __begin, size_t __end) +{ + if (0 == __r) return true; + switch(__r->_M_tag) { + case _RopeRep::_S_concat: + { + _RopeConcatenation* __conc = (_RopeConcatenation*)__r; + _RopeRep* __left = __conc->_M_left; + size_t __left_len = __left->_M_size; + if (__begin < __left_len) { + size_t __left_end = min(__left_len, __end); + if (!_S_apply_to_pieces(__c, __left, __begin, __left_end)) + return false; + } + if (__end > __left_len) { + _RopeRep* __right = __conc->_M_right; + size_t __right_start = max(__left_len, __begin); + if (!_S_apply_to_pieces(__c, __right, + __right_start - __left_len, + __end - __left_len)) { + return false; + } + } + } + return true; + case _RopeRep::_S_leaf: + { + _RopeLeaf* __l = (_RopeLeaf*)__r; + return __c(__l->_M_data + __begin, __end - __begin); + } + case _RopeRep::_S_function: + case _RopeRep::_S_substringfn: + { + _RopeFunction* __f = (_RopeFunction*)__r; + size_t __len = __end - __begin; + bool __result; + _CharT* __buffer = + (_CharT*)alloc::allocate(__len * sizeof(_CharT)); + __STL_TRY { + (*(__f->_M_fn))(__begin, __len, __buffer); + __result = __c(__buffer, __len); + alloc::deallocate(__buffer, __len * sizeof(_CharT)); + } + __STL_UNWIND((alloc::deallocate(__buffer, + __len * sizeof(_CharT)))) + return __result; + } + default: + __stl_assert(false); + /*NOTREACHED*/ + return false; + } +} + +#ifdef __STL_USE_NEW_IOSTREAMS + template + inline void _Rope_fill(basic_ostream<_CharT, _Traits>& __o, size_t __n) +#else + inline void _Rope_fill(ostream& __o, size_t __n) +#endif +{ + char __f = __o.fill(); + size_t __i; + + for (__i = 0; __i < __n; __i++) __o.put(__f); +} + + +template inline bool _Rope_is_simple(_CharT*) { return false; } +inline bool _Rope_is_simple(char*) { return true; } +inline bool _Rope_is_simple(wchar_t*) { return true; } + +#ifdef __STL_USE_NEW_IOSTREAMS + template + basic_ostream<_CharT, _Traits>& operator<< + (basic_ostream<_CharT, _Traits>& __o, + const rope<_CharT, _Alloc>& __r) +#else + template + ostream& operator<< (ostream& __o, const rope<_CharT, _Alloc>& __r) +#endif +{ + size_t __w = __o.width(); + bool __left = bool(__o.flags() & ios::left); + size_t __pad_len; + size_t __rope_len = __r.size(); +# ifdef __STL_USE_NEW_IOSTREAMS + _Rope_insert_char_consumer<_CharT, _Traits> __c(__o); +# else + _Rope_insert_char_consumer<_CharT> __c(__o); +# endif + bool __is_simple = _Rope_is_simple((_CharT*)0); + + if (__rope_len < __w) { + __pad_len = __w - __rope_len; + } else { + __pad_len = 0; + } + if (!__is_simple) __o.width(__w/__rope_len); + __STL_TRY { + if (__is_simple && !__left && __pad_len > 0) { + _Rope_fill(__o, __pad_len); + } + __r.apply_to_pieces(0, __r.size(), __c); + if (__is_simple && __left && __pad_len > 0) { + _Rope_fill(__o, __pad_len); + } + if (!__is_simple) + __o.width(__w); + } + __STL_UNWIND(if (!__is_simple) __o.width(__w)) + return __o; +} + +template +_CharT* +rope<_CharT,_Alloc>::_S_flatten(_RopeRep* __r, + size_t __start, size_t __len, + _CharT* __buffer) +{ + _Rope_flatten_char_consumer<_CharT> __c(__buffer); + _S_apply_to_pieces(__c, __r, __start, __start + __len); + return(__buffer + __len); +} + +template +size_t +rope<_CharT,_Alloc>::find(_CharT __pattern, size_t __start) const +{ + _Rope_find_char_char_consumer<_CharT> __c(__pattern); + _S_apply_to_pieces(__c, _M_tree_ptr, __start, size()); + size_type __result_pos = __start + __c._M_count; +# ifndef __STL_OLD_ROPE_SEMANTICS + if (__result_pos == size()) __result_pos = npos; +# endif + return __result_pos; +} + +template +_CharT* +rope<_CharT,_Alloc>::_S_flatten(_RopeRep* __r, _CharT* __buffer) +{ + if (0 == __r) return __buffer; + switch(__r->_M_tag) { + case _RopeRep::_S_concat: + { + _RopeConcatenation* __c = (_RopeConcatenation*)__r; + _RopeRep* __left = __c->_M_left; + _RopeRep* __right = __c->_M_right; + _CharT* __rest = _S_flatten(__left, __buffer); + return _S_flatten(__right, __rest); + } + case _RopeRep::_S_leaf: + { + _RopeLeaf* __l = (_RopeLeaf*)__r; + return copy_n(__l->_M_data, __l->_M_size, __buffer).second; + } + case _RopeRep::_S_function: + case _RopeRep::_S_substringfn: + // We dont yet do anything with substring nodes. + // This needs to be fixed before ropefiles will work well. + { + _RopeFunction* __f = (_RopeFunction*)__r; + (*(__f->_M_fn))(0, __f->_M_size, __buffer); + return __buffer + __f->_M_size; + } + default: + __stl_assert(false); + /*NOTREACHED*/ + return 0; + } +} + + +// This needs work for _CharT != char +template +void +rope<_CharT,_Alloc>::_S_dump(_RopeRep* __r, int __indent) +{ + for (int __i = 0; __i < __indent; __i++) putchar(' '); + if (0 == __r) { + printf("NULL\n"); return; + } + if (_RopeRep::_S_concat == __r->_M_tag) { + _RopeConcatenation* __c = (_RopeConcatenation*)__r; + _RopeRep* __left = __c->_M_left; + _RopeRep* __right = __c->_M_right; + +# ifdef __GC + printf("Concatenation %p (depth = %d, len = %ld, %s balanced)\n", + __r, __r->_M_depth, __r->_M_size, __r->_M_is_balanced? "" : "not"); +# else + printf("Concatenation %p (rc = %ld, depth = %d, " + "len = %ld, %s balanced)\n", + __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size, + __r->_M_is_balanced? "" : "not"); +# endif + _S_dump(__left, __indent + 2); + _S_dump(__right, __indent + 2); + return; + } else { + char* __kind; + + switch (__r->_M_tag) { + case _RopeRep::_S_leaf: + __kind = "Leaf"; + break; + case _RopeRep::_S_function: + __kind = "Function"; + break; + case _RopeRep::_S_substringfn: + __kind = "Function representing substring"; + break; + default: + __kind = "(corrupted kind field!)"; + } +# ifdef __GC + printf("%s %p (depth = %d, len = %ld) ", + __kind, __r, __r->_M_depth, __r->_M_size); +# else + printf("%s %p (rc = %ld, depth = %d, len = %ld) ", + __kind, __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size); +# endif + if (_S_is_one_byte_char_type((_CharT*)0)) { + const int __max_len = 40; + _Self_destruct_ptr __prefix(_S_substring(__r, 0, __max_len)); + _CharT __buffer[__max_len + 1]; + bool __too_big = __r->_M_size > __prefix->_M_size; + + _S_flatten(__prefix, __buffer); + __buffer[__prefix->_M_size] = _S_eos((_CharT*)0); + printf("%s%s\n", + (char*)__buffer, __too_big? "...\n" : "\n"); + } else { + printf("\n"); + } + } +} + +template +const unsigned long +rope<_CharT,_Alloc>::_S_min_len[ + _Rope_RopeRep<_CharT,_Alloc>::_S_max_rope_depth + 1] = { +/* 0 */1, /* 1 */2, /* 2 */3, /* 3 */5, /* 4 */8, /* 5 */13, /* 6 */21, +/* 7 */34, /* 8 */55, /* 9 */89, /* 10 */144, /* 11 */233, /* 12 */377, +/* 13 */610, /* 14 */987, /* 15 */1597, /* 16 */2584, /* 17 */4181, +/* 18 */6765, /* 19 */10946, /* 20 */17711, /* 21 */28657, /* 22 */46368, +/* 23 */75025, /* 24 */121393, /* 25 */196418, /* 26 */317811, +/* 27 */514229, /* 28 */832040, /* 29 */1346269, /* 30 */2178309, +/* 31 */3524578, /* 32 */5702887, /* 33 */9227465, /* 34 */14930352, +/* 35 */24157817, /* 36 */39088169, /* 37 */63245986, /* 38 */102334155, +/* 39 */165580141, /* 40 */267914296, /* 41 */433494437, +/* 42 */701408733, /* 43 */1134903170, /* 44 */1836311903, +/* 45 */2971215073u }; +// These are Fibonacci numbers < 2**32. + +template +rope<_CharT,_Alloc>::_RopeRep* +rope<_CharT,_Alloc>::_S_balance(_RopeRep* __r) +{ + _RopeRep* __forest[_RopeRep::_S_max_rope_depth + 1]; + _RopeRep* __result = 0; + int __i; + // Invariant: + // The concatenation of forest in descending order is equal to __r. + // __forest[__i]._M_size >= _S_min_len[__i] + // __forest[__i]._M_depth = __i + // References from forest are included in refcount. + + for (__i = 0; __i <= _RopeRep::_S_max_rope_depth; ++__i) + __forest[__i] = 0; + __STL_TRY { + _S_add_to_forest(__r, __forest); + for (__i = 0; __i <= _RopeRep::_S_max_rope_depth; ++__i) + if (0 != __forest[__i]) { +# ifndef __GC + _Self_destruct_ptr __old(__result); +# endif + __result = _S_concat(__forest[__i], __result); + __forest[__i]->_M_unref_nonnil(); +# if !defined(__GC) && defined(__STL_USE_EXCEPTIONS) + __forest[__i] = 0; +# endif + } + } + __STL_UNWIND(for(__i = 0; __i <= _RopeRep::_S_max_rope_depth; __i++) + _S_unref(__forest[__i])) + if (__result->_M_depth > _RopeRep::_S_max_rope_depth) { +# ifdef __STL_USE_EXCEPTIONS + __STL_THROW(length_error("rope too long")); +# else + abort(); +# endif + } + return(__result); +} + + +template +void +rope<_CharT,_Alloc>::_S_add_to_forest(_RopeRep* __r, _RopeRep** __forest) +{ + if (__r->_M_is_balanced) { + _S_add_leaf_to_forest(__r, __forest); + return; + } + __stl_assert(__r->_M_tag == _RopeRep::_S_concat); + { + _RopeConcatenation* __c = (_RopeConcatenation*)__r; + + _S_add_to_forest(__c->_M_left, __forest); + _S_add_to_forest(__c->_M_right, __forest); + } +} + + +template +void +rope<_CharT,_Alloc>::_S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest) +{ + _RopeRep* __insertee; // included in refcount + _RopeRep* __too_tiny = 0; // included in refcount + int __i; // forest[0..__i-1] is empty + size_t __s = __r->_M_size; + + for (__i = 0; __s >= _S_min_len[__i+1]/* not this bucket */; ++__i) { + if (0 != __forest[__i]) { +# ifndef __GC + _Self_destruct_ptr __old(__too_tiny); +# endif + __too_tiny = _S_concat_and_set_balanced(__forest[__i], __too_tiny); + __forest[__i]->_M_unref_nonnil(); + __forest[__i] = 0; + } + } + { +# ifndef __GC + _Self_destruct_ptr __old(__too_tiny); +# endif + __insertee = _S_concat_and_set_balanced(__too_tiny, __r); + } + // Too_tiny dead, and no longer included in refcount. + // Insertee is live and included. + __stl_assert(_S_is_almost_balanced(__insertee)); + __stl_assert(__insertee->_M_depth <= __r->_M_depth + 1); + for (;; ++__i) { + if (0 != __forest[__i]) { +# ifndef __GC + _Self_destruct_ptr __old(__insertee); +# endif + __insertee = _S_concat_and_set_balanced(__forest[__i], __insertee); + __forest[__i]->_M_unref_nonnil(); + __forest[__i] = 0; + __stl_assert(_S_is_almost_balanced(__insertee)); + } + __stl_assert(_S_min_len[__i] <= __insertee->_M_size); + __stl_assert(__forest[__i] == 0); + if (__i == _RopeRep::_S_max_rope_depth || + __insertee->_M_size < _S_min_len[__i+1]) { + __forest[__i] = __insertee; + // refcount is OK since __insertee is now dead. + return; + } + } +} + +template +_CharT +rope<_CharT,_Alloc>::_S_fetch(_RopeRep* __r, size_type __i) +{ + __GC_CONST _CharT* __cstr = __r->_M_c_string; + + __stl_assert(__i < __r->_M_size); + if (0 != __cstr) return __cstr[__i]; + for(;;) { + switch(__r->_M_tag) { + case _RopeRep::_S_concat: + { + _RopeConcatenation* __c = (_RopeConcatenation*)__r; + _RopeRep* __left = __c->_M_left; + size_t __left_len = __left->_M_size; + + if (__i >= __left_len) { + __i -= __left_len; + __r = __c->_M_right; + } else { + __r = __left; + } + } + break; + case _RopeRep::_S_leaf: + { + _RopeLeaf* __l = (_RopeLeaf*)__r; + return __l->_M_data[__i]; + } + case _RopeRep::_S_function: + case _RopeRep::_S_substringfn: + { + _RopeFunction* __f = (_RopeFunction*)__r; + _CharT __result; + + (*(__f->_M_fn))(__i, 1, &__result); + return __result; + } + } + } +} + +# ifndef __GC +// Return a uniquely referenced character slot for the given +// position, or 0 if that's not possible. +template +_CharT* +rope<_CharT,_Alloc>::_S_fetch_ptr(_RopeRep* __r, size_type __i) +{ + _RopeRep* __clrstack[_RopeRep::_S_max_rope_depth]; + size_t __csptr = 0; + + for(;;) { + if (__r->_M_ref_count > 1) return 0; + switch(__r->_M_tag) { + case _RopeRep::_S_concat: + { + _RopeConcatenation* __c = (_RopeConcatenation*)__r; + _RopeRep* __left = __c->_M_left; + size_t __left_len = __left->_M_size; + + if (__c->_M_c_string != 0) __clrstack[__csptr++] = __c; + if (__i >= __left_len) { + __i -= __left_len; + __r = __c->_M_right; + } else { + __r = __left; + } + } + break; + case _RopeRep::_S_leaf: + { + _RopeLeaf* __l = (_RopeLeaf*)__r; + if (__l->_M_c_string != __l->_M_data && __l->_M_c_string != 0) + __clrstack[__csptr++] = __l; + while (__csptr > 0) { + -- __csptr; + _RopeRep* __d = __clrstack[__csptr]; + __d->_M_free_c_string(); + __d->_M_c_string = 0; + } + return __l->_M_data + __i; + } + case _RopeRep::_S_function: + case _RopeRep::_S_substringfn: + return 0; + } + } +} +# endif /* __GC */ + +// The following could be implemented trivially using +// lexicographical_compare_3way. +// We do a little more work to avoid dealing with rope iterators for +// flat strings. +template +int +rope<_CharT,_Alloc>::_S_compare (const _RopeRep* __left, + const _RopeRep* __right) +{ + size_t __left_len; + size_t __right_len; + + if (0 == __right) return 0 != __left; + if (0 == __left) return -1; + __left_len = __left->_M_size; + __right_len = __right->_M_size; + if (_RopeRep::_S_leaf == __left->_M_tag) { + _RopeLeaf* __l = (_RopeLeaf*) __left; + if (_RopeRep::_S_leaf == __right->_M_tag) { + _RopeLeaf* __r = (_RopeLeaf*) __right; + return lexicographical_compare_3way( + __l->_M_data, __l->_M_data + __left_len, + __r->_M_data, __r->_M_data + __right_len); + } else { + const_iterator __rstart(__right, 0); + const_iterator __rend(__right, __right_len); + return lexicographical_compare_3way( + __l->_M_data, __l->_M_data + __left_len, + __rstart, __rend); + } + } else { + const_iterator __lstart(__left, 0); + const_iterator __lend(__left, __left_len); + if (_RopeRep::_S_leaf == __right->_M_tag) { + _RopeLeaf* __r = (_RopeLeaf*) __right; + return lexicographical_compare_3way( + __lstart, __lend, + __r->_M_data, __r->_M_data + __right_len); + } else { + const_iterator __rstart(__right, 0); + const_iterator __rend(__right, __right_len); + return lexicographical_compare_3way( + __lstart, __lend, + __rstart, __rend); + } + } +} + +// Assignment to reference proxies. +template +_Rope_char_ref_proxy<_CharT, _Alloc>& +_Rope_char_ref_proxy<_CharT, _Alloc>::operator= (_CharT __c) { + _RopeRep* __old = _M_root->_M_tree_ptr; +# ifndef __GC + // First check for the case in which everything is uniquely + // referenced. In that case we can do this destructively. + _CharT* __ptr = _My_rope::_S_fetch_ptr(__old, _M_pos); + if (0 != __ptr) { + *__ptr = __c; + return *this; + } +# endif + _Self_destruct_ptr __left( + _My_rope::_S_substring(__old, 0, _M_pos)); + _Self_destruct_ptr __right( + _My_rope::_S_substring(__old, _M_pos+1, __old->_M_size)); + _Self_destruct_ptr __result_left( + _My_rope::_S_destr_concat_char_iter(__left, &__c, 1)); + +# ifndef __GC + __stl_assert(__left == __result_left || 1 == __result_left->_M_ref_count); +# endif + _RopeRep* __result = + _My_rope::_S_concat(__result_left, __right); +# ifndef __GC + __stl_assert(1 <= __result->_M_ref_count); + _RopeRep::_S_unref(__old); +# endif + _M_root->_M_tree_ptr = __result; + return *this; +} + +template +inline _Rope_char_ref_proxy<_CharT, _Alloc>::operator _CharT () const +{ + if (_M_current_valid) { + return _M_current; + } else { + return _My_rope::_S_fetch(_M_root->_M_tree_ptr, _M_pos); + } +} +template +_Rope_char_ptr_proxy<_CharT, _Alloc> +_Rope_char_ref_proxy<_CharT, _Alloc>::operator& () const { + return _Rope_char_ptr_proxy<_CharT, _Alloc>(*this); +} + +template +rope<_CharT, _Alloc>::rope(size_t __n, _CharT __c, + const allocator_type& __a) +: _Base(__a) +{ + rope<_CharT,_Alloc> __result; + const size_t __exponentiate_threshold = 32; + size_t __exponent; + size_t __rest; + _CharT* __rest_buffer; + _RopeRep* __remainder; + rope<_CharT,_Alloc> __remainder_rope; + + if (0 == __n) + return; + + __exponent = __n / __exponentiate_threshold; + __rest = __n % __exponentiate_threshold; + if (0 == __rest) { + __remainder = 0; + } else { + __rest_buffer = _Data_allocate(_S_rounded_up_size(__rest)); + uninitialized_fill_n(__rest_buffer, __rest, __c); + _S_cond_store_eos(__rest_buffer[__rest]); + __STL_TRY { + __remainder = _S_new_RopeLeaf(__rest_buffer, __rest, __a); + } + __STL_UNWIND(_RopeRep::__STL_FREE_STRING(__rest_buffer, __rest, __a)) + } + __remainder_rope._M_tree_ptr = __remainder; + if (__exponent != 0) { + _CharT* __base_buffer = + _Data_allocate(_S_rounded_up_size(__exponentiate_threshold)); + _RopeLeaf* __base_leaf; + rope __base_rope; + uninitialized_fill_n(__base_buffer, __exponentiate_threshold, __c); + _S_cond_store_eos(__base_buffer[__exponentiate_threshold]); + __STL_TRY { + __base_leaf = _S_new_RopeLeaf(__base_buffer, + __exponentiate_threshold, __a); + } + __STL_UNWIND(_RopeRep::__STL_FREE_STRING(__base_buffer, + __exponentiate_threshold, __a)) + __base_rope._M_tree_ptr = __base_leaf; + if (1 == __exponent) { + __result = __base_rope; +# ifndef __GC + __stl_assert(2 == __result._M_tree_ptr->_M_ref_count); + // One each for base_rope and __result +# endif + } else { + __result = power(__base_rope, __exponent, + _Rope_Concat_fn<_CharT,_Alloc>()); + } + if (0 != __remainder) { + __result += __remainder_rope; + } + } else { + __result = __remainder_rope; + } + _M_tree_ptr = __result._M_tree_ptr; + _M_tree_ptr->_M_ref_nonnil(); +} + +template + _CharT rope<_CharT,_Alloc>::_S_empty_c_str[1]; + +template +const _CharT* rope<_CharT,_Alloc>::c_str() const { + if (0 == _M_tree_ptr) { + _S_empty_c_str[0] = _S_eos((_CharT*)0); // Possibly redundant, + // but probably fast. + return _S_empty_c_str; + } + __GC_CONST _CharT* __old_c_string = _M_tree_ptr->_M_c_string; + if (0 != __old_c_string) return(__old_c_string); + size_t __s = size(); + _CharT* __result = _Data_allocate(__s + 1); + _S_flatten(_M_tree_ptr, __result); + __result[__s] = _S_eos((_CharT*)0); +# ifdef __GC + _M_tree_ptr->_M_c_string = __result; +# else + if ((__old_c_string = (__GC_CONST _CharT*) + _Atomic_swap((unsigned long *)(&(_M_tree_ptr->_M_c_string)), + (unsigned long)__result)) != 0) { + // It must have been added in the interim. Hence it had to have been + // separately allocated. Deallocate the old copy, since we just + // replaced it. + destroy(__old_c_string, __old_c_string + __s + 1); + _Data_deallocate(__old_c_string, __s + 1); + } +# endif + return(__result); +} + +template +const _CharT* rope<_CharT,_Alloc>::replace_with_c_str() { + if (0 == _M_tree_ptr) { + _S_empty_c_str[0] = _S_eos((_CharT*)0); + return _S_empty_c_str; + } + __GC_CONST _CharT* __old_c_string = _M_tree_ptr->_M_c_string; + if (_RopeRep::_S_leaf == _M_tree_ptr->_M_tag && 0 != __old_c_string) { + return(__old_c_string); + } + size_t __s = size(); + _CharT* __result = _Data_allocate(_S_rounded_up_size(__s)); + _S_flatten(_M_tree_ptr, __result); + __result[__s] = _S_eos((_CharT*)0); + _M_tree_ptr->_M_unref_nonnil(); + _M_tree_ptr = _S_new_RopeLeaf(__result, __s, get_allocator()); + return(__result); +} + +// Algorithm specializations. More should be added. + +template // was templated on CharT and Alloc +void // VC++ workaround +_Rope_rotate(_Rope_iterator __first, + _Rope_iterator __middle, + _Rope_iterator __last) +{ + typedef typename _Rope_iterator::value_type _CharT; + typedef typename _Rope_iterator::_allocator_type _Alloc; + + __stl_assert(__first.container() == __middle.container() + && __middle.container() == __last.container()); + rope<_CharT,_Alloc>& __r(__first.container()); + rope<_CharT,_Alloc> __prefix = __r.substr(0, __first.index()); + rope<_CharT,_Alloc> __suffix = + __r.substr(__last.index(), __r.size() - __last.index()); + rope<_CharT,_Alloc> __part1 = + __r.substr(__middle.index(), __last.index() - __middle.index()); + rope<_CharT,_Alloc> __part2 = + __r.substr(__first.index(), __middle.index() - __first.index()); + __r = __prefix; + __r += __part1; + __r += __part2; + __r += __suffix; +} + +#if !defined(__GNUC__) +// Appears to confuse g++ +inline void rotate(_Rope_iterator __first, + _Rope_iterator __middle, + _Rope_iterator __last) { + _Rope_rotate(__first, __middle, __last); +} +#endif + +# if 0 +// Probably not useful for several reasons: +// - for SGIs 7.1 compiler and probably some others, +// this forces lots of rope instantiations, creating a +// code bloat and compile time problem. (Fixed in 7.2.) +// - wchar_t is 4 bytes wide on most UNIX platforms, making it unattractive +// for unicode strings. Unsigned short may be a better character +// type. +inline void rotate( + _Rope_iterator __first, + _Rope_iterator __middle, + _Rope_iterator __last) { + _Rope_rotate(__first, __middle, __last); +} +# endif + + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#endif + +__STL_END_NAMESPACE + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/sequence_concepts.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/sequence_concepts.h new file mode 100644 index 0000000..bf8f373 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/sequence_concepts.h @@ -0,0 +1,204 @@ +/* + * Copyright (c) 1999 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef STL_SEQUENCE_CONCEPTS_H +#define STL_SEQUENCE_CONCEPTS_H + +#include + +#ifdef __STL_USE_CONCEPT_CHECKS + +// This file covers the following concepts: +// _Sequence +// _FrontInsertionSequence +// _BackInsertionSequence + +struct _ERROR_IN_STL_SEQ { + + template + static void + __fill_constructor_requirement_violation(_XX& __s) { + typename _XX::value_type __t = typename _XX::value_type(); + typename _XX::difference_type __n = typename _XX::difference_type(); + _XX __x(__n, __t); + __sink_unused_warning(__x); + } + template + static void + __fill_default_constructor_requirement_violation(_XX& __s) { + _STL_ERROR::__default_constructor_requirement_violation(*__s.begin()); + typename _XX::difference_type __n = typename _XX::difference_type(); + _XX __x(__n); + __sink_unused_warning(__x); + } + template + static void + __range_constructor_requirement_violation(_XX& __s) { + _XX __x(__s.begin(), __s.end()); + __sink_unused_warning(__x); + } + template + static void + __insert_function_requirement_violation(_XX& __s) { + typename _XX::value_type __t = typename _XX::value_type(); + typename _XX::iterator __p = typename _XX::iterator(); + __p = __s.insert(__p, __t); + } + template + static void + __fill_insert_function_requirement_violation(_XX& __s) { + typename _XX::value_type __t = typename _XX::value_type(); + typename _XX::iterator __p = typename _XX::iterator(); + typename _XX::difference_type __n = typename _XX::difference_type(); + __s.insert(__p, __n, __t); + } + template + static void + __range_insert_function_requirement_violation(_XX& __s) { + typename _XX::iterator __p = typename _XX::iterator(); + typename _XX::iterator __i = typename _XX::iterator(); + typename _XX::iterator __j = typename _XX::iterator(); + __s.insert(__p, __i, __j); + } + template + static void + __insert_element_function_requirement_violation(_XX& __s) { + typename _XX::value_type __t = typename _XX::value_type(); + std::pair __r; + __r = __s.insert(__t); + __sink_unused_warning(__r); + } + template + static void + __unconditional_insert_element_function_requirement_violation(_XX& __s) { + typename _XX::value_type __t = typename _XX::value_type(); + typename _XX::iterator __p; + __p = __s.insert(__t); + __sink_unused_warning(__p); + } + template + static void + __erase_function_requirement_violation(_XX& __s) { + typename _XX::iterator __p = typename _XX::iterator(); + __p = __s.erase(__p); + } + template + static void + __range_erase_function_requirement_violation(_XX& __s) { + typename _XX::iterator __p = typename _XX::iterator(); + typename _XX::iterator __q = typename _XX::iterator(); + __p = __s.erase(__p, __q); + } + template + static void + __const_front_function_requirement_violation(const _XX& __s) { + typename _XX::const_reference __t = __s.front(); + __sink_unused_warning(__t); + } + template + static void + __front_function_requirement_violation(_XX& __s) { + typename _XX::reference __t = __s.front(); + __const_front_function_requirement_violation(__s); + __sink_unused_warning(__t); + } + template + static void + __const_back_function_requirement_violation(const _XX& __s) { + typename _XX::const_reference __t = __s.back(); + __sink_unused_warning(__t); + } + template + static void + __back_function_requirement_violation(_XX& __s) { + typename _XX::reference __t = __s.back(); + __const_back_function_requirement_violation(__s); + __sink_unused_warning(__t); + } + template + static void + __push_front_function_requirement_violation(_XX& __s) { + typename _XX::value_type __t = typename _XX::value_type(); + __s.push_front(__t); + } + template + static void + __pop_front_function_requirement_violation(_XX& __s) { + __s.pop_front(); + } + template + static void + __push_back_function_requirement_violation(_XX& __s) { + typename _XX::value_type __t = typename _XX::value_type(); + __s.push_back(__t); + } + template + static void + __pop_back_function_requirement_violation(_XX& __s) { + __s.pop_back(); + } + +}; + +/* Sequence Containers */ + +template +struct _Sequence_concept_specification { +static void +_Sequence_requirement_violation(_Sequence __s) { + // Refinement of ForwardContainer + _ForwardContainer_concept_specification<_Sequence>::_ForwardContainer_requirement_violation(__s); + // Refinement of DefaultConstructible + _DefaultConstructible_concept_specification<_Sequence>::_DefaultConstructible_requirement_violation(__s); + // Valid Expressions + _ERROR_IN_STL_SEQ::__fill_constructor_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__fill_default_constructor_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__range_constructor_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__insert_function_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__fill_insert_function_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__range_insert_function_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__erase_function_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__range_erase_function_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__front_function_requirement_violation(__s); +} +}; + +template +struct _FrontInsertionSequence_concept_specification { +static void +_FrontInsertionSequence_requirement_violation(_FrontInsertionSequence __s) { + // Refinement of Sequence + _Sequence_concept_specification<_FrontInsertionSequence>::_Sequence_requirement_violation(__s); + // Valid Expressions + _ERROR_IN_STL_SEQ::__push_front_function_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__pop_front_function_requirement_violation(__s); +} +}; + +template +struct _BackInsertionSequence_concept_specification { +static void +_BackInsertionSequence_requirement_violation(_BackInsertionSequence __s) { + // Refinement of Sequence + _Sequence_concept_specification<_BackInsertionSequence>::_Sequence_requirement_violation(__s); + // Valid Expressions + _ERROR_IN_STL_SEQ::__back_function_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__push_back_function_requirement_violation(__s); + _ERROR_IN_STL_SEQ::__pop_back_function_requirement_violation(__s); +} +}; + +#endif /* if __STL_USE_CONCEPT_CHECKS */ + + +#endif /* STL_SEQUENCE_CONCEPTS_H */ diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/set b/src/UWE_projectCode/SGI STL源码/SGI STL源码/set new file mode 100644 index 0000000..c836c45 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/set @@ -0,0 +1,40 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_SET +#define __SGI_STL_SET + +#ifndef __SGI_STL_INTERNAL_TREE_H +#include +#endif +#include +#include + +#endif /* __SGI_STL_SET */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/set.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/set.h new file mode 100644 index 0000000..779f395 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/set.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_SET_H +#define __SGI_STL_SET_H + +#ifndef __SGI_STL_INTERNAL_TREE_H +#include +#endif +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::rb_tree; +using __STD::set; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_SET_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/slist b/src/UWE_projectCode/SGI STL源码/SGI STL源码/slist new file mode 100644 index 0000000..c3ec742 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/slist @@ -0,0 +1,28 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __SGI_STL_SLIST +#define __SGI_STL_SLIST + +#include +#include +#include +#include +#include + +#endif /* __SGI_STL_SLIST */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/slist.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/slist.h new file mode 100644 index 0000000..d2377b0 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/slist.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __SGI_STL_SLIST_H +#define __SGI_STL_SLIST_H + +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::slist; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_SLIST_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stack b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stack new file mode 100644 index 0000000..36461d9 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stack @@ -0,0 +1,41 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_STACK +#define __SGI_STL_STACK + +#include +#include +#include +#include +#include +#include + +#endif /* __SGI_STL_STACK */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stack.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stack.h new file mode 100644 index 0000000..89beca8 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stack.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_STACK_H +#define __SGI_STL_STACK_H + +#include +#include +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::stack; +using __STD::queue; +using __STD::priority_queue; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_STACK_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stdexcept b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stdexcept new file mode 100644 index 0000000..ca99369 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stdexcept @@ -0,0 +1,96 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STDEXCEPT +#define __SGI_STDEXCEPT + +#include + +#if defined(__STL_USE_EXCEPTIONS) || \ + !(defined(_MIPS_SIM) && defined(_ABIO32) && _MIPS_SIM == _ABIO32) + +#include + +__STL_BEGIN_NAMESPACE + +class __Named_exception : public __STL_EXCEPTION_BASE { +public: + __Named_exception(const string& __str) { + strncpy(_M_name, __get_c_string(__str), _S_bufsize); + _M_name[_S_bufsize - 1] = '\0'; + } + virtual const char* what() const __STL_NOTHROW { return _M_name; } + +private: + enum { _S_bufsize = 256 }; + char _M_name[_S_bufsize]; +}; + +class logic_error : public __Named_exception { +public: + logic_error(const string& __s) : __Named_exception(__s) {} +}; + +class runtime_error : public __Named_exception { +public: + runtime_error(const string& __s) : __Named_exception(__s) {} +}; + +class domain_error : public logic_error { +public: + domain_error(const string& __arg) : logic_error(__arg) {} +}; + +class invalid_argument : public logic_error { +public: + invalid_argument(const string& __arg) : logic_error(__arg) {} +}; + +class length_error : public logic_error { +public: + length_error(const string& __arg) : logic_error(__arg) {} +}; + +class out_of_range : public logic_error { +public: + out_of_range(const string& __arg) : logic_error(__arg) {} +}; + +class range_error : public runtime_error { +public: + range_error(const string& __arg) : runtime_error(__arg) {} +}; + +class overflow_error : public runtime_error { +public: + overflow_error(const string& __arg) : runtime_error(__arg) {} +}; + +class underflow_error : public runtime_error { +public: + underflow_error(const string& __arg) : runtime_error(__arg) {} +}; + +__STL_END_NAMESPACE + +#ifndef __SGI_STL_STRING +#include +#endif + +#endif /* Not o32, and no exceptions */ + +#endif /* __SGI_STDEXCEPT */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_algo.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_algo.h new file mode 100644 index 0000000..37dbf4a --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_algo.h @@ -0,0 +1,3297 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_ALGO_H +#define __SGI_STL_INTERNAL_ALGO_H + +#include + +// See concept_checks.h for the concept-checking macros +// __STL_REQUIRES, __STL_CONVERTIBLE, etc. + + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1209 +#endif + +// __median (an extension, not present in the C++ standard). + +template +inline const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c) { + __STL_REQUIRES(_Tp, _LessThanComparable); + if (__a < __b) + if (__b < __c) + return __b; + else if (__a < __c) + return __c; + else + return __a; + else if (__a < __c) + return __a; + else if (__b < __c) + return __c; + else + return __b; +} + +template +inline const _Tp& +__median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) { + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp); + if (__comp(__a, __b)) + if (__comp(__b, __c)) + return __b; + else if (__comp(__a, __c)) + return __c; + else + return __a; + else if (__comp(__a, __c)) + return __a; + else if (__comp(__b, __c)) + return __c; + else + return __b; +} + +// for_each. Apply a function to every element of a range. +template +_Function for_each(_InputIter __first, _InputIter __last, _Function __f) { + __STL_REQUIRES(_InputIter, _InputIterator); + for ( ; __first != __last; ++__first) + __f(*__first); + return __f; +} + +// find and find_if. + +template +inline _InputIter find(_InputIter __first, _InputIter __last, + const _Tp& __val, + input_iterator_tag) +{ + while (__first != __last && !(*__first == __val)) + ++__first; + return __first; +} + +template +inline _InputIter find_if(_InputIter __first, _InputIter __last, + _Predicate __pred, + input_iterator_tag) +{ + while (__first != __last && !__pred(*__first)) + ++__first; + return __first; +} + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +_RandomAccessIter find(_RandomAccessIter __first, _RandomAccessIter __last, + const _Tp& __val, + random_access_iterator_tag) +{ + typename iterator_traits<_RandomAccessIter>::difference_type __trip_count + = (__last - __first) >> 2; + + for ( ; __trip_count > 0 ; --__trip_count) { + if (*__first == __val) return __first; + ++__first; + + if (*__first == __val) return __first; + ++__first; + + if (*__first == __val) return __first; + ++__first; + + if (*__first == __val) return __first; + ++__first; + } + + switch(__last - __first) { + case 3: + if (*__first == __val) return __first; + ++__first; + case 2: + if (*__first == __val) return __first; + ++__first; + case 1: + if (*__first == __val) return __first; + ++__first; + case 0: + default: + return __last; + } +} + +template +_RandomAccessIter find_if(_RandomAccessIter __first, _RandomAccessIter __last, + _Predicate __pred, + random_access_iterator_tag) +{ + typename iterator_traits<_RandomAccessIter>::difference_type __trip_count + = (__last - __first) >> 2; + + for ( ; __trip_count > 0 ; --__trip_count) { + if (__pred(*__first)) return __first; + ++__first; + + if (__pred(*__first)) return __first; + ++__first; + + if (__pred(*__first)) return __first; + ++__first; + + if (__pred(*__first)) return __first; + ++__first; + } + + switch(__last - __first) { + case 3: + if (__pred(*__first)) return __first; + ++__first; + case 2: + if (__pred(*__first)) return __first; + ++__first; + case 1: + if (__pred(*__first)) return __first; + ++__first; + case 0: + default: + return __last; + } +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline _InputIter find(_InputIter __first, _InputIter __last, + const _Tp& __val) +{ + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, + typename iterator_traits<_InputIter>::value_type, _Tp); + return find(__first, __last, __val, __ITERATOR_CATEGORY(__first)); +} + +template +inline _InputIter find_if(_InputIter __first, _InputIter __last, + _Predicate __pred) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, + typename iterator_traits<_InputIter>::value_type); + return find_if(__first, __last, __pred, __ITERATOR_CATEGORY(__first)); +} + +// adjacent_find. + +template +_ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type, + _EqualityComparable); + if (__first == __last) + return __last; + _ForwardIter __next = __first; + while(++__next != __last) { + if (*__first == *__next) + return __first; + __first = __next; + } + return __last; +} + +template +_ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last, + _BinaryPredicate __binary_pred) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, + typename iterator_traits<_ForwardIter>::value_type, + typename iterator_traits<_ForwardIter>::value_type); + if (__first == __last) + return __last; + _ForwardIter __next = __first; + while(++__next != __last) { + if (__binary_pred(*__first, *__next)) + return __first; + __first = __next; + } + return __last; +} + +// count and count_if. There are two version of each, one whose return type +// type is void and one (present only if we have partial specialization) +// whose return type is iterator_traits<_InputIter>::difference_type. The +// C++ standard only has the latter version, but the former, which was present +// in the HP STL, is retained for backward compatibility. + +template +void count(_InputIter __first, _InputIter __last, const _Tp& __value, + _Size& __n) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type, + _EqualityComparable); + __STL_REQUIRES(_Tp, _EqualityComparable); + for ( ; __first != __last; ++__first) + if (*__first == __value) + ++__n; +} + +template +void count_if(_InputIter __first, _InputIter __last, _Predicate __pred, + _Size& __n) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, + typename iterator_traits<_InputIter>::value_type); + for ( ; __first != __last; ++__first) + if (__pred(*__first)) + ++__n; +} + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +typename iterator_traits<_InputIter>::difference_type +count(_InputIter __first, _InputIter __last, const _Tp& __value) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type, + _EqualityComparable); + __STL_REQUIRES(_Tp, _EqualityComparable); + typename iterator_traits<_InputIter>::difference_type __n = 0; + for ( ; __first != __last; ++__first) + if (*__first == __value) + ++__n; + return __n; +} + +template +typename iterator_traits<_InputIter>::difference_type +count_if(_InputIter __first, _InputIter __last, _Predicate __pred) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, + typename iterator_traits<_InputIter>::value_type); + typename iterator_traits<_InputIter>::difference_type __n = 0; + for ( ; __first != __last; ++__first) + if (__pred(*__first)) + ++__n; + return __n; +} + + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +// search. + +template +_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1, + _ForwardIter2 __first2, _ForwardIter2 __last2) +{ + __STL_REQUIRES(_ForwardIter1, _ForwardIterator); + __STL_REQUIRES(_ForwardIter2, _ForwardIterator); + __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, + typename iterator_traits<_ForwardIter1>::value_type, + typename iterator_traits<_ForwardIter2>::value_type); + + // Test for empty ranges + if (__first1 == __last1 || __first2 == __last2) + return __first1; + + // Test for a pattern of length 1. + _ForwardIter2 __tmp(__first2); + ++__tmp; + if (__tmp == __last2) + return find(__first1, __last1, *__first2); + + // General case. + + _ForwardIter2 __p1, __p; + + __p1 = __first2; ++__p1; + + _ForwardIter1 __current = __first1; + + while (__first1 != __last1) { + __first1 = find(__first1, __last1, *__first2); + if (__first1 == __last1) + return __last1; + + __p = __p1; + __current = __first1; + if (++__current == __last1) + return __last1; + + while (*__current == *__p) { + if (++__p == __last2) + return __first1; + if (++__current == __last1) + return __last1; + } + + ++__first1; + } + return __first1; +} + +template +_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1, + _ForwardIter2 __first2, _ForwardIter2 __last2, + _BinaryPred __predicate) +{ + __STL_REQUIRES(_ForwardIter1, _ForwardIterator); + __STL_REQUIRES(_ForwardIter2, _ForwardIterator); + __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool, + typename iterator_traits<_ForwardIter1>::value_type, + typename iterator_traits<_ForwardIter2>::value_type); + + // Test for empty ranges + if (__first1 == __last1 || __first2 == __last2) + return __first1; + + // Test for a pattern of length 1. + _ForwardIter2 __tmp(__first2); + ++__tmp; + if (__tmp == __last2) { + while (__first1 != __last1 && !__predicate(*__first1, *__first2)) + ++__first1; + return __first1; + } + + // General case. + + _ForwardIter2 __p1, __p; + + __p1 = __first2; ++__p1; + + _ForwardIter1 __current = __first1; + + while (__first1 != __last1) { + while (__first1 != __last1) { + if (__predicate(*__first1, *__first2)) + break; + ++__first1; + } + while (__first1 != __last1 && !__predicate(*__first1, *__first2)) + ++__first1; + if (__first1 == __last1) + return __last1; + + __p = __p1; + __current = __first1; + if (++__current == __last1) return __last1; + + while (__predicate(*__current, *__p)) { + if (++__p == __last2) + return __first1; + if (++__current == __last1) + return __last1; + } + + ++__first1; + } + return __first1; +} + +// search_n. Search for __count consecutive copies of __val. + +template +_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last, + _Integer __count, const _Tp& __val) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type, + _EqualityComparable); + __STL_REQUIRES(_Tp, _EqualityComparable); + + if (__count <= 0) + return __first; + else { + __first = find(__first, __last, __val); + while (__first != __last) { + _Integer __n = __count - 1; + _ForwardIter __i = __first; + ++__i; + while (__i != __last && __n != 0 && *__i == __val) { + ++__i; + --__n; + } + if (__n == 0) + return __first; + else + __first = find(__i, __last, __val); + } + return __last; + } +} + +template +_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last, + _Integer __count, const _Tp& __val, + _BinaryPred __binary_pred) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool, + typename iterator_traits<_ForwardIter>::value_type, _Tp); + if (__count <= 0) + return __first; + else { + while (__first != __last) { + if (__binary_pred(*__first, __val)) + break; + ++__first; + } + while (__first != __last) { + _Integer __n = __count - 1; + _ForwardIter __i = __first; + ++__i; + while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) { + ++__i; + --__n; + } + if (__n == 0) + return __first; + else { + while (__i != __last) { + if (__binary_pred(*__i, __val)) + break; + ++__i; + } + __first = __i; + } + } + return __last; + } +} + +// swap_ranges + +template +_ForwardIter2 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1, + _ForwardIter2 __first2) { + __STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator); + __STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator); + __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type, + typename iterator_traits<_ForwardIter2>::value_type); + __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type, + typename iterator_traits<_ForwardIter1>::value_type); + for ( ; __first1 != __last1; ++__first1, ++__first2) + iter_swap(__first1, __first2); + return __first2; +} + +// transform + +template +_OutputIter transform(_InputIter __first, _InputIter __last, + _OutputIter __result, _UnaryOperation __opr) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + + for ( ; __first != __last; ++__first, ++__result) + *__result = __opr(*__first); + return __result; +} + +template +_OutputIter transform(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _OutputIter __result, + _BinaryOperation __binary_op) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result) + *__result = __binary_op(*__first1, *__first2); + return __result; +} + +// replace, replace_if, replace_copy, replace_copy_if + +template +void replace(_ForwardIter __first, _ForwardIter __last, + const _Tp& __old_value, const _Tp& __new_value) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, + typename iterator_traits<_ForwardIter>::value_type, _Tp); + __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type); + for ( ; __first != __last; ++__first) + if (*__first == __old_value) + *__first = __new_value; +} + +template +void replace_if(_ForwardIter __first, _ForwardIter __last, + _Predicate __pred, const _Tp& __new_value) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type); + __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, + typename iterator_traits<_ForwardIter>::value_type); + for ( ; __first != __last; ++__first) + if (__pred(*__first)) + *__first = __new_value; +} + +template +_OutputIter replace_copy(_InputIter __first, _InputIter __last, + _OutputIter __result, + const _Tp& __old_value, const _Tp& __new_value) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, + typename iterator_traits<_InputIter>::value_type, _Tp); + for ( ; __first != __last; ++__first, ++__result) + *__result = *__first == __old_value ? __new_value : *__first; + return __result; +} + +template +_OutputIter replace_copy_if(_InputIter __first, _InputIter __last, + _OutputIter __result, + _Predicate __pred, const _Tp& __new_value) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, + typename iterator_traits<_InputIter>::value_type); + for ( ; __first != __last; ++__first, ++__result) + *__result = __pred(*__first) ? __new_value : *__first; + return __result; +} + +// generate and generate_n + +template +void generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_GENERATOR_CHECK(_Generator, + typename iterator_traits<_ForwardIter>::value_type); + for ( ; __first != __last; ++__first) + *__first = __gen(); +} + +template +_OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) { + __STL_REQUIRES(_OutputIter, _OutputIterator); + for ( ; __n > 0; --__n, ++__first) + *__first = __gen(); + return __first; +} + +// remove, remove_if, remove_copy, remove_copy_if + +template +_OutputIter remove_copy(_InputIter __first, _InputIter __last, + _OutputIter __result, const _Tp& __value) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, + typename iterator_traits<_InputIter>::value_type, _Tp); + for ( ; __first != __last; ++__first) + if (!(*__first == __value)) { + *__result = *__first; + ++__result; + } + return __result; +} + +template +_OutputIter remove_copy_if(_InputIter __first, _InputIter __last, + _OutputIter __result, _Predicate __pred) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, + typename iterator_traits<_InputIter>::value_type); + for ( ; __first != __last; ++__first) + if (!__pred(*__first)) { + *__result = *__first; + ++__result; + } + return __result; +} + +template +_ForwardIter remove(_ForwardIter __first, _ForwardIter __last, + const _Tp& __value) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, + typename iterator_traits<_ForwardIter>::value_type, _Tp); + __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type); + __first = find(__first, __last, __value); + _ForwardIter __i = __first; + return __first == __last ? __first + : remove_copy(++__i, __last, __first, __value); +} + +template +_ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last, + _Predicate __pred) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, + typename iterator_traits<_ForwardIter>::value_type); + __first = find_if(__first, __last, __pred); + _ForwardIter __i = __first; + return __first == __last ? __first + : remove_copy_if(++__i, __last, __first, __pred); +} + +// unique and unique_copy + +template +_OutputIter __unique_copy(_InputIter __first, _InputIter __last, + _OutputIter __result, _Tp*) { + _Tp __value = *__first; + *__result = __value; + while (++__first != __last) + if (!(__value == *__first)) { + __value = *__first; + *++__result = __value; + } + return ++__result; +} + +template +inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last, + _OutputIter __result, + output_iterator_tag) { + return __unique_copy(__first, __last, __result, __VALUE_TYPE(__first)); +} + +template +_ForwardIter __unique_copy(_InputIter __first, _InputIter __last, + _ForwardIter __result, forward_iterator_tag) { + *__result = *__first; + while (++__first != __last) + if (!(*__result == *__first)) + *++__result = *__first; + return ++__result; +} + +template +inline _OutputIter unique_copy(_InputIter __first, _InputIter __last, + _OutputIter __result) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type, + _EqualityComparable); + if (__first == __last) return __result; + return __unique_copy(__first, __last, __result, + __ITERATOR_CATEGORY(__result)); +} + +template +_OutputIter __unique_copy(_InputIter __first, _InputIter __last, + _OutputIter __result, + _BinaryPredicate __binary_pred, _Tp*) { + __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, _Tp, _Tp); + _Tp __value = *__first; + *__result = __value; + while (++__first != __last) + if (!__binary_pred(__value, *__first)) { + __value = *__first; + *++__result = __value; + } + return ++__result; +} + +template +inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last, + _OutputIter __result, + _BinaryPredicate __binary_pred, + output_iterator_tag) { + return __unique_copy(__first, __last, __result, __binary_pred, + __VALUE_TYPE(__first)); +} + +template +_ForwardIter __unique_copy(_InputIter __first, _InputIter __last, + _ForwardIter __result, + _BinaryPredicate __binary_pred, + forward_iterator_tag) { + __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, + typename iterator_traits<_ForwardIter>::value_type, + typename iterator_traits<_InputIter>::value_type); + *__result = *__first; + while (++__first != __last) + if (!__binary_pred(*__result, *__first)) *++__result = *__first; + return ++__result; +} + +template +inline _OutputIter unique_copy(_InputIter __first, _InputIter __last, + _OutputIter __result, + _BinaryPredicate __binary_pred) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + if (__first == __last) return __result; + return __unique_copy(__first, __last, __result, __binary_pred, + __ITERATOR_CATEGORY(__result)); +} + +template +_ForwardIter unique(_ForwardIter __first, _ForwardIter __last) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type, + _EqualityComparable); + __first = adjacent_find(__first, __last); + return unique_copy(__first, __last, __first); +} + +template +_ForwardIter unique(_ForwardIter __first, _ForwardIter __last, + _BinaryPredicate __binary_pred) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, + typename iterator_traits<_ForwardIter>::value_type, + typename iterator_traits<_ForwardIter>::value_type); + __first = adjacent_find(__first, __last, __binary_pred); + return unique_copy(__first, __last, __first, __binary_pred); +} + +// reverse and reverse_copy, and their auxiliary functions + +template +void __reverse(_BidirectionalIter __first, _BidirectionalIter __last, + bidirectional_iterator_tag) { + while (true) + if (__first == __last || __first == --__last) + return; + else + iter_swap(__first++, __last); +} + +template +void __reverse(_RandomAccessIter __first, _RandomAccessIter __last, + random_access_iterator_tag) { + while (__first < __last) + iter_swap(__first++, --__last); +} + +template +inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) { + __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator); + __reverse(__first, __last, __ITERATOR_CATEGORY(__first)); +} + +template +_OutputIter reverse_copy(_BidirectionalIter __first, + _BidirectionalIter __last, + _OutputIter __result) { + __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + while (__first != __last) { + --__last; + *__result = *__last; + ++__result; + } + return __result; +} + +// rotate and rotate_copy, and their auxiliary functions + +template +_EuclideanRingElement __gcd(_EuclideanRingElement __m, + _EuclideanRingElement __n) +{ + while (__n != 0) { + _EuclideanRingElement __t = __m % __n; + __m = __n; + __n = __t; + } + return __m; +} + +template +_ForwardIter __rotate(_ForwardIter __first, + _ForwardIter __middle, + _ForwardIter __last, + _Distance*, + forward_iterator_tag) { + if (__first == __middle) + return __last; + if (__last == __middle) + return __first; + + _ForwardIter __first2 = __middle; + do { + swap(*__first++, *__first2++); + if (__first == __middle) + __middle = __first2; + } while (__first2 != __last); + + _ForwardIter __new_middle = __first; + + __first2 = __middle; + + while (__first2 != __last) { + swap (*__first++, *__first2++); + if (__first == __middle) + __middle = __first2; + else if (__first2 == __last) + __first2 = __middle; + } + + return __new_middle; +} + + +template +_BidirectionalIter __rotate(_BidirectionalIter __first, + _BidirectionalIter __middle, + _BidirectionalIter __last, + _Distance*, + bidirectional_iterator_tag) { + __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator); + if (__first == __middle) + return __last; + if (__last == __middle) + return __first; + + __reverse(__first, __middle, bidirectional_iterator_tag()); + __reverse(__middle, __last, bidirectional_iterator_tag()); + + while (__first != __middle && __middle != __last) + swap (*__first++, *--__last); + + if (__first == __middle) { + __reverse(__middle, __last, bidirectional_iterator_tag()); + return __last; + } + else { + __reverse(__first, __middle, bidirectional_iterator_tag()); + return __first; + } +} + +template +_RandomAccessIter __rotate(_RandomAccessIter __first, + _RandomAccessIter __middle, + _RandomAccessIter __last, + _Distance *, _Tp *) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + _Distance __n = __last - __first; + _Distance __k = __middle - __first; + _Distance __l = __n - __k; + _RandomAccessIter __result = __first + (__last - __middle); + + if (__k == 0) + return __last; + + else if (__k == __l) { + swap_ranges(__first, __middle, __middle); + return __result; + } + + _Distance __d = __gcd(__n, __k); + + for (_Distance __i = 0; __i < __d; __i++) { + _Tp __tmp = *__first; + _RandomAccessIter __p = __first; + + if (__k < __l) { + for (_Distance __j = 0; __j < __l/__d; __j++) { + if (__p > __first + __l) { + *__p = *(__p - __l); + __p -= __l; + } + + *__p = *(__p + __k); + __p += __k; + } + } + + else { + for (_Distance __j = 0; __j < __k/__d - 1; __j ++) { + if (__p < __last - __k) { + *__p = *(__p + __k); + __p += __k; + } + + *__p = * (__p - __l); + __p -= __l; + } + } + + *__p = __tmp; + ++__first; + } + + return __result; +} + +template +inline _ForwardIter rotate(_ForwardIter __first, _ForwardIter __middle, + _ForwardIter __last) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + return __rotate(__first, __middle, __last, + __DISTANCE_TYPE(__first), + __ITERATOR_CATEGORY(__first)); +} + +template +_OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle, + _ForwardIter __last, _OutputIter __result) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + return copy(__first, __middle, copy(__middle, __last, __result)); +} + +// Return a random number in the range [0, __n). This function encapsulates +// whether we're using rand (part of the standard C library) or lrand48 +// (not standard, but a much better choice whenever it's available). + +template +inline _Distance __random_number(_Distance __n) { +#ifdef __STL_NO_DRAND48 + return rand() % __n; +#else + return lrand48() % __n; +#endif +} + +// random_shuffle + +template +inline void random_shuffle(_RandomAccessIter __first, + _RandomAccessIter __last) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + if (__first == __last) return; + for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i) + iter_swap(__i, __first + __random_number((__i - __first) + 1)); +} + +template +void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last, + _RandomNumberGenerator& __rand) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + if (__first == __last) return; + for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i) + iter_swap(__i, __first + __rand((__i - __first) + 1)); +} + +// random_sample and random_sample_n (extensions, not part of the standard). + +template +_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last, + _OutputIter __out, const _Distance __n) +{ + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + _Distance __remaining = 0; + distance(__first, __last, __remaining); + _Distance __m = min(__n, __remaining); + + while (__m > 0) { + if (__random_number(__remaining) < __m) { + *__out = *__first; + ++__out; + --__m; + } + + --__remaining; + ++__first; + } + return __out; +} + +template +_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last, + _OutputIter __out, const _Distance __n, + _RandomNumberGenerator& __rand) +{ + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance); + _Distance __remaining = 0; + distance(__first, __last, __remaining); + _Distance __m = min(__n, __remaining); + + while (__m > 0) { + if (__rand(__remaining) < __m) { + *__out = *__first; + ++__out; + --__m; + } + + --__remaining; + ++__first; + } + return __out; +} + +template +_RandomAccessIter __random_sample(_InputIter __first, _InputIter __last, + _RandomAccessIter __out, + const _Distance __n) +{ + _Distance __m = 0; + _Distance __t = __n; + for ( ; __first != __last && __m < __n; ++__m, ++__first) + __out[__m] = *__first; + + while (__first != __last) { + ++__t; + _Distance __M = __random_number(__t); + if (__M < __n) + __out[__M] = *__first; + ++__first; + } + + return __out + __m; +} + +template +_RandomAccessIter __random_sample(_InputIter __first, _InputIter __last, + _RandomAccessIter __out, + _RandomNumberGenerator& __rand, + const _Distance __n) +{ + __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance); + _Distance __m = 0; + _Distance __t = __n; + for ( ; __first != __last && __m < __n; ++__m, ++__first) + __out[__m] = *__first; + + while (__first != __last) { + ++__t; + _Distance __M = __rand(__t); + if (__M < __n) + __out[__M] = *__first; + ++__first; + } + + return __out + __m; +} + +template +inline _RandomAccessIter +random_sample(_InputIter __first, _InputIter __last, + _RandomAccessIter __out_first, _RandomAccessIter __out_last) +{ + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + return __random_sample(__first, __last, + __out_first, __out_last - __out_first); +} + + +template +inline _RandomAccessIter +random_sample(_InputIter __first, _InputIter __last, + _RandomAccessIter __out_first, _RandomAccessIter __out_last, + _RandomNumberGenerator& __rand) +{ + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + return __random_sample(__first, __last, + __out_first, __rand, + __out_last - __out_first); +} + +// partition, stable_partition, and their auxiliary functions + +template +_ForwardIter __partition(_ForwardIter __first, + _ForwardIter __last, + _Predicate __pred, + forward_iterator_tag) { + if (__first == __last) return __first; + + while (__pred(*__first)) + if (++__first == __last) return __first; + + _ForwardIter __next = __first; + + while (++__next != __last) + if (__pred(*__next)) { + swap(*__first, *__next); + ++__first; + } + + return __first; +} + +template +_BidirectionalIter __partition(_BidirectionalIter __first, + _BidirectionalIter __last, + _Predicate __pred, + bidirectional_iterator_tag) { + while (true) { + while (true) + if (__first == __last) + return __first; + else if (__pred(*__first)) + ++__first; + else + break; + --__last; + while (true) + if (__first == __last) + return __first; + else if (!__pred(*__last)) + --__last; + else + break; + iter_swap(__first, __last); + ++__first; + } +} + +template +inline _ForwardIter partition(_ForwardIter __first, + _ForwardIter __last, + _Predicate __pred) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, + typename iterator_traits<_ForwardIter>::value_type); + return __partition(__first, __last, __pred, __ITERATOR_CATEGORY(__first)); +} + + +template +_ForwardIter __inplace_stable_partition(_ForwardIter __first, + _ForwardIter __last, + _Predicate __pred, _Distance __len) { + if (__len == 1) + return __pred(*__first) ? __last : __first; + _ForwardIter __middle = __first; + advance(__middle, __len / 2); + return rotate(__inplace_stable_partition(__first, __middle, __pred, + __len / 2), + __middle, + __inplace_stable_partition(__middle, __last, __pred, + __len - __len / 2)); +} + +template +_ForwardIter __stable_partition_adaptive(_ForwardIter __first, + _ForwardIter __last, + _Predicate __pred, _Distance __len, + _Pointer __buffer, + _Distance __buffer_size) +{ + if (__len <= __buffer_size) { + _ForwardIter __result1 = __first; + _Pointer __result2 = __buffer; + for ( ; __first != __last ; ++__first) + if (__pred(*__first)) { + *__result1 = *__first; + ++__result1; + } + else { + *__result2 = *__first; + ++__result2; + } + copy(__buffer, __result2, __result1); + return __result1; + } + else { + _ForwardIter __middle = __first; + advance(__middle, __len / 2); + return rotate(__stable_partition_adaptive( + __first, __middle, __pred, + __len / 2, __buffer, __buffer_size), + __middle, + __stable_partition_adaptive( + __middle, __last, __pred, + __len - __len / 2, __buffer, __buffer_size)); + } +} + +template +inline _ForwardIter +__stable_partition_aux(_ForwardIter __first, _ForwardIter __last, + _Predicate __pred, _Tp*, _Distance*) +{ + _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last); + if (__buf.size() > 0) + return __stable_partition_adaptive(__first, __last, __pred, + _Distance(__buf.requested_size()), + __buf.begin(), __buf.size()); + else + return __inplace_stable_partition(__first, __last, __pred, + _Distance(__buf.requested_size())); +} + +template +inline _ForwardIter stable_partition(_ForwardIter __first, + _ForwardIter __last, + _Predicate __pred) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, + typename iterator_traits<_ForwardIter>::value_type); + if (__first == __last) + return __first; + else + return __stable_partition_aux(__first, __last, __pred, + __VALUE_TYPE(__first), + __DISTANCE_TYPE(__first)); +} + +template +_RandomAccessIter __unguarded_partition(_RandomAccessIter __first, + _RandomAccessIter __last, + _Tp __pivot) +{ + while (true) { + while (*__first < __pivot) + ++__first; + --__last; + while (__pivot < *__last) + --__last; + if (!(__first < __last)) + return __first; + iter_swap(__first, __last); + ++__first; + } +} + +template +_RandomAccessIter __unguarded_partition(_RandomAccessIter __first, + _RandomAccessIter __last, + _Tp __pivot, _Compare __comp) +{ + while (true) { + while (__comp(*__first, __pivot)) + ++__first; + --__last; + while (__comp(__pivot, *__last)) + --__last; + if (!(__first < __last)) + return __first; + iter_swap(__first, __last); + ++__first; + } +} + +const int __stl_threshold = 16; + +// sort() and its auxiliary functions. + +template +void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val) { + _RandomAccessIter __next = __last; + --__next; + while (__val < *__next) { + *__last = *__next; + __last = __next; + --__next; + } + *__last = __val; +} + +template +void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val, + _Compare __comp) { + _RandomAccessIter __next = __last; + --__next; + while (__comp(__val, *__next)) { + *__last = *__next; + __last = __next; + --__next; + } + *__last = __val; +} + +template +inline void __linear_insert(_RandomAccessIter __first, + _RandomAccessIter __last, _Tp*) { + _Tp __val = *__last; + if (__val < *__first) { + copy_backward(__first, __last, __last + 1); + *__first = __val; + } + else + __unguarded_linear_insert(__last, __val); +} + +template +inline void __linear_insert(_RandomAccessIter __first, + _RandomAccessIter __last, _Tp*, _Compare __comp) { + _Tp __val = *__last; + if (__comp(__val, *__first)) { + copy_backward(__first, __last, __last + 1); + *__first = __val; + } + else + __unguarded_linear_insert(__last, __val, __comp); +} + +template +void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last) { + if (__first == __last) return; + for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i) + __linear_insert(__first, __i, __VALUE_TYPE(__first)); +} + +template +void __insertion_sort(_RandomAccessIter __first, + _RandomAccessIter __last, _Compare __comp) { + if (__first == __last) return; + for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i) + __linear_insert(__first, __i, __VALUE_TYPE(__first), __comp); +} + +template +void __unguarded_insertion_sort_aux(_RandomAccessIter __first, + _RandomAccessIter __last, _Tp*) { + for (_RandomAccessIter __i = __first; __i != __last; ++__i) + __unguarded_linear_insert(__i, _Tp(*__i)); +} + +template +inline void __unguarded_insertion_sort(_RandomAccessIter __first, + _RandomAccessIter __last) { + __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first)); +} + +template +void __unguarded_insertion_sort_aux(_RandomAccessIter __first, + _RandomAccessIter __last, + _Tp*, _Compare __comp) { + for (_RandomAccessIter __i = __first; __i != __last; ++__i) + __unguarded_linear_insert(__i, _Tp(*__i), __comp); +} + +template +inline void __unguarded_insertion_sort(_RandomAccessIter __first, + _RandomAccessIter __last, + _Compare __comp) { + __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first), + __comp); +} + +template +void __final_insertion_sort(_RandomAccessIter __first, + _RandomAccessIter __last) { + if (__last - __first > __stl_threshold) { + __insertion_sort(__first, __first + __stl_threshold); + __unguarded_insertion_sort(__first + __stl_threshold, __last); + } + else + __insertion_sort(__first, __last); +} + +template +void __final_insertion_sort(_RandomAccessIter __first, + _RandomAccessIter __last, _Compare __comp) { + if (__last - __first > __stl_threshold) { + __insertion_sort(__first, __first + __stl_threshold, __comp); + __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp); + } + else + __insertion_sort(__first, __last, __comp); +} + +template +inline _Size __lg(_Size __n) { + _Size __k; + for (__k = 0; __n != 1; __n >>= 1) ++__k; + return __k; +} + +template +void __introsort_loop(_RandomAccessIter __first, + _RandomAccessIter __last, _Tp*, + _Size __depth_limit) +{ + while (__last - __first > __stl_threshold) { + if (__depth_limit == 0) { + partial_sort(__first, __last, __last); + return; + } + --__depth_limit; + _RandomAccessIter __cut = + __unguarded_partition(__first, __last, + _Tp(__median(*__first, + *(__first + (__last - __first)/2), + *(__last - 1)))); + __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit); + __last = __cut; + } +} + +template +void __introsort_loop(_RandomAccessIter __first, + _RandomAccessIter __last, _Tp*, + _Size __depth_limit, _Compare __comp) +{ + while (__last - __first > __stl_threshold) { + if (__depth_limit == 0) { + partial_sort(__first, __last, __last, __comp); + return; + } + --__depth_limit; + _RandomAccessIter __cut = + __unguarded_partition(__first, __last, + _Tp(__median(*__first, + *(__first + (__last - __first)/2), + *(__last - 1), __comp)), + __comp); + __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp); + __last = __cut; + } +} + +template +inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type, + _LessThanComparable); + if (__first != __last) { + __introsort_loop(__first, __last, + __VALUE_TYPE(__first), + __lg(__last - __first) * 2); + __final_insertion_sort(__first, __last); + } +} + +template +inline void sort(_RandomAccessIter __first, _RandomAccessIter __last, + _Compare __comp) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_RandomAccessIter>::value_type, + typename iterator_traits<_RandomAccessIter>::value_type); + if (__first != __last) { + __introsort_loop(__first, __last, + __VALUE_TYPE(__first), + __lg(__last - __first) * 2, + __comp); + __final_insertion_sort(__first, __last, __comp); + } +} + +// stable_sort() and its auxiliary functions. + +template +void __inplace_stable_sort(_RandomAccessIter __first, + _RandomAccessIter __last) { + if (__last - __first < 15) { + __insertion_sort(__first, __last); + return; + } + _RandomAccessIter __middle = __first + (__last - __first) / 2; + __inplace_stable_sort(__first, __middle); + __inplace_stable_sort(__middle, __last); + __merge_without_buffer(__first, __middle, __last, + __middle - __first, + __last - __middle); +} + +template +void __inplace_stable_sort(_RandomAccessIter __first, + _RandomAccessIter __last, _Compare __comp) { + if (__last - __first < 15) { + __insertion_sort(__first, __last, __comp); + return; + } + _RandomAccessIter __middle = __first + (__last - __first) / 2; + __inplace_stable_sort(__first, __middle, __comp); + __inplace_stable_sort(__middle, __last, __comp); + __merge_without_buffer(__first, __middle, __last, + __middle - __first, + __last - __middle, + __comp); +} + +template +void __merge_sort_loop(_RandomAccessIter1 __first, + _RandomAccessIter1 __last, + _RandomAccessIter2 __result, _Distance __step_size) { + _Distance __two_step = 2 * __step_size; + + while (__last - __first >= __two_step) { + __result = merge(__first, __first + __step_size, + __first + __step_size, __first + __two_step, + __result); + __first += __two_step; + } + + __step_size = min(_Distance(__last - __first), __step_size); + merge(__first, __first + __step_size, __first + __step_size, __last, + __result); +} + +template +void __merge_sort_loop(_RandomAccessIter1 __first, + _RandomAccessIter1 __last, + _RandomAccessIter2 __result, _Distance __step_size, + _Compare __comp) { + _Distance __two_step = 2 * __step_size; + + while (__last - __first >= __two_step) { + __result = merge(__first, __first + __step_size, + __first + __step_size, __first + __two_step, + __result, + __comp); + __first += __two_step; + } + __step_size = min(_Distance(__last - __first), __step_size); + + merge(__first, __first + __step_size, + __first + __step_size, __last, + __result, + __comp); +} + +const int __stl_chunk_size = 7; + +template +void __chunk_insertion_sort(_RandomAccessIter __first, + _RandomAccessIter __last, _Distance __chunk_size) +{ + while (__last - __first >= __chunk_size) { + __insertion_sort(__first, __first + __chunk_size); + __first += __chunk_size; + } + __insertion_sort(__first, __last); +} + +template +void __chunk_insertion_sort(_RandomAccessIter __first, + _RandomAccessIter __last, + _Distance __chunk_size, _Compare __comp) +{ + while (__last - __first >= __chunk_size) { + __insertion_sort(__first, __first + __chunk_size, __comp); + __first += __chunk_size; + } + __insertion_sort(__first, __last, __comp); +} + +template +void __merge_sort_with_buffer(_RandomAccessIter __first, + _RandomAccessIter __last, + _Pointer __buffer, _Distance*) { + _Distance __len = __last - __first; + _Pointer __buffer_last = __buffer + __len; + + _Distance __step_size = __stl_chunk_size; + __chunk_insertion_sort(__first, __last, __step_size); + + while (__step_size < __len) { + __merge_sort_loop(__first, __last, __buffer, __step_size); + __step_size *= 2; + __merge_sort_loop(__buffer, __buffer_last, __first, __step_size); + __step_size *= 2; + } +} + +template +void __merge_sort_with_buffer(_RandomAccessIter __first, + _RandomAccessIter __last, _Pointer __buffer, + _Distance*, _Compare __comp) { + _Distance __len = __last - __first; + _Pointer __buffer_last = __buffer + __len; + + _Distance __step_size = __stl_chunk_size; + __chunk_insertion_sort(__first, __last, __step_size, __comp); + + while (__step_size < __len) { + __merge_sort_loop(__first, __last, __buffer, __step_size, __comp); + __step_size *= 2; + __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp); + __step_size *= 2; + } +} + +template +void __stable_sort_adaptive(_RandomAccessIter __first, + _RandomAccessIter __last, _Pointer __buffer, + _Distance __buffer_size) { + _Distance __len = (__last - __first + 1) / 2; + _RandomAccessIter __middle = __first + __len; + if (__len > __buffer_size) { + __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size); + __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size); + } + else { + __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0); + __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0); + } + __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), + _Distance(__last - __middle), __buffer, __buffer_size); +} + +template +void __stable_sort_adaptive(_RandomAccessIter __first, + _RandomAccessIter __last, _Pointer __buffer, + _Distance __buffer_size, _Compare __comp) { + _Distance __len = (__last - __first + 1) / 2; + _RandomAccessIter __middle = __first + __len; + if (__len > __buffer_size) { + __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size, + __comp); + __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size, + __comp); + } + else { + __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0, + __comp); + __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0, + __comp); + } + __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), + _Distance(__last - __middle), __buffer, __buffer_size, + __comp); +} + +template +inline void __stable_sort_aux(_RandomAccessIter __first, + _RandomAccessIter __last, _Tp*, _Distance*) { + _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last); + if (buf.begin() == 0) + __inplace_stable_sort(__first, __last); + else + __stable_sort_adaptive(__first, __last, buf.begin(), + _Distance(buf.size())); +} + +template +inline void __stable_sort_aux(_RandomAccessIter __first, + _RandomAccessIter __last, _Tp*, _Distance*, + _Compare __comp) { + _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last); + if (buf.begin() == 0) + __inplace_stable_sort(__first, __last, __comp); + else + __stable_sort_adaptive(__first, __last, buf.begin(), + _Distance(buf.size()), + __comp); +} + +template +inline void stable_sort(_RandomAccessIter __first, + _RandomAccessIter __last) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type, + _LessThanComparable); + __stable_sort_aux(__first, __last, + __VALUE_TYPE(__first), + __DISTANCE_TYPE(__first)); +} + +template +inline void stable_sort(_RandomAccessIter __first, + _RandomAccessIter __last, _Compare __comp) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_RandomAccessIter>::value_type, + typename iterator_traits<_RandomAccessIter>::value_type); + __stable_sort_aux(__first, __last, + __VALUE_TYPE(__first), + __DISTANCE_TYPE(__first), + __comp); +} + +// partial_sort, partial_sort_copy, and auxiliary functions. + +template +void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle, + _RandomAccessIter __last, _Tp*) { + make_heap(__first, __middle); + for (_RandomAccessIter __i = __middle; __i < __last; ++__i) + if (*__i < *__first) + __pop_heap(__first, __middle, __i, _Tp(*__i), + __DISTANCE_TYPE(__first)); + sort_heap(__first, __middle); +} + +template +inline void partial_sort(_RandomAccessIter __first, + _RandomAccessIter __middle, + _RandomAccessIter __last) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type, + _LessThanComparable); + __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first)); +} + +template +void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle, + _RandomAccessIter __last, _Tp*, _Compare __comp) { + make_heap(__first, __middle, __comp); + for (_RandomAccessIter __i = __middle; __i < __last; ++__i) + if (__comp(*__i, *__first)) + __pop_heap(__first, __middle, __i, _Tp(*__i), __comp, + __DISTANCE_TYPE(__first)); + sort_heap(__first, __middle, __comp); +} + +template +inline void partial_sort(_RandomAccessIter __first, + _RandomAccessIter __middle, + _RandomAccessIter __last, _Compare __comp) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_RandomAccessIter>::value_type, + typename iterator_traits<_RandomAccessIter>::value_type); + __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first), __comp); +} + +template +_RandomAccessIter __partial_sort_copy(_InputIter __first, + _InputIter __last, + _RandomAccessIter __result_first, + _RandomAccessIter __result_last, + _Distance*, _Tp*) { + if (__result_first == __result_last) return __result_last; + _RandomAccessIter __result_real_last = __result_first; + while(__first != __last && __result_real_last != __result_last) { + *__result_real_last = *__first; + ++__result_real_last; + ++__first; + } + make_heap(__result_first, __result_real_last); + while (__first != __last) { + if (*__first < *__result_first) + __adjust_heap(__result_first, _Distance(0), + _Distance(__result_real_last - __result_first), + _Tp(*__first)); + ++__first; + } + sort_heap(__result_first, __result_real_last); + return __result_real_last; +} + +template +inline _RandomAccessIter +partial_sort_copy(_InputIter __first, _InputIter __last, + _RandomAccessIter __result_first, + _RandomAccessIter __result_last) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type, + typename iterator_traits<_RandomAccessIter>::value_type); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type, + _LessThanComparable); + __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type, + _LessThanComparable); + return __partial_sort_copy(__first, __last, __result_first, __result_last, + __DISTANCE_TYPE(__result_first), + __VALUE_TYPE(__first)); +} + +template +_RandomAccessIter __partial_sort_copy(_InputIter __first, + _InputIter __last, + _RandomAccessIter __result_first, + _RandomAccessIter __result_last, + _Compare __comp, _Distance*, _Tp*) { + if (__result_first == __result_last) return __result_last; + _RandomAccessIter __result_real_last = __result_first; + while(__first != __last && __result_real_last != __result_last) { + *__result_real_last = *__first; + ++__result_real_last; + ++__first; + } + make_heap(__result_first, __result_real_last, __comp); + while (__first != __last) { + if (__comp(*__first, *__result_first)) + __adjust_heap(__result_first, _Distance(0), + _Distance(__result_real_last - __result_first), + _Tp(*__first), + __comp); + ++__first; + } + sort_heap(__result_first, __result_real_last, __comp); + return __result_real_last; +} + +template +inline _RandomAccessIter +partial_sort_copy(_InputIter __first, _InputIter __last, + _RandomAccessIter __result_first, + _RandomAccessIter __result_last, _Compare __comp) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type, + typename iterator_traits<_RandomAccessIter>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_RandomAccessIter>::value_type, + typename iterator_traits<_RandomAccessIter>::value_type); + return __partial_sort_copy(__first, __last, __result_first, __result_last, + __comp, + __DISTANCE_TYPE(__result_first), + __VALUE_TYPE(__first)); +} + +// nth_element() and its auxiliary functions. + +template +void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth, + _RandomAccessIter __last, _Tp*) { + while (__last - __first > 3) { + _RandomAccessIter __cut = + __unguarded_partition(__first, __last, + _Tp(__median(*__first, + *(__first + (__last - __first)/2), + *(__last - 1)))); + if (__cut <= __nth) + __first = __cut; + else + __last = __cut; + } + __insertion_sort(__first, __last); +} + +template +inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth, + _RandomAccessIter __last) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type, + _LessThanComparable); + __nth_element(__first, __nth, __last, __VALUE_TYPE(__first)); +} + +template +void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth, + _RandomAccessIter __last, _Tp*, _Compare __comp) { + while (__last - __first > 3) { + _RandomAccessIter __cut = + __unguarded_partition(__first, __last, + _Tp(__median(*__first, + *(__first + (__last - __first)/2), + *(__last - 1), + __comp)), + __comp); + if (__cut <= __nth) + __first = __cut; + else + __last = __cut; + } + __insertion_sort(__first, __last, __comp); +} + +template +inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth, + _RandomAccessIter __last, _Compare __comp) { + __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_RandomAccessIter>::value_type, + typename iterator_traits<_RandomAccessIter>::value_type); + __nth_element(__first, __nth, __last, __VALUE_TYPE(__first), __comp); +} + + +// Binary search (lower_bound, upper_bound, equal_range, binary_search). + +template +_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val, _Distance*) +{ + _Distance __len = 0; + distance(__first, __last, __len); + _Distance __half; + _ForwardIter __middle; + + while (__len > 0) { + __half = __len >> 1; + __middle = __first; + advance(__middle, __half); + if (*__middle < __val) { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + else + __len = __half; + } + return __first; +} + +template +inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES_SAME_TYPE(_Tp, + typename iterator_traits<_ForwardIter>::value_type); + __STL_REQUIRES(_Tp, _LessThanComparable); + return __lower_bound(__first, __last, __val, + __DISTANCE_TYPE(__first)); +} + +template +_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val, _Compare __comp, _Distance*) +{ + _Distance __len = 0; + distance(__first, __last, __len); + _Distance __half; + _ForwardIter __middle; + + while (__len > 0) { + __half = __len >> 1; + __middle = __first; + advance(__middle, __half); + if (__comp(*__middle, __val)) { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + else + __len = __half; + } + return __first; +} + +template +inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val, _Compare __comp) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES_SAME_TYPE(_Tp, + typename iterator_traits<_ForwardIter>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp); + return __lower_bound(__first, __last, __val, __comp, + __DISTANCE_TYPE(__first)); +} + +template +_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val, _Distance*) +{ + _Distance __len = 0; + distance(__first, __last, __len); + _Distance __half; + _ForwardIter __middle; + + while (__len > 0) { + __half = __len >> 1; + __middle = __first; + advance(__middle, __half); + if (__val < *__middle) + __len = __half; + else { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + } + return __first; +} + +template +inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES_SAME_TYPE(_Tp, + typename iterator_traits<_ForwardIter>::value_type); + __STL_REQUIRES(_Tp, _LessThanComparable); + return __upper_bound(__first, __last, __val, + __DISTANCE_TYPE(__first)); +} + +template +_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val, _Compare __comp, _Distance*) +{ + _Distance __len = 0; + distance(__first, __last, __len); + _Distance __half; + _ForwardIter __middle; + + while (__len > 0) { + __half = __len >> 1; + __middle = __first; + advance(__middle, __half); + if (__comp(__val, *__middle)) + __len = __half; + else { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + } + return __first; +} + +template +inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val, _Compare __comp) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES_SAME_TYPE(_Tp, + typename iterator_traits<_ForwardIter>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp); + return __upper_bound(__first, __last, __val, __comp, + __DISTANCE_TYPE(__first)); +} + +template +pair<_ForwardIter, _ForwardIter> +__equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val, + _Distance*) +{ + _Distance __len = 0; + distance(__first, __last, __len); + _Distance __half; + _ForwardIter __middle, __left, __right; + + while (__len > 0) { + __half = __len >> 1; + __middle = __first; + advance(__middle, __half); + if (*__middle < __val) { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + else if (__val < *__middle) + __len = __half; + else { + __left = lower_bound(__first, __middle, __val); + advance(__first, __len); + __right = upper_bound(++__middle, __first, __val); + return pair<_ForwardIter, _ForwardIter>(__left, __right); + } + } + return pair<_ForwardIter, _ForwardIter>(__first, __first); +} + +template +inline pair<_ForwardIter, _ForwardIter> +equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES_SAME_TYPE(_Tp, + typename iterator_traits<_ForwardIter>::value_type); + __STL_REQUIRES(_Tp, _LessThanComparable); + return __equal_range(__first, __last, __val, + __DISTANCE_TYPE(__first)); +} + +template +pair<_ForwardIter, _ForwardIter> +__equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val, + _Compare __comp, _Distance*) +{ + _Distance __len = 0; + distance(__first, __last, __len); + _Distance __half; + _ForwardIter __middle, __left, __right; + + while (__len > 0) { + __half = __len >> 1; + __middle = __first; + advance(__middle, __half); + if (__comp(*__middle, __val)) { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + else if (__comp(__val, *__middle)) + __len = __half; + else { + __left = lower_bound(__first, __middle, __val, __comp); + advance(__first, __len); + __right = upper_bound(++__middle, __first, __val, __comp); + return pair<_ForwardIter, _ForwardIter>(__left, __right); + } + } + return pair<_ForwardIter, _ForwardIter>(__first, __first); +} + +template +inline pair<_ForwardIter, _ForwardIter> +equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val, + _Compare __comp) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES_SAME_TYPE(_Tp, + typename iterator_traits<_ForwardIter>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp); + return __equal_range(__first, __last, __val, __comp, + __DISTANCE_TYPE(__first)); +} + +template +bool binary_search(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES_SAME_TYPE(_Tp, + typename iterator_traits<_ForwardIter>::value_type); + __STL_REQUIRES(_Tp, _LessThanComparable); + _ForwardIter __i = lower_bound(__first, __last, __val); + return __i != __last && !(__val < *__i); +} + +template +bool binary_search(_ForwardIter __first, _ForwardIter __last, + const _Tp& __val, + _Compare __comp) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES_SAME_TYPE(_Tp, + typename iterator_traits<_ForwardIter>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp); + _ForwardIter __i = lower_bound(__first, __last, __val, __comp); + return __i != __last && !__comp(__val, *__i); +} + +// merge, with and without an explicitly supplied comparison function. + +template +_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _LessThanComparable); + while (__first1 != __last1 && __first2 != __last2) { + if (*__first2 < *__first1) { + *__result = *__first2; + ++__first2; + } + else { + *__result = *__first1; + ++__first1; + } + ++__result; + } + return copy(__first2, __last2, copy(__first1, __last1, __result)); +} + +template +_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result, _Compare __comp) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter1>::value_type); + while (__first1 != __last1 && __first2 != __last2) { + if (__comp(*__first2, *__first1)) { + *__result = *__first2; + ++__first2; + } + else { + *__result = *__first1; + ++__first1; + } + ++__result; + } + return copy(__first2, __last2, copy(__first1, __last1, __result)); +} + +// inplace_merge and its auxiliary functions. + +template +void __merge_without_buffer(_BidirectionalIter __first, + _BidirectionalIter __middle, + _BidirectionalIter __last, + _Distance __len1, _Distance __len2) { + if (__len1 == 0 || __len2 == 0) + return; + if (__len1 + __len2 == 2) { + if (*__middle < *__first) + iter_swap(__first, __middle); + return; + } + _BidirectionalIter __first_cut = __first; + _BidirectionalIter __second_cut = __middle; + _Distance __len11 = 0; + _Distance __len22 = 0; + if (__len1 > __len2) { + __len11 = __len1 / 2; + advance(__first_cut, __len11); + __second_cut = lower_bound(__middle, __last, *__first_cut); + distance(__middle, __second_cut, __len22); + } + else { + __len22 = __len2 / 2; + advance(__second_cut, __len22); + __first_cut = upper_bound(__first, __middle, *__second_cut); + distance(__first, __first_cut, __len11); + } + _BidirectionalIter __new_middle + = rotate(__first_cut, __middle, __second_cut); + __merge_without_buffer(__first, __first_cut, __new_middle, + __len11, __len22); + __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11, + __len2 - __len22); +} + +template +void __merge_without_buffer(_BidirectionalIter __first, + _BidirectionalIter __middle, + _BidirectionalIter __last, + _Distance __len1, _Distance __len2, + _Compare __comp) { + if (__len1 == 0 || __len2 == 0) + return; + if (__len1 + __len2 == 2) { + if (__comp(*__middle, *__first)) + iter_swap(__first, __middle); + return; + } + _BidirectionalIter __first_cut = __first; + _BidirectionalIter __second_cut = __middle; + _Distance __len11 = 0; + _Distance __len22 = 0; + if (__len1 > __len2) { + __len11 = __len1 / 2; + advance(__first_cut, __len11); + __second_cut = lower_bound(__middle, __last, *__first_cut, __comp); + distance(__middle, __second_cut, __len22); + } + else { + __len22 = __len2 / 2; + advance(__second_cut, __len22); + __first_cut = upper_bound(__first, __middle, *__second_cut, __comp); + distance(__first, __first_cut, __len11); + } + _BidirectionalIter __new_middle + = rotate(__first_cut, __middle, __second_cut); + __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22, + __comp); + __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11, + __len2 - __len22, __comp); +} + +template +_BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first, + _BidirectionalIter1 __middle, + _BidirectionalIter1 __last, + _Distance __len1, _Distance __len2, + _BidirectionalIter2 __buffer, + _Distance __buffer_size) { + _BidirectionalIter2 __buffer_end; + if (__len1 > __len2 && __len2 <= __buffer_size) { + __buffer_end = copy(__middle, __last, __buffer); + copy_backward(__first, __middle, __last); + return copy(__buffer, __buffer_end, __first); + } + else if (__len1 <= __buffer_size) { + __buffer_end = copy(__first, __middle, __buffer); + copy(__middle, __last, __first); + return copy_backward(__buffer, __buffer_end, __last); + } + else + return rotate(__first, __middle, __last); +} + +template +_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1, + _BidirectionalIter1 __last1, + _BidirectionalIter2 __first2, + _BidirectionalIter2 __last2, + _BidirectionalIter3 __result) { + if (__first1 == __last1) + return copy_backward(__first2, __last2, __result); + if (__first2 == __last2) + return copy_backward(__first1, __last1, __result); + --__last1; + --__last2; + while (true) { + if (*__last2 < *__last1) { + *--__result = *__last1; + if (__first1 == __last1) + return copy_backward(__first2, ++__last2, __result); + --__last1; + } + else { + *--__result = *__last2; + if (__first2 == __last2) + return copy_backward(__first1, ++__last1, __result); + --__last2; + } + } +} + +template +_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1, + _BidirectionalIter1 __last1, + _BidirectionalIter2 __first2, + _BidirectionalIter2 __last2, + _BidirectionalIter3 __result, + _Compare __comp) { + if (__first1 == __last1) + return copy_backward(__first2, __last2, __result); + if (__first2 == __last2) + return copy_backward(__first1, __last1, __result); + --__last1; + --__last2; + while (true) { + if (__comp(*__last2, *__last1)) { + *--__result = *__last1; + if (__first1 == __last1) + return copy_backward(__first2, ++__last2, __result); + --__last1; + } + else { + *--__result = *__last2; + if (__first2 == __last2) + return copy_backward(__first1, ++__last1, __result); + --__last2; + } + } +} + +template +void __merge_adaptive(_BidirectionalIter __first, + _BidirectionalIter __middle, + _BidirectionalIter __last, + _Distance __len1, _Distance __len2, + _Pointer __buffer, _Distance __buffer_size) { + if (__len1 <= __len2 && __len1 <= __buffer_size) { + _Pointer __buffer_end = copy(__first, __middle, __buffer); + merge(__buffer, __buffer_end, __middle, __last, __first); + } + else if (__len2 <= __buffer_size) { + _Pointer __buffer_end = copy(__middle, __last, __buffer); + __merge_backward(__first, __middle, __buffer, __buffer_end, __last); + } + else { + _BidirectionalIter __first_cut = __first; + _BidirectionalIter __second_cut = __middle; + _Distance __len11 = 0; + _Distance __len22 = 0; + if (__len1 > __len2) { + __len11 = __len1 / 2; + advance(__first_cut, __len11); + __second_cut = lower_bound(__middle, __last, *__first_cut); + distance(__middle, __second_cut, __len22); + } + else { + __len22 = __len2 / 2; + advance(__second_cut, __len22); + __first_cut = upper_bound(__first, __middle, *__second_cut); + distance(__first, __first_cut, __len11); + } + _BidirectionalIter __new_middle = + __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11, + __len22, __buffer, __buffer_size); + __merge_adaptive(__first, __first_cut, __new_middle, __len11, + __len22, __buffer, __buffer_size); + __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11, + __len2 - __len22, __buffer, __buffer_size); + } +} + +template +void __merge_adaptive(_BidirectionalIter __first, + _BidirectionalIter __middle, + _BidirectionalIter __last, + _Distance __len1, _Distance __len2, + _Pointer __buffer, _Distance __buffer_size, + _Compare __comp) { + if (__len1 <= __len2 && __len1 <= __buffer_size) { + _Pointer __buffer_end = copy(__first, __middle, __buffer); + merge(__buffer, __buffer_end, __middle, __last, __first, __comp); + } + else if (__len2 <= __buffer_size) { + _Pointer __buffer_end = copy(__middle, __last, __buffer); + __merge_backward(__first, __middle, __buffer, __buffer_end, __last, + __comp); + } + else { + _BidirectionalIter __first_cut = __first; + _BidirectionalIter __second_cut = __middle; + _Distance __len11 = 0; + _Distance __len22 = 0; + if (__len1 > __len2) { + __len11 = __len1 / 2; + advance(__first_cut, __len11); + __second_cut = lower_bound(__middle, __last, *__first_cut, __comp); + distance(__middle, __second_cut, __len22); + } + else { + __len22 = __len2 / 2; + advance(__second_cut, __len22); + __first_cut = upper_bound(__first, __middle, *__second_cut, __comp); + distance(__first, __first_cut, __len11); + } + _BidirectionalIter __new_middle = + __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11, + __len22, __buffer, __buffer_size); + __merge_adaptive(__first, __first_cut, __new_middle, __len11, + __len22, __buffer, __buffer_size, __comp); + __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11, + __len2 - __len22, __buffer, __buffer_size, __comp); + } +} + +template +inline void __inplace_merge_aux(_BidirectionalIter __first, + _BidirectionalIter __middle, + _BidirectionalIter __last, _Tp*, _Distance*) { + _Distance __len1 = 0; + distance(__first, __middle, __len1); + _Distance __len2 = 0; + distance(__middle, __last, __len2); + + _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last); + if (__buf.begin() == 0) + __merge_without_buffer(__first, __middle, __last, __len1, __len2); + else + __merge_adaptive(__first, __middle, __last, __len1, __len2, + __buf.begin(), _Distance(__buf.size())); +} + +template +inline void __inplace_merge_aux(_BidirectionalIter __first, + _BidirectionalIter __middle, + _BidirectionalIter __last, _Tp*, _Distance*, + _Compare __comp) { + _Distance __len1 = 0; + distance(__first, __middle, __len1); + _Distance __len2 = 0; + distance(__middle, __last, __len2); + + _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last); + if (__buf.begin() == 0) + __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp); + else + __merge_adaptive(__first, __middle, __last, __len1, __len2, + __buf.begin(), _Distance(__buf.size()), + __comp); +} + +template +inline void inplace_merge(_BidirectionalIter __first, + _BidirectionalIter __middle, + _BidirectionalIter __last) { + __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator); + __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type, + _LessThanComparable); + if (__first == __middle || __middle == __last) + return; + __inplace_merge_aux(__first, __middle, __last, + __VALUE_TYPE(__first), __DISTANCE_TYPE(__first)); +} + +template +inline void inplace_merge(_BidirectionalIter __first, + _BidirectionalIter __middle, + _BidirectionalIter __last, _Compare __comp) { + __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_BidirectionalIter>::value_type, + typename iterator_traits<_BidirectionalIter>::value_type); + if (__first == __middle || __middle == __last) + return; + __inplace_merge_aux(__first, __middle, __last, + __VALUE_TYPE(__first), __DISTANCE_TYPE(__first), + __comp); +} + +// Set algorithms: includes, set_union, set_intersection, set_difference, +// set_symmetric_difference. All of these algorithms have the precondition +// that their input ranges are sorted and the postcondition that their output +// ranges are sorted. + +template +bool includes(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _LessThanComparable); + while (__first1 != __last1 && __first2 != __last2) + if (*__first2 < *__first1) + return false; + else if(*__first1 < *__first2) + ++__first1; + else + ++__first1, ++__first2; + + return __first2 == __last2; +} + +template +bool includes(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + while (__first1 != __last1 && __first2 != __last2) + if (__comp(*__first2, *__first1)) + return false; + else if(__comp(*__first1, *__first2)) + ++__first1; + else + ++__first1, ++__first2; + + return __first2 == __last2; +} + +template +_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _LessThanComparable); + while (__first1 != __last1 && __first2 != __last2) { + if (*__first1 < *__first2) { + *__result = *__first1; + ++__first1; + } + else if (*__first2 < *__first1) { + *__result = *__first2; + ++__first2; + } + else { + *__result = *__first1; + ++__first1; + ++__first2; + } + ++__result; + } + return copy(__first2, __last2, copy(__first1, __last1, __result)); +} + +template +_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result, _Compare __comp) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + while (__first1 != __last1 && __first2 != __last2) { + if (__comp(*__first1, *__first2)) { + *__result = *__first1; + ++__first1; + } + else if (__comp(*__first2, *__first1)) { + *__result = *__first2; + ++__first2; + } + else { + *__result = *__first1; + ++__first1; + ++__first2; + } + ++__result; + } + return copy(__first2, __last2, copy(__first1, __last1, __result)); +} + +template +_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _LessThanComparable); + while (__first1 != __last1 && __first2 != __last2) + if (*__first1 < *__first2) + ++__first1; + else if (*__first2 < *__first1) + ++__first2; + else { + *__result = *__first1; + ++__first1; + ++__first2; + ++__result; + } + return __result; +} + +template +_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result, _Compare __comp) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + + while (__first1 != __last1 && __first2 != __last2) + if (__comp(*__first1, *__first2)) + ++__first1; + else if (__comp(*__first2, *__first1)) + ++__first2; + else { + *__result = *__first1; + ++__first1; + ++__first2; + ++__result; + } + return __result; +} + +template +_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _LessThanComparable); + while (__first1 != __last1 && __first2 != __last2) + if (*__first1 < *__first2) { + *__result = *__first1; + ++__first1; + ++__result; + } + else if (*__first2 < *__first1) + ++__first2; + else { + ++__first1; + ++__first2; + } + return copy(__first1, __last1, __result); +} + +template +_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result, _Compare __comp) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + + while (__first1 != __last1 && __first2 != __last2) + if (__comp(*__first1, *__first2)) { + *__result = *__first1; + ++__first1; + ++__result; + } + else if (__comp(*__first2, *__first1)) + ++__first2; + else { + ++__first1; + ++__first2; + } + return copy(__first1, __last1, __result); +} + +template +_OutputIter +set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _LessThanComparable); + while (__first1 != __last1 && __first2 != __last2) + if (*__first1 < *__first2) { + *__result = *__first1; + ++__first1; + ++__result; + } + else if (*__first2 < *__first1) { + *__result = *__first2; + ++__first2; + ++__result; + } + else { + ++__first1; + ++__first2; + } + return copy(__first2, __last2, copy(__first1, __last1, __result)); +} + +template +_OutputIter +set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _OutputIter __result, + _Compare __comp) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + __STL_REQUIRES_SAME_TYPE( + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_InputIter1>::value_type, + typename iterator_traits<_InputIter2>::value_type); + while (__first1 != __last1 && __first2 != __last2) + if (__comp(*__first1, *__first2)) { + *__result = *__first1; + ++__first1; + ++__result; + } + else if (__comp(*__first2, *__first1)) { + *__result = *__first2; + ++__first2; + ++__result; + } + else { + ++__first1; + ++__first2; + } + return copy(__first2, __last2, copy(__first1, __last1, __result)); +} + +// min_element and max_element, with and without an explicitly supplied +// comparison function. + +template +_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type, + _LessThanComparable); + if (__first == __last) return __first; + _ForwardIter __result = __first; + while (++__first != __last) + if (*__result < *__first) + __result = __first; + return __result; +} + +template +_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last, + _Compare __comp) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_ForwardIter>::value_type, + typename iterator_traits<_ForwardIter>::value_type); + if (__first == __last) return __first; + _ForwardIter __result = __first; + while (++__first != __last) + if (__comp(*__result, *__first)) __result = __first; + return __result; +} + +template +_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type, + _LessThanComparable); + if (__first == __last) return __first; + _ForwardIter __result = __first; + while (++__first != __last) + if (*__first < *__result) + __result = __first; + return __result; +} + +template +_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last, + _Compare __comp) { + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_ForwardIter>::value_type, + typename iterator_traits<_ForwardIter>::value_type); + if (__first == __last) return __first; + _ForwardIter __result = __first; + while (++__first != __last) + if (__comp(*__first, *__result)) + __result = __first; + return __result; +} + +// next_permutation and prev_permutation, with and without an explicitly +// supplied comparison function. + +template +bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) { + __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator); + __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type, + _LessThanComparable); + if (__first == __last) + return false; + _BidirectionalIter __i = __first; + ++__i; + if (__i == __last) + return false; + __i = __last; + --__i; + + for(;;) { + _BidirectionalIter __ii = __i; + --__i; + if (*__i < *__ii) { + _BidirectionalIter __j = __last; + while (!(*__i < *--__j)) + {} + iter_swap(__i, __j); + reverse(__ii, __last); + return true; + } + if (__i == __first) { + reverse(__first, __last); + return false; + } + } +} + +template +bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last, + _Compare __comp) { + __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_BidirectionalIter>::value_type, + typename iterator_traits<_BidirectionalIter>::value_type); + if (__first == __last) + return false; + _BidirectionalIter __i = __first; + ++__i; + if (__i == __last) + return false; + __i = __last; + --__i; + + for(;;) { + _BidirectionalIter __ii = __i; + --__i; + if (__comp(*__i, *__ii)) { + _BidirectionalIter __j = __last; + while (!__comp(*__i, *--__j)) + {} + iter_swap(__i, __j); + reverse(__ii, __last); + return true; + } + if (__i == __first) { + reverse(__first, __last); + return false; + } + } +} + +template +bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) { + __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator); + __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type, + _LessThanComparable); + if (__first == __last) + return false; + _BidirectionalIter __i = __first; + ++__i; + if (__i == __last) + return false; + __i = __last; + --__i; + + for(;;) { + _BidirectionalIter __ii = __i; + --__i; + if (*__ii < *__i) { + _BidirectionalIter __j = __last; + while (!(*--__j < *__i)) + {} + iter_swap(__i, __j); + reverse(__ii, __last); + return true; + } + if (__i == __first) { + reverse(__first, __last); + return false; + } + } +} + +template +bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last, + _Compare __comp) { + __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator); + __STL_BINARY_FUNCTION_CHECK(_Compare, bool, + typename iterator_traits<_BidirectionalIter>::value_type, + typename iterator_traits<_BidirectionalIter>::value_type); + if (__first == __last) + return false; + _BidirectionalIter __i = __first; + ++__i; + if (__i == __last) + return false; + __i = __last; + --__i; + + for(;;) { + _BidirectionalIter __ii = __i; + --__i; + if (__comp(*__ii, *__i)) { + _BidirectionalIter __j = __last; + while (!__comp(*--__j, *__i)) + {} + iter_swap(__i, __j); + reverse(__ii, __last); + return true; + } + if (__i == __first) { + reverse(__first, __last); + return false; + } + } +} + +// find_first_of, with and without an explicitly supplied comparison function. + +template +_InputIter find_first_of(_InputIter __first1, _InputIter __last1, + _ForwardIter __first2, _ForwardIter __last2) +{ + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, + typename iterator_traits<_InputIter>::value_type, + typename iterator_traits<_ForwardIter>::value_type); + + for ( ; __first1 != __last1; ++__first1) + for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter) + if (*__first1 == *__iter) + return __first1; + return __last1; +} + +template +_InputIter find_first_of(_InputIter __first1, _InputIter __last1, + _ForwardIter __first2, _ForwardIter __last2, + _BinaryPredicate __comp) +{ + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, + typename iterator_traits<_InputIter>::value_type, + typename iterator_traits<_ForwardIter>::value_type); + + for ( ; __first1 != __last1; ++__first1) + for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter) + if (__comp(*__first1, *__iter)) + return __first1; + return __last1; +} + + +// find_end, with and without an explicitly supplied comparison function. +// Search [first2, last2) as a subsequence in [first1, last1), and return +// the *last* possible match. Note that find_end for bidirectional iterators +// is much faster than for forward iterators. + +// find_end for forward iterators. +template +_ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, + _ForwardIter2 __first2, _ForwardIter2 __last2, + forward_iterator_tag, forward_iterator_tag) +{ + if (__first2 == __last2) + return __last1; + else { + _ForwardIter1 __result = __last1; + while (1) { + _ForwardIter1 __new_result + = search(__first1, __last1, __first2, __last2); + if (__new_result == __last1) + return __result; + else { + __result = __new_result; + __first1 = __new_result; + ++__first1; + } + } + } +} + +template +_ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, + _ForwardIter2 __first2, _ForwardIter2 __last2, + forward_iterator_tag, forward_iterator_tag, + _BinaryPredicate __comp) +{ + if (__first2 == __last2) + return __last1; + else { + _ForwardIter1 __result = __last1; + while (1) { + _ForwardIter1 __new_result + = search(__first1, __last1, __first2, __last2, __comp); + if (__new_result == __last1) + return __result; + else { + __result = __new_result; + __first1 = __new_result; + ++__first1; + } + } + } +} + +// find_end for bidirectional iterators. Requires partial specialization. +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +_BidirectionalIter1 +__find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1, + _BidirectionalIter2 __first2, _BidirectionalIter2 __last2, + bidirectional_iterator_tag, bidirectional_iterator_tag) +{ + __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator); + __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator); + typedef reverse_iterator<_BidirectionalIter1> _RevIter1; + typedef reverse_iterator<_BidirectionalIter2> _RevIter2; + + _RevIter1 __rlast1(__first1); + _RevIter2 __rlast2(__first2); + _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1, + _RevIter2(__last2), __rlast2); + + if (__rresult == __rlast1) + return __last1; + else { + _BidirectionalIter1 __result = __rresult.base(); + advance(__result, -distance(__first2, __last2)); + return __result; + } +} + +template +_BidirectionalIter1 +__find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1, + _BidirectionalIter2 __first2, _BidirectionalIter2 __last2, + bidirectional_iterator_tag, bidirectional_iterator_tag, + _BinaryPredicate __comp) +{ + __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator); + __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator); + typedef reverse_iterator<_BidirectionalIter1> _RevIter1; + typedef reverse_iterator<_BidirectionalIter2> _RevIter2; + + _RevIter1 __rlast1(__first1); + _RevIter2 __rlast2(__first2); + _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1, + _RevIter2(__last2), __rlast2, + __comp); + + if (__rresult == __rlast1) + return __last1; + else { + _BidirectionalIter1 __result = __rresult.base(); + advance(__result, -distance(__first2, __last2)); + return __result; + } +} +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +// Dispatching functions for find_end. + +template +inline _ForwardIter1 +find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, + _ForwardIter2 __first2, _ForwardIter2 __last2) +{ + __STL_REQUIRES(_ForwardIter1, _ForwardIterator); + __STL_REQUIRES(_ForwardIter2, _ForwardIterator); + __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, + typename iterator_traits<_ForwardIter1>::value_type, + typename iterator_traits<_ForwardIter2>::value_type); + return __find_end(__first1, __last1, __first2, __last2, + __ITERATOR_CATEGORY(__first1), + __ITERATOR_CATEGORY(__first2)); +} + +template +inline _ForwardIter1 +find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, + _ForwardIter2 __first2, _ForwardIter2 __last2, + _BinaryPredicate __comp) +{ + __STL_REQUIRES(_ForwardIter1, _ForwardIterator); + __STL_REQUIRES(_ForwardIter2, _ForwardIterator); + __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, + typename iterator_traits<_ForwardIter1>::value_type, + typename iterator_traits<_ForwardIter2>::value_type); + + return __find_end(__first1, __last1, __first2, __last2, + __ITERATOR_CATEGORY(__first1), + __ITERATOR_CATEGORY(__first2), + __comp); +} + +// is_heap, a predicate testing whether or not a range is +// a heap. This function is an extension, not part of the C++ +// standard. + +template +bool __is_heap(_RandomAccessIter __first, _Distance __n) +{ + _Distance __parent = 0; + for (_Distance __child = 1; __child < __n; ++__child) { + if (__first[__parent] < __first[__child]) + return false; + if ((__child & 1) == 0) + ++__parent; + } + return true; +} + +template +bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp, + _Distance __n) +{ + _Distance __parent = 0; + for (_Distance __child = 1; __child < __n; ++__child) { + if (__comp(__first[__parent], __first[__child])) + return false; + if ((__child & 1) == 0) + ++__parent; + } + return true; +} + +template +inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last) +{ + __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type, + _LessThanComparable); + return __is_heap(__first, __last - __first); +} + + +template +inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last, + _StrictWeakOrdering __comp) +{ + __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator); + __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool, + typename iterator_traits<_RandomAccessIter>::value_type, + typename iterator_traits<_RandomAccessIter>::value_type); + return __is_heap(__first, __comp, __last - __first); +} + +// is_sorted, a predicated testing whether a range is sorted in +// nondescending order. This is an extension, not part of the C++ +// standard. + +template +bool is_sorted(_ForwardIter __first, _ForwardIter __last) +{ + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type, + _LessThanComparable); + if (__first == __last) + return true; + + _ForwardIter __next = __first; + for (++__next; __next != __last; __first = __next, ++__next) { + if (*__next < *__first) + return false; + } + + return true; +} + +template +bool is_sorted(_ForwardIter __first, _ForwardIter __last, + _StrictWeakOrdering __comp) +{ + __STL_REQUIRES(_ForwardIter, _ForwardIterator); + __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool, + typename iterator_traits<_ForwardIter>::value_type, + typename iterator_traits<_ForwardIter>::value_type); + if (__first == __last) + return true; + + _ForwardIter __next = __first; + for (++__next; __next != __last; __first = __next, ++__next) { + if (__comp(*__next, *__first)) + return false; + } + + return true; +} + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1209 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_ALGO_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_algobase.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_algobase.h new file mode 100644 index 0000000..35ed7ec --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_algobase.h @@ -0,0 +1,696 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996-1998 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + + +#ifndef __SGI_STL_INTERNAL_ALGOBASE_H +#define __SGI_STL_INTERNAL_ALGOBASE_H + +#ifndef __STL_CONFIG_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_RELOPS +#include +#endif +#ifndef __SGI_STL_INTERNAL_PAIR_H +#include +#endif +#ifndef __TYPE_TRAITS_H +#include +#endif + +#include +#include +#include +#include +#include + +#ifdef __STL_USE_NEW_IOSTREAMS +#include +#else /* __STL_USE_NEW_IOSTREAMS */ +#include +#endif /* __STL_USE_NEW_IOSTREAMS */ + +#ifndef __SGI_STL_INTERNAL_ITERATOR_H +#include +#include +#endif + +// We pick up concept_checks.h from stl_iterator_base.h. + +__STL_BEGIN_NAMESPACE + +// swap and iter_swap + +template +inline void __iter_swap(_ForwardIter1 __a, _ForwardIter2 __b, _Tp*) { + _Tp __tmp = *__a; + *__a = *__b; + *__b = __tmp; +} + +template +inline void iter_swap(_ForwardIter1 __a, _ForwardIter2 __b) { + __STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator); + __STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator); + __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type, + typename iterator_traits<_ForwardIter2>::value_type); + __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type, + typename iterator_traits<_ForwardIter1>::value_type); + __iter_swap(__a, __b, __VALUE_TYPE(__a)); +} + +template +inline void swap(_Tp& __a, _Tp& __b) { + __STL_REQUIRES(_Tp, _Assignable); + _Tp __tmp = __a; + __a = __b; + __b = __tmp; +} + +//-------------------------------------------------- +// min and max + +#if !defined(__BORLANDC__) || __BORLANDC__ >= 0x540 /* C++ Builder 4.0 */ + +#undef min +#undef max + +template +inline const _Tp& min(const _Tp& __a, const _Tp& __b) { + __STL_REQUIRES(_Tp, _LessThanComparable); + return __b < __a ? __b : __a; +} + +template +inline const _Tp& max(const _Tp& __a, const _Tp& __b) { + __STL_REQUIRES(_Tp, _LessThanComparable); + return __a < __b ? __b : __a; +} + +#endif /* __BORLANDC__ */ + +template +inline const _Tp& min(const _Tp& __a, const _Tp& __b, _Compare __comp) { + return __comp(__b, __a) ? __b : __a; +} + +template +inline const _Tp& max(const _Tp& __a, const _Tp& __b, _Compare __comp) { + return __comp(__a, __b) ? __b : __a; +} + +//-------------------------------------------------- +// copy + +// All of these auxiliary functions serve two purposes. (1) Replace +// calls to copy with memmove whenever possible. (Memmove, not memcpy, +// because the input and output ranges are permitted to overlap.) +// (2) If we're using random access iterators, then write the loop as +// a for loop with an explicit count. + +template +inline _OutputIter __copy(_InputIter __first, _InputIter __last, + _OutputIter __result, + input_iterator_tag, _Distance*) +{ + for ( ; __first != __last; ++__result, ++__first) + *__result = *__first; + return __result; +} + +template +inline _OutputIter +__copy(_RandomAccessIter __first, _RandomAccessIter __last, + _OutputIter __result, random_access_iterator_tag, _Distance*) +{ + for (_Distance __n = __last - __first; __n > 0; --__n) { + *__result = *__first; + ++__first; + ++__result; + } + return __result; +} + +template +inline _Tp* +__copy_trivial(const _Tp* __first, const _Tp* __last, _Tp* __result) { + memmove(__result, __first, sizeof(_Tp) * (__last - __first)); + return __result + (__last - __first); +} + +#if defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) + +template +inline _OutputIter __copy_aux2(_InputIter __first, _InputIter __last, + _OutputIter __result, __false_type) { + return __copy(__first, __last, __result, + __ITERATOR_CATEGORY(__first), + __DISTANCE_TYPE(__first)); +} + +template +inline _OutputIter __copy_aux2(_InputIter __first, _InputIter __last, + _OutputIter __result, __true_type) { + return __copy(__first, __last, __result, + __ITERATOR_CATEGORY(__first), + __DISTANCE_TYPE(__first)); +} + +#ifndef __USLC__ + +template +inline _Tp* __copy_aux2(_Tp* __first, _Tp* __last, _Tp* __result, + __true_type) { + return __copy_trivial(__first, __last, __result); +} + +#endif /* __USLC__ */ + +template +inline _Tp* __copy_aux2(const _Tp* __first, const _Tp* __last, _Tp* __result, + __true_type) { + return __copy_trivial(__first, __last, __result); +} + + +template +inline _OutputIter __copy_aux(_InputIter __first, _InputIter __last, + _OutputIter __result, _Tp*) { + typedef typename __type_traits<_Tp>::has_trivial_assignment_operator + _Trivial; + return __copy_aux2(__first, __last, __result, _Trivial()); +} + +template +inline _OutputIter copy(_InputIter __first, _InputIter __last, + _OutputIter __result) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + return __copy_aux(__first, __last, __result, __VALUE_TYPE(__first)); +} + +// Hack for compilers that don't have partial ordering of function templates +// but do have partial specialization of class templates. +#elif defined(__STL_CLASS_PARTIAL_SPECIALIZATION) + +template +struct __copy_dispatch { + static _OutputIter copy(_InputIter __first, _InputIter __last, + _OutputIter __result) { + typedef typename iterator_traits<_InputIter>::iterator_category _Category; + typedef typename iterator_traits<_InputIter>::difference_type _Distance; + return __copy(__first, __last, __result, _Category(), (_Distance*) 0); + } +}; + +template +struct __copy_dispatch<_Tp*, _Tp*, __true_type> +{ + static _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) { + return __copy_trivial(__first, __last, __result); + } +}; + +template +struct __copy_dispatch +{ + static _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) { + return __copy_trivial(__first, __last, __result); + } +}; + +template +inline _OutputIter copy(_InputIter __first, _InputIter __last, + _OutputIter __result) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + typedef typename iterator_traits<_InputIter>::value_type _Tp; + typedef typename __type_traits<_Tp>::has_trivial_assignment_operator + _Trivial; + return __copy_dispatch<_InputIter, _OutputIter, _Trivial> + ::copy(__first, __last, __result); +} + +// Fallback for compilers with neither partial ordering nor partial +// specialization. Define the faster version for the basic builtin +// types. +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline _OutputIter copy(_InputIter __first, _InputIter __last, + _OutputIter __result) +{ + return __copy(__first, __last, __result, + __ITERATOR_CATEGORY(__first), + __DISTANCE_TYPE(__first)); +} + +#define __SGI_STL_DECLARE_COPY_TRIVIAL(_Tp) \ + inline _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) { \ + memmove(__result, __first, sizeof(_Tp) * (__last - __first)); \ + return __result + (__last - __first); \ + } + +__SGI_STL_DECLARE_COPY_TRIVIAL(char) +__SGI_STL_DECLARE_COPY_TRIVIAL(signed char) +__SGI_STL_DECLARE_COPY_TRIVIAL(unsigned char) +__SGI_STL_DECLARE_COPY_TRIVIAL(short) +__SGI_STL_DECLARE_COPY_TRIVIAL(unsigned short) +__SGI_STL_DECLARE_COPY_TRIVIAL(int) +__SGI_STL_DECLARE_COPY_TRIVIAL(unsigned int) +__SGI_STL_DECLARE_COPY_TRIVIAL(long) +__SGI_STL_DECLARE_COPY_TRIVIAL(unsigned long) +#ifdef __STL_HAS_WCHAR_T +__SGI_STL_DECLARE_COPY_TRIVIAL(wchar_t) +#endif +#ifdef _STL_LONG_LONG +__SGI_STL_DECLARE_COPY_TRIVIAL(long long) +__SGI_STL_DECLARE_COPY_TRIVIAL(unsigned long long) +#endif +__SGI_STL_DECLARE_COPY_TRIVIAL(float) +__SGI_STL_DECLARE_COPY_TRIVIAL(double) +__SGI_STL_DECLARE_COPY_TRIVIAL(long double) + +#undef __SGI_STL_DECLARE_COPY_TRIVIAL +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +//-------------------------------------------------- +// copy_backward + +template +inline _BidirectionalIter2 __copy_backward(_BidirectionalIter1 __first, + _BidirectionalIter1 __last, + _BidirectionalIter2 __result, + bidirectional_iterator_tag, + _Distance*) +{ + while (__first != __last) + *--__result = *--__last; + return __result; +} + +template +inline _BidirectionalIter __copy_backward(_RandomAccessIter __first, + _RandomAccessIter __last, + _BidirectionalIter __result, + random_access_iterator_tag, + _Distance*) +{ + for (_Distance __n = __last - __first; __n > 0; --__n) + *--__result = *--__last; + return __result; +} + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +// This dispatch class is a workaround for compilers that do not +// have partial ordering of function templates. All we're doing is +// creating a specialization so that we can turn a call to copy_backward +// into a memmove whenever possible. + +template +struct __copy_backward_dispatch +{ + typedef typename iterator_traits<_BidirectionalIter1>::iterator_category + _Cat; + typedef typename iterator_traits<_BidirectionalIter1>::difference_type + _Distance; + + static _BidirectionalIter2 copy(_BidirectionalIter1 __first, + _BidirectionalIter1 __last, + _BidirectionalIter2 __result) { + return __copy_backward(__first, __last, __result, _Cat(), (_Distance*) 0); + } +}; + +template +struct __copy_backward_dispatch<_Tp*, _Tp*, __true_type> +{ + static _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) { + const ptrdiff_t _Num = __last - __first; + memmove(__result - _Num, __first, sizeof(_Tp) * _Num); + return __result - _Num; + } +}; + +template +struct __copy_backward_dispatch +{ + static _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) { + return __copy_backward_dispatch<_Tp*, _Tp*, __true_type> + ::copy(__first, __last, __result); + } +}; + +template +inline _BI2 copy_backward(_BI1 __first, _BI1 __last, _BI2 __result) { + __STL_REQUIRES(_BI1, _BidirectionalIterator); + __STL_REQUIRES(_BI2, _Mutable_BidirectionalIterator); + __STL_CONVERTIBLE(typename iterator_traits<_BI1>::value_type, + typename iterator_traits<_BI2>::value_type); + typedef typename __type_traits::value_type> + ::has_trivial_assignment_operator + _Trivial; + return __copy_backward_dispatch<_BI1, _BI2, _Trivial> + ::copy(__first, __last, __result); +} + +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline _BI2 copy_backward(_BI1 __first, _BI1 __last, _BI2 __result) { + return __copy_backward(__first, __last, __result, + __ITERATOR_CATEGORY(__first), + __DISTANCE_TYPE(__first)); +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +//-------------------------------------------------- +// copy_n (not part of the C++ standard) + +template +pair<_InputIter, _OutputIter> __copy_n(_InputIter __first, _Size __count, + _OutputIter __result, + input_iterator_tag) { + for ( ; __count > 0; --__count) { + *__result = *__first; + ++__first; + ++__result; + } + return pair<_InputIter, _OutputIter>(__first, __result); +} + +template +inline pair<_RAIter, _OutputIter> +__copy_n(_RAIter __first, _Size __count, + _OutputIter __result, + random_access_iterator_tag) { + _RAIter __last = __first + __count; + return pair<_RAIter, _OutputIter>(__last, copy(__first, __last, __result)); +} + +template +inline pair<_InputIter, _OutputIter> +__copy_n(_InputIter __first, _Size __count, _OutputIter __result) { + return __copy_n(__first, __count, __result, + __ITERATOR_CATEGORY(__first)); +} + +template +inline pair<_InputIter, _OutputIter> +copy_n(_InputIter __first, _Size __count, _OutputIter __result) { + __STL_REQUIRES(_InputIter, _InputIterator); + __STL_REQUIRES(_OutputIter, _OutputIterator); + return __copy_n(__first, __count, __result); +} + +//-------------------------------------------------- +// fill and fill_n + + +template +void fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value) { + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + for ( ; __first != __last; ++__first) + *__first = __value; +} + +template +_OutputIter fill_n(_OutputIter __first, _Size __n, const _Tp& __value) { + __STL_REQUIRES(_OutputIter, _OutputIterator); + for ( ; __n > 0; --__n, ++__first) + *__first = __value; + return __first; +} + +// Specialization: for one-byte types we can use memset. + +inline void fill(unsigned char* __first, unsigned char* __last, + const unsigned char& __c) { + unsigned char __tmp = __c; + memset(__first, __tmp, __last - __first); +} + +inline void fill(signed char* __first, signed char* __last, + const signed char& __c) { + signed char __tmp = __c; + memset(__first, static_cast(__tmp), __last - __first); +} + +inline void fill(char* __first, char* __last, const char& __c) { + char __tmp = __c; + memset(__first, static_cast(__tmp), __last - __first); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline unsigned char* fill_n(unsigned char* __first, _Size __n, + const unsigned char& __c) { + fill(__first, __first + __n, __c); + return __first + __n; +} + +template +inline signed char* fill_n(char* __first, _Size __n, + const signed char& __c) { + fill(__first, __first + __n, __c); + return __first + __n; +} + +template +inline char* fill_n(char* __first, _Size __n, const char& __c) { + fill(__first, __first + __n, __c); + return __first + __n; +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +//-------------------------------------------------- +// equal and mismatch + +template +pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1, + _InputIter1 __last1, + _InputIter2 __first2) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _EqualityComparable); + __STL_REQUIRES(typename iterator_traits<_InputIter2>::value_type, + _EqualityComparable); + while (__first1 != __last1 && *__first1 == *__first2) { + ++__first1; + ++__first2; + } + return pair<_InputIter1, _InputIter2>(__first1, __first2); +} + +template +pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1, + _InputIter1 __last1, + _InputIter2 __first2, + _BinaryPredicate __binary_pred) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) { + ++__first1; + ++__first2; + } + return pair<_InputIter1, _InputIter2>(__first1, __first2); +} + +template +inline bool equal(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _EqualityComparable); + __STL_REQUIRES(typename iterator_traits<_InputIter2>::value_type, + _EqualityComparable); + for ( ; __first1 != __last1; ++__first1, ++__first2) + if (*__first1 != *__first2) + return false; + return true; +} + +template +inline bool equal(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _BinaryPredicate __binary_pred) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + for ( ; __first1 != __last1; ++__first1, ++__first2) + if (!__binary_pred(*__first1, *__first2)) + return false; + return true; +} + +//-------------------------------------------------- +// lexicographical_compare and lexicographical_compare_3way. +// (the latter is not part of the C++ standard.) + +template +bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _LessThanComparable); + __STL_REQUIRES(typename iterator_traits<_InputIter2>::value_type, + _LessThanComparable); + for ( ; __first1 != __last1 && __first2 != __last2 + ; ++__first1, ++__first2) { + if (*__first1 < *__first2) + return true; + if (*__first2 < *__first1) + return false; + } + return __first1 == __last1 && __first2 != __last2; +} + +template +bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _Compare __comp) { + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + for ( ; __first1 != __last1 && __first2 != __last2 + ; ++__first1, ++__first2) { + if (__comp(*__first1, *__first2)) + return true; + if (__comp(*__first2, *__first1)) + return false; + } + return __first1 == __last1 && __first2 != __last2; +} + +inline bool +lexicographical_compare(const unsigned char* __first1, + const unsigned char* __last1, + const unsigned char* __first2, + const unsigned char* __last2) +{ + const size_t __len1 = __last1 - __first1; + const size_t __len2 = __last2 - __first2; + const int __result = memcmp(__first1, __first2, min(__len1, __len2)); + return __result != 0 ? __result < 0 : __len1 < __len2; +} + +inline bool lexicographical_compare(const char* __first1, const char* __last1, + const char* __first2, const char* __last2) +{ +#if CHAR_MAX == SCHAR_MAX + return lexicographical_compare((const signed char*) __first1, + (const signed char*) __last1, + (const signed char*) __first2, + (const signed char*) __last2); +#else /* CHAR_MAX == SCHAR_MAX */ + return lexicographical_compare((const unsigned char*) __first1, + (const unsigned char*) __last1, + (const unsigned char*) __first2, + (const unsigned char*) __last2); +#endif /* CHAR_MAX == SCHAR_MAX */ +} + +template +int __lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2) +{ + while (__first1 != __last1 && __first2 != __last2) { + if (*__first1 < *__first2) + return -1; + if (*__first2 < *__first1) + return 1; + ++__first1; + ++__first2; + } + if (__first2 == __last2) { + return !(__first1 == __last1); + } + else { + return -1; + } +} + +inline int +__lexicographical_compare_3way(const unsigned char* __first1, + const unsigned char* __last1, + const unsigned char* __first2, + const unsigned char* __last2) +{ + const ptrdiff_t __len1 = __last1 - __first1; + const ptrdiff_t __len2 = __last2 - __first2; + const int __result = memcmp(__first1, __first2, min(__len1, __len2)); + return __result != 0 ? __result + : (__len1 == __len2 ? 0 : (__len1 < __len2 ? -1 : 1)); +} + +inline int +__lexicographical_compare_3way(const char* __first1, const char* __last1, + const char* __first2, const char* __last2) +{ +#if CHAR_MAX == SCHAR_MAX + return __lexicographical_compare_3way( + (const signed char*) __first1, + (const signed char*) __last1, + (const signed char*) __first2, + (const signed char*) __last2); +#else + return __lexicographical_compare_3way((const unsigned char*) __first1, + (const unsigned char*) __last1, + (const unsigned char*) __first2, + (const unsigned char*) __last2); +#endif +} + +template +int lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2) +{ + __STL_REQUIRES(_InputIter1, _InputIterator); + __STL_REQUIRES(_InputIter2, _InputIterator); + __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type, + _LessThanComparable); + __STL_REQUIRES(typename iterator_traits<_InputIter2>::value_type, + _LessThanComparable); + return __lexicographical_compare_3way(__first1, __last1, __first2, __last2); +} + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_ALGOBASE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_alloc.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_alloc.h new file mode 100644 index 0000000..e96122a --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_alloc.h @@ -0,0 +1,897 @@ +/* + * Copyright (c) 1996-1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_ALLOC_H +#define __SGI_STL_INTERNAL_ALLOC_H + +#ifdef __SUNPRO_CC +# define __PRIVATE public + // Extra access restrictions prevent us from really making some things + // private. +#else +# define __PRIVATE private +#endif + +#ifdef __STL_STATIC_TEMPLATE_MEMBER_BUG +# define __USE_MALLOC +#endif + + +// This implements some standard node allocators. These are +// NOT the same as the allocators in the C++ draft standard or in +// in the original STL. They do not encapsulate different pointer +// types; indeed we assume that there is only one pointer type. +// The allocation primitives are intended to allocate individual objects, +// not larger arenas as with the original STL allocators. + +#ifndef __THROW_BAD_ALLOC +# if defined(__STL_NO_BAD_ALLOC) || !defined(__STL_USE_EXCEPTIONS) +# include +# include +# define __THROW_BAD_ALLOC fprintf(stderr, "out of memory\n"); exit(1) +# else /* Standard conforming out-of-memory handling */ +# include +# define __THROW_BAD_ALLOC throw std::bad_alloc() +# endif +#endif + +#include +#include +#include +#include +#ifndef __RESTRICT +# define __RESTRICT +#endif + +#ifdef __STL_THREADS +# include +# define __NODE_ALLOCATOR_THREADS true +# ifdef __STL_SGI_THREADS + // We test whether threads are in use before locking. + // Perhaps this should be moved into stl_threads.h, but that + // probably makes it harder to avoid the procedure call when + // it isn't needed. + extern "C" { + extern int __us_rsthread_malloc; + } + // The above is copied from malloc.h. Including + // would be cleaner but fails with certain levels of standard + // conformance. +# define __NODE_ALLOCATOR_LOCK if (threads && __us_rsthread_malloc) \ + { _S_node_allocator_lock._M_acquire_lock(); } +# define __NODE_ALLOCATOR_UNLOCK if (threads && __us_rsthread_malloc) \ + { _S_node_allocator_lock._M_release_lock(); } +# else /* !__STL_SGI_THREADS */ +# define __NODE_ALLOCATOR_LOCK \ + { if (threads) _S_node_allocator_lock._M_acquire_lock(); } +# define __NODE_ALLOCATOR_UNLOCK \ + { if (threads) _S_node_allocator_lock._M_release_lock(); } +# endif +#else +// Thread-unsafe +# define __NODE_ALLOCATOR_LOCK +# define __NODE_ALLOCATOR_UNLOCK +# define __NODE_ALLOCATOR_THREADS false +#endif + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#endif + +// Malloc-based allocator. Typically slower than default alloc below. +// Typically thread-safe and more storage efficient. +#ifdef __STL_STATIC_TEMPLATE_MEMBER_BUG +# ifdef __DECLARE_GLOBALS_HERE + void (* __malloc_alloc_oom_handler)() = 0; + // g++ 2.7.2 does not handle static template data members. +# else + extern void (* __malloc_alloc_oom_handler)(); +# endif +#endif + +template +class __malloc_alloc_template { + +private: + + static void* _S_oom_malloc(size_t); + static void* _S_oom_realloc(void*, size_t); + +#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG + static void (* __malloc_alloc_oom_handler)(); +#endif + +public: + + static void* allocate(size_t __n) + { + void* __result = malloc(__n); + if (0 == __result) __result = _S_oom_malloc(__n); + return __result; + } + + static void deallocate(void* __p, size_t /* __n */) + { + free(__p); + } + + static void* reallocate(void* __p, size_t /* old_sz */, size_t __new_sz) + { + void* __result = realloc(__p, __new_sz); + if (0 == __result) __result = _S_oom_realloc(__p, __new_sz); + return __result; + } + + static void (* __set_malloc_handler(void (*__f)()))() + { + void (* __old)() = __malloc_alloc_oom_handler; + __malloc_alloc_oom_handler = __f; + return(__old); + } + +}; + +// malloc_alloc out-of-memory handling + +#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG +template +void (* __malloc_alloc_template<__inst>::__malloc_alloc_oom_handler)() = 0; +#endif + +template +void* +__malloc_alloc_template<__inst>::_S_oom_malloc(size_t __n) +{ + void (* __my_malloc_handler)(); + void* __result; + + for (;;) { + __my_malloc_handler = __malloc_alloc_oom_handler; + if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; } + (*__my_malloc_handler)(); + __result = malloc(__n); + if (__result) return(__result); + } +} + +template +void* __malloc_alloc_template<__inst>::_S_oom_realloc(void* __p, size_t __n) +{ + void (* __my_malloc_handler)(); + void* __result; + + for (;;) { + __my_malloc_handler = __malloc_alloc_oom_handler; + if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; } + (*__my_malloc_handler)(); + __result = realloc(__p, __n); + if (__result) return(__result); + } +} + +typedef __malloc_alloc_template<0> malloc_alloc; + +template +class simple_alloc { + +public: + static _Tp* allocate(size_t __n) + { return 0 == __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); } + static _Tp* allocate(void) + { return (_Tp*) _Alloc::allocate(sizeof (_Tp)); } + static void deallocate(_Tp* __p, size_t __n) + { if (0 != __n) _Alloc::deallocate(__p, __n * sizeof (_Tp)); } + static void deallocate(_Tp* __p) + { _Alloc::deallocate(__p, sizeof (_Tp)); } +}; + +// Allocator adaptor to check size arguments for debugging. +// Reports errors using assert. Checking can be disabled with +// NDEBUG, but it's far better to just use the underlying allocator +// instead when no checking is desired. +// There is some evidence that this can confuse Purify. +template +class debug_alloc { + +private: + + enum {_S_extra = 8}; // Size of space used to store size. Note + // that this must be large enough to preserve + // alignment. + +public: + + static void* allocate(size_t __n) + { + char* __result = (char*)_Alloc::allocate(__n + (int) _S_extra); + *(size_t*)__result = __n; + return __result + (int) _S_extra; + } + + static void deallocate(void* __p, size_t __n) + { + char* __real_p = (char*)__p - (int) _S_extra; + assert(*(size_t*)__real_p == __n); + _Alloc::deallocate(__real_p, __n + (int) _S_extra); + } + + static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz) + { + char* __real_p = (char*)__p - (int) _S_extra; + assert(*(size_t*)__real_p == __old_sz); + char* __result = (char*) + _Alloc::reallocate(__real_p, __old_sz + (int) _S_extra, + __new_sz + (int) _S_extra); + *(size_t*)__result = __new_sz; + return __result + (int) _S_extra; + } + +}; + + +# ifdef __USE_MALLOC + +typedef malloc_alloc alloc; +typedef malloc_alloc single_client_alloc; + +# else + + +// Default node allocator. +// With a reasonable compiler, this should be roughly as fast as the +// original STL class-specific allocators, but with less fragmentation. +// Default_alloc_template parameters are experimental and MAY +// DISAPPEAR in the future. Clients should just use alloc for now. +// +// Important implementation properties: +// 1. If the client request an object of size > _MAX_BYTES, the resulting +// object will be obtained directly from malloc. +// 2. In all other cases, we allocate an object of size exactly +// _S_round_up(requested_size). Thus the client has enough size +// information that we can return the object to the proper free list +// without permanently losing part of the object. +// + +// The first template parameter specifies whether more than one thread +// may use this allocator. It is safe to allocate an object from +// one instance of a default_alloc and deallocate it with another +// one. This effectively transfers its ownership to the second one. +// This may have undesirable effects on reference locality. +// The second parameter is unreferenced and serves only to allow the +// creation of multiple default_alloc instances. +// Node that containers built on different allocator instances have +// different types, limiting the utility of this approach. + +#if defined(__SUNPRO_CC) || defined(__GNUC__) +// breaks if we make these template class members: + enum {_ALIGN = 8}; + enum {_MAX_BYTES = 128}; + enum {_NFREELISTS = 16}; // _MAX_BYTES/_ALIGN +#endif + +template +class __default_alloc_template { + +private: + // Really we should use static const int x = N + // instead of enum { x = N }, but few compilers accept the former. +#if ! (defined(__SUNPRO_CC) || defined(__GNUC__)) + enum {_ALIGN = 8}; + enum {_MAX_BYTES = 128}; + enum {_NFREELISTS = 16}; // _MAX_BYTES/_ALIGN +# endif + static size_t + _S_round_up(size_t __bytes) + { return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)); } + +__PRIVATE: + union _Obj { + union _Obj* _M_free_list_link; + char _M_client_data[1]; /* The client sees this. */ + }; +private: +# if defined(__SUNPRO_CC) || defined(__GNUC__) || defined(__HP_aCC) + static _Obj* __STL_VOLATILE _S_free_list[]; + // Specifying a size results in duplicate def for 4.1 +# else + static _Obj* __STL_VOLATILE _S_free_list[_NFREELISTS]; +# endif + static size_t _S_freelist_index(size_t __bytes) { + return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1); + } + + // Returns an object of size __n, and optionally adds to size __n free list. + static void* _S_refill(size_t __n); + // Allocates a chunk for nobjs of size size. nobjs may be reduced + // if it is inconvenient to allocate the requested number. + static char* _S_chunk_alloc(size_t __size, int& __nobjs); + + // Chunk allocation state. + static char* _S_start_free; + static char* _S_end_free; + static size_t _S_heap_size; + +# ifdef __STL_THREADS + static _STL_mutex_lock _S_node_allocator_lock; +# endif + + // It would be nice to use _STL_auto_lock here. But we + // don't need the NULL check. And we do need a test whether + // threads have actually been started. + class _Lock; + friend class _Lock; + class _Lock { + public: + _Lock() { __NODE_ALLOCATOR_LOCK; } + ~_Lock() { __NODE_ALLOCATOR_UNLOCK; } + }; + +public: + + /* __n must be > 0 */ + static void* allocate(size_t __n) + { + void* __ret = 0; + + if (__n > (size_t) _MAX_BYTES) { + __ret = malloc_alloc::allocate(__n); + } + else { + _Obj* __STL_VOLATILE* __my_free_list + = _S_free_list + _S_freelist_index(__n); + // Acquire the lock here with a constructor call. + // This ensures that it is released in exit or during stack + // unwinding. +# ifndef _NOTHREADS + /*REFERENCED*/ + _Lock __lock_instance; +# endif + _Obj* __RESTRICT __result = *__my_free_list; + if (__result == 0) + __ret = _S_refill(_S_round_up(__n)); + else { + *__my_free_list = __result -> _M_free_list_link; + __ret = __result; + } + } + + return __ret; + }; + + /* __p may not be 0 */ + static void deallocate(void* __p, size_t __n) + { + if (__n > (size_t) _MAX_BYTES) + malloc_alloc::deallocate(__p, __n); + else { + _Obj* __STL_VOLATILE* __my_free_list + = _S_free_list + _S_freelist_index(__n); + _Obj* __q = (_Obj*)__p; + + // acquire lock +# ifndef _NOTHREADS + /*REFERENCED*/ + _Lock __lock_instance; +# endif /* _NOTHREADS */ + __q -> _M_free_list_link = *__my_free_list; + *__my_free_list = __q; + // lock is released here + } + } + + static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz); + +} ; + +typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc; +typedef __default_alloc_template single_client_alloc; + +template +inline bool operator==(const __default_alloc_template<__threads, __inst>&, + const __default_alloc_template<__threads, __inst>&) +{ + return true; +} + +# ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER +template +inline bool operator!=(const __default_alloc_template<__threads, __inst>&, + const __default_alloc_template<__threads, __inst>&) +{ + return false; +} +# endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + + + +/* We allocate memory in large chunks in order to avoid fragmenting */ +/* the malloc heap too much. */ +/* We assume that size is properly aligned. */ +/* We hold the allocation lock. */ +template +char* +__default_alloc_template<__threads, __inst>::_S_chunk_alloc(size_t __size, + int& __nobjs) +{ + char* __result; + size_t __total_bytes = __size * __nobjs; + size_t __bytes_left = _S_end_free - _S_start_free; + + if (__bytes_left >= __total_bytes) { + __result = _S_start_free; + _S_start_free += __total_bytes; + return(__result); + } else if (__bytes_left >= __size) { + __nobjs = (int)(__bytes_left/__size); + __total_bytes = __size * __nobjs; + __result = _S_start_free; + _S_start_free += __total_bytes; + return(__result); + } else { + size_t __bytes_to_get = + 2 * __total_bytes + _S_round_up(_S_heap_size >> 4); + // Try to make use of the left-over piece. + if (__bytes_left > 0) { + _Obj* __STL_VOLATILE* __my_free_list = + _S_free_list + _S_freelist_index(__bytes_left); + + ((_Obj*)_S_start_free) -> _M_free_list_link = *__my_free_list; + *__my_free_list = (_Obj*)_S_start_free; + } + _S_start_free = (char*)malloc(__bytes_to_get); + if (0 == _S_start_free) { + size_t __i; + _Obj* __STL_VOLATILE* __my_free_list; + _Obj* __p; + // Try to make do with what we have. That can't + // hurt. We do not try smaller requests, since that tends + // to result in disaster on multi-process machines. + for (__i = __size; + __i <= (size_t) _MAX_BYTES; + __i += (size_t) _ALIGN) { + __my_free_list = _S_free_list + _S_freelist_index(__i); + __p = *__my_free_list; + if (0 != __p) { + *__my_free_list = __p -> _M_free_list_link; + _S_start_free = (char*)__p; + _S_end_free = _S_start_free + __i; + return(_S_chunk_alloc(__size, __nobjs)); + // Any leftover piece will eventually make it to the + // right free list. + } + } + _S_end_free = 0; // In case of exception. + _S_start_free = (char*)malloc_alloc::allocate(__bytes_to_get); + // This should either throw an + // exception or remedy the situation. Thus we assume it + // succeeded. + } + _S_heap_size += __bytes_to_get; + _S_end_free = _S_start_free + __bytes_to_get; + return(_S_chunk_alloc(__size, __nobjs)); + } +} + + +/* Returns an object of size __n, and optionally adds to size __n free list.*/ +/* We assume that __n is properly aligned. */ +/* We hold the allocation lock. */ +template +void* +__default_alloc_template<__threads, __inst>::_S_refill(size_t __n) +{ + int __nobjs = 20; + char* __chunk = _S_chunk_alloc(__n, __nobjs); + _Obj* __STL_VOLATILE* __my_free_list; + _Obj* __result; + _Obj* __current_obj; + _Obj* __next_obj; + int __i; + + if (1 == __nobjs) return(__chunk); + __my_free_list = _S_free_list + _S_freelist_index(__n); + + /* Build free list in chunk */ + __result = (_Obj*)__chunk; + *__my_free_list = __next_obj = (_Obj*)(__chunk + __n); + for (__i = 1; ; __i++) { + __current_obj = __next_obj; + __next_obj = (_Obj*)((char*)__next_obj + __n); + if (__nobjs - 1 == __i) { + __current_obj -> _M_free_list_link = 0; + break; + } else { + __current_obj -> _M_free_list_link = __next_obj; + } + } + return(__result); +} + +template +void* +__default_alloc_template::reallocate(void* __p, + size_t __old_sz, + size_t __new_sz) +{ + void* __result; + size_t __copy_sz; + + if (__old_sz > (size_t) _MAX_BYTES && __new_sz > (size_t) _MAX_BYTES) { + return(realloc(__p, __new_sz)); + } + if (_S_round_up(__old_sz) == _S_round_up(__new_sz)) return(__p); + __result = allocate(__new_sz); + __copy_sz = __new_sz > __old_sz? __old_sz : __new_sz; + memcpy(__result, __p, __copy_sz); + deallocate(__p, __old_sz); + return(__result); +} + +#ifdef __STL_THREADS + template + _STL_mutex_lock + __default_alloc_template<__threads, __inst>::_S_node_allocator_lock + __STL_MUTEX_INITIALIZER; +#endif + + +template +char* __default_alloc_template<__threads, __inst>::_S_start_free = 0; + +template +char* __default_alloc_template<__threads, __inst>::_S_end_free = 0; + +template +size_t __default_alloc_template<__threads, __inst>::_S_heap_size = 0; + +template +typename __default_alloc_template<__threads, __inst>::_Obj* __STL_VOLATILE +__default_alloc_template<__threads, __inst> ::_S_free_list[ +# if defined(__SUNPRO_CC) || defined(__GNUC__) || defined(__HP_aCC) + _NFREELISTS +# else + __default_alloc_template<__threads, __inst>::_NFREELISTS +# endif +] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +// The 16 zeros are necessary to make version 4.1 of the SunPro +// compiler happy. Otherwise it appears to allocate too little +// space for the array. + +#endif /* ! __USE_MALLOC */ + +// This implements allocators as specified in the C++ standard. +// +// Note that standard-conforming allocators use many language features +// that are not yet widely implemented. In particular, they rely on +// member templates, partial specialization, partial ordering of function +// templates, the typename keyword, and the use of the template keyword +// to refer to a template member of a dependent type. + +#ifdef __STL_USE_STD_ALLOCATORS + +template +class allocator { + typedef alloc _Alloc; // The underlying allocator. +public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + template struct rebind { + typedef allocator<_Tp1> other; + }; + + allocator() __STL_NOTHROW {} + allocator(const allocator&) __STL_NOTHROW {} + template allocator(const allocator<_Tp1>&) __STL_NOTHROW {} + ~allocator() __STL_NOTHROW {} + + pointer address(reference __x) const { return &__x; } + const_pointer address(const_reference __x) const { return &__x; } + + // __n is permitted to be 0. The C++ standard says nothing about what + // the return value is when __n == 0. + _Tp* allocate(size_type __n, const void* = 0) { + return __n != 0 ? static_cast<_Tp*>(_Alloc::allocate(__n * sizeof(_Tp))) + : 0; + } + + // __p is not permitted to be a null pointer. + void deallocate(pointer __p, size_type __n) + { _Alloc::deallocate(__p, __n * sizeof(_Tp)); } + + size_type max_size() const __STL_NOTHROW + { return size_t(-1) / sizeof(_Tp); } + + void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); } + void destroy(pointer __p) { __p->~_Tp(); } +}; + +template<> +class allocator { +public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef void* pointer; + typedef const void* const_pointer; + typedef void value_type; + + template struct rebind { + typedef allocator<_Tp1> other; + }; +}; + + +template +inline bool operator==(const allocator<_T1>&, const allocator<_T2>&) +{ + return true; +} + +template +inline bool operator!=(const allocator<_T1>&, const allocator<_T2>&) +{ + return false; +} + +// Allocator adaptor to turn an SGI-style allocator (e.g. alloc, malloc_alloc) +// into a standard-conforming allocator. Note that this adaptor does +// *not* assume that all objects of the underlying alloc class are +// identical, nor does it assume that all of the underlying alloc's +// member functions are static member functions. Note, also, that +// __allocator<_Tp, alloc> is essentially the same thing as allocator<_Tp>. + +template +struct __allocator { + _Alloc __underlying_alloc; + + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + template struct rebind { + typedef __allocator<_Tp1, _Alloc> other; + }; + + __allocator() __STL_NOTHROW {} + __allocator(const __allocator& __a) __STL_NOTHROW + : __underlying_alloc(__a.__underlying_alloc) {} + template + __allocator(const __allocator<_Tp1, _Alloc>& __a) __STL_NOTHROW + : __underlying_alloc(__a.__underlying_alloc) {} + ~__allocator() __STL_NOTHROW {} + + pointer address(reference __x) const { return &__x; } + const_pointer address(const_reference __x) const { return &__x; } + + // __n is permitted to be 0. + _Tp* allocate(size_type __n, const void* = 0) { + return __n != 0 + ? static_cast<_Tp*>(__underlying_alloc.allocate(__n * sizeof(_Tp))) + : 0; + } + + // __p is not permitted to be a null pointer. + void deallocate(pointer __p, size_type __n) + { __underlying_alloc.deallocate(__p, __n * sizeof(_Tp)); } + + size_type max_size() const __STL_NOTHROW + { return size_t(-1) / sizeof(_Tp); } + + void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); } + void destroy(pointer __p) { __p->~_Tp(); } +}; + +template +class __allocator { + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef void* pointer; + typedef const void* const_pointer; + typedef void value_type; + + template struct rebind { + typedef __allocator<_Tp1, _Alloc> other; + }; +}; + +template +inline bool operator==(const __allocator<_Tp, _Alloc>& __a1, + const __allocator<_Tp, _Alloc>& __a2) +{ + return __a1.__underlying_alloc == __a2.__underlying_alloc; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER +template +inline bool operator!=(const __allocator<_Tp, _Alloc>& __a1, + const __allocator<_Tp, _Alloc>& __a2) +{ + return __a1.__underlying_alloc != __a2.__underlying_alloc; +} +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// Comparison operators for all of the predifined SGI-style allocators. +// This ensures that __allocator (for example) will +// work correctly. + +template +inline bool operator==(const __malloc_alloc_template&, + const __malloc_alloc_template&) +{ + return true; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER +template +inline bool operator!=(const __malloc_alloc_template<__inst>&, + const __malloc_alloc_template<__inst>&) +{ + return false; +} +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + + +template +inline bool operator==(const debug_alloc<_Alloc>&, + const debug_alloc<_Alloc>&) { + return true; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER +template +inline bool operator!=(const debug_alloc<_Alloc>&, + const debug_alloc<_Alloc>&) { + return false; +} +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// Another allocator adaptor: _Alloc_traits. This serves two +// purposes. First, make it possible to write containers that can use +// either SGI-style allocators or standard-conforming allocator. +// Second, provide a mechanism so that containers can query whether or +// not the allocator has distinct instances. If not, the container +// can avoid wasting a word of memory to store an empty object. + +// This adaptor uses partial specialization. The general case of +// _Alloc_traits<_Tp, _Alloc> assumes that _Alloc is a +// standard-conforming allocator, possibly with non-equal instances +// and non-static members. (It still behaves correctly even if _Alloc +// has static member and if all instances are equal. Refinements +// affect performance, not correctness.) + +// There are always two members: allocator_type, which is a standard- +// conforming allocator type for allocating objects of type _Tp, and +// _S_instanceless, a static const member of type bool. If +// _S_instanceless is true, this means that there is no difference +// between any two instances of type allocator_type. Furthermore, if +// _S_instanceless is true, then _Alloc_traits has one additional +// member: _Alloc_type. This type encapsulates allocation and +// deallocation of objects of type _Tp through a static interface; it +// has two member functions, whose signatures are +// static _Tp* allocate(size_t) +// static void deallocate(_Tp*, size_t) + +// The fully general version. + +template +struct _Alloc_traits +{ + static const bool _S_instanceless = false; + typedef typename _Allocator::__STL_TEMPLATE rebind<_Tp>::other + allocator_type; +}; + +template +const bool _Alloc_traits<_Tp, _Allocator>::_S_instanceless; + +// The version for the default allocator. + +template +struct _Alloc_traits<_Tp, allocator<_Tp1> > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, alloc> _Alloc_type; + typedef allocator<_Tp> allocator_type; +}; + +// Versions for the predefined SGI-style allocators. + +template +struct _Alloc_traits<_Tp, __malloc_alloc_template<__inst> > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type; + typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type; +}; + +template +struct _Alloc_traits<_Tp, __default_alloc_template<__threads, __inst> > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, __default_alloc_template<__threads, __inst> > + _Alloc_type; + typedef __allocator<_Tp, __default_alloc_template<__threads, __inst> > + allocator_type; +}; + +template +struct _Alloc_traits<_Tp, debug_alloc<_Alloc> > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, debug_alloc<_Alloc> > _Alloc_type; + typedef __allocator<_Tp, debug_alloc<_Alloc> > allocator_type; +}; + +// Versions for the __allocator adaptor used with the predefined +// SGI-style allocators. + +template +struct _Alloc_traits<_Tp, + __allocator<_Tp1, __malloc_alloc_template<__inst> > > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type; + typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type; +}; + +template +struct _Alloc_traits<_Tp, + __allocator<_Tp1, + __default_alloc_template<__thr, __inst> > > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, __default_alloc_template<__thr,__inst> > + _Alloc_type; + typedef __allocator<_Tp, __default_alloc_template<__thr,__inst> > + allocator_type; +}; + +template +struct _Alloc_traits<_Tp, __allocator<_Tp1, debug_alloc<_Alloc> > > +{ + static const bool _S_instanceless = true; + typedef simple_alloc<_Tp, debug_alloc<_Alloc> > _Alloc_type; + typedef __allocator<_Tp, debug_alloc<_Alloc> > allocator_type; +}; + + +#endif /* __STL_USE_STD_ALLOCATORS */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#endif + +__STL_END_NAMESPACE + +#undef __PRIVATE + +#endif /* __SGI_STL_INTERNAL_ALLOC_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_bvector.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_bvector.h new file mode 100644 index 0000000..cba0835 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_bvector.h @@ -0,0 +1,896 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996-1999 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_BVECTOR_H +#define __SGI_STL_INTERNAL_BVECTOR_H + +__STL_BEGIN_NAMESPACE + +static const int __WORD_BIT = int(CHAR_BIT*sizeof(unsigned int)); + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +struct _Bit_reference { + unsigned int* _M_p; + unsigned int _M_mask; + _Bit_reference(unsigned int* __x, unsigned int __y) + : _M_p(__x), _M_mask(__y) {} + +public: + _Bit_reference() : _M_p(0), _M_mask(0) {} + operator bool() const { return !(!(*_M_p & _M_mask)); } + _Bit_reference& operator=(bool __x) + { + if (__x) *_M_p |= _M_mask; + else *_M_p &= ~_M_mask; + return *this; + } + _Bit_reference& operator=(const _Bit_reference& __x) + { return *this = bool(__x); } + bool operator==(const _Bit_reference& __x) const + { return bool(*this) == bool(__x); } + bool operator<(const _Bit_reference& __x) const { + return !bool(*this) && bool(__x); + } + void flip() { *_M_p ^= _M_mask; } +}; + +inline void swap(_Bit_reference __x, _Bit_reference __y) +{ + bool __tmp = __x; + __x = __y; + __y = __tmp; +} + +struct _Bit_iterator_base : public random_access_iterator +{ + unsigned int* _M_p; + unsigned int _M_offset; + + _Bit_iterator_base(unsigned int* __x, unsigned int __y) + : _M_p(__x), _M_offset(__y) {} + + void _M_bump_up() { + if (_M_offset++ == __WORD_BIT - 1) { + _M_offset = 0; + ++_M_p; + } + } + void _M_bump_down() { + if (_M_offset-- == 0) { + _M_offset = __WORD_BIT - 1; + --_M_p; + } + } + + void _M_incr(ptrdiff_t __i) { + difference_type __n = __i + _M_offset; + _M_p += __n / __WORD_BIT; + __n = __n % __WORD_BIT; + if (__n < 0) { + _M_offset = (unsigned int) __n + __WORD_BIT; + --_M_p; + } else + _M_offset = (unsigned int) __n; + } + + bool operator==(const _Bit_iterator_base& __i) const { + return _M_p == __i._M_p && _M_offset == __i._M_offset; + } + bool operator<(const _Bit_iterator_base& __i) const { + return _M_p < __i._M_p || (_M_p == __i._M_p && _M_offset < __i._M_offset); + } + bool operator!=(const _Bit_iterator_base& __i) const { + return !(*this == __i); + } + bool operator>(const _Bit_iterator_base& __i) const { + return __i < *this; + } + bool operator<=(const _Bit_iterator_base& __i) const { + return !(__i < *this); + } + bool operator>=(const _Bit_iterator_base& __i) const { + return !(*this < __i); + } +}; + +inline ptrdiff_t +operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) { + return __WORD_BIT * (__x._M_p - __y._M_p) + __x._M_offset - __y._M_offset; +} + + +struct _Bit_iterator : public _Bit_iterator_base +{ + typedef _Bit_reference reference; + typedef _Bit_reference* pointer; + typedef _Bit_iterator iterator; + + _Bit_iterator() : _Bit_iterator_base(0, 0) {} + _Bit_iterator(unsigned int* __x, unsigned int __y) + : _Bit_iterator_base(__x, __y) {} + + reference operator*() const { return reference(_M_p, 1U << _M_offset); } + iterator& operator++() { + _M_bump_up(); + return *this; + } + iterator operator++(int) { + iterator __tmp = *this; + _M_bump_up(); + return __tmp; + } + iterator& operator--() { + _M_bump_down(); + return *this; + } + iterator operator--(int) { + iterator __tmp = *this; + _M_bump_down(); + return __tmp; + } + iterator& operator+=(difference_type __i) { + _M_incr(__i); + return *this; + } + iterator& operator-=(difference_type __i) { + *this += -__i; + return *this; + } + iterator operator+(difference_type __i) const { + iterator __tmp = *this; + return __tmp += __i; + } + iterator operator-(difference_type __i) const { + iterator __tmp = *this; + return __tmp -= __i; + } + + reference operator[](difference_type __i) { return *(*this + __i); } +}; + +inline _Bit_iterator +operator+(ptrdiff_t __n, const _Bit_iterator& __x) { return __x + __n; } + + +struct _Bit_const_iterator : public _Bit_iterator_base +{ + typedef bool reference; + typedef bool const_reference; + typedef const bool* pointer; + typedef _Bit_const_iterator const_iterator; + + _Bit_const_iterator() : _Bit_iterator_base(0, 0) {} + _Bit_const_iterator(unsigned int* __x, unsigned int __y) + : _Bit_iterator_base(__x, __y) {} + _Bit_const_iterator(const _Bit_iterator& __x) + : _Bit_iterator_base(__x._M_p, __x._M_offset) {} + + const_reference operator*() const { + return _Bit_reference(_M_p, 1U << _M_offset); + } + const_iterator& operator++() { + _M_bump_up(); + return *this; + } + const_iterator operator++(int) { + const_iterator __tmp = *this; + _M_bump_up(); + return __tmp; + } + const_iterator& operator--() { + _M_bump_down(); + return *this; + } + const_iterator operator--(int) { + const_iterator __tmp = *this; + _M_bump_down(); + return __tmp; + } + const_iterator& operator+=(difference_type __i) { + _M_incr(__i); + return *this; + } + const_iterator& operator-=(difference_type __i) { + *this += -__i; + return *this; + } + const_iterator operator+(difference_type __i) const { + const_iterator __tmp = *this; + return __tmp += __i; + } + const_iterator operator-(difference_type __i) const { + const_iterator __tmp = *this; + return __tmp -= __i; + } + const_reference operator[](difference_type __i) { + return *(*this + __i); + } +}; + +inline _Bit_const_iterator +operator+(ptrdiff_t __n, const _Bit_const_iterator& __x) { return __x + __n; } + + +// Bit-vector base class, which encapsulates the difference between +// old SGI-style allocators and standard-conforming allocators. + +#ifdef __STL_USE_STD_ALLOCATORS + +// Base class for ordinary allocators. +template +class _Bvector_alloc_base { +public: + typedef typename _Alloc_traits::allocator_type + allocator_type; + allocator_type get_allocator() const { return _M_data_allocator; } + + _Bvector_alloc_base(const allocator_type& __a) + : _M_data_allocator(__a), _M_start(), _M_finish(), _M_end_of_storage(0) {} + +protected: + unsigned int* _M_bit_alloc(size_t __n) + { return _M_data_allocator.allocate((__n + __WORD_BIT - 1)/__WORD_BIT); } + void _M_deallocate() { + if (_M_start._M_p) + _M_data_allocator.deallocate(_M_start._M_p, + _M_end_of_storage - _M_start._M_p); + } + + typename _Alloc_traits::allocator_type + _M_data_allocator; + _Bit_iterator _M_start; + _Bit_iterator _M_finish; + unsigned int* _M_end_of_storage; +}; + +// Specialization for instanceless allocators. +template +class _Bvector_alloc_base<_Allocator, true> { +public: + typedef typename _Alloc_traits::allocator_type + allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Bvector_alloc_base(const allocator_type&) + : _M_start(), _M_finish(), _M_end_of_storage(0) {} + +protected: + typedef typename _Alloc_traits::_Alloc_type + _Alloc_type; + + unsigned int* _M_bit_alloc(size_t __n) + { return _Alloc_type::allocate((__n + __WORD_BIT - 1)/__WORD_BIT); } + void _M_deallocate() { + if (_M_start._M_p) + _Alloc_type::deallocate(_M_start._M_p, + _M_end_of_storage - _M_start._M_p); + } + + _Bit_iterator _M_start; + _Bit_iterator _M_finish; + unsigned int* _M_end_of_storage; +}; + +template +class _Bvector_base + : public _Bvector_alloc_base<_Alloc, + _Alloc_traits::_S_instanceless> +{ + typedef _Bvector_alloc_base<_Alloc, + _Alloc_traits::_S_instanceless> + _Base; +public: + typedef typename _Base::allocator_type allocator_type; + + _Bvector_base(const allocator_type& __a) : _Base(__a) {} + ~_Bvector_base() { _Base::_M_deallocate(); } +}; + +#else /* __STL_USE_STD_ALLOCATORS */ + +template +class _Bvector_base +{ +public: + typedef _Alloc allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Bvector_base(const allocator_type&) + : _M_start(), _M_finish(), _M_end_of_storage(0) {} + ~_Bvector_base() { _M_deallocate(); } + +protected: + typedef simple_alloc _Alloc_type; + + unsigned int* _M_bit_alloc(size_t __n) + { return _Alloc_type::allocate((__n + __WORD_BIT - 1)/__WORD_BIT); } + void _M_deallocate() { + if (_M_start._M_p) + _Alloc_type::deallocate(_M_start._M_p, + _M_end_of_storage - _M_start._M_p); + } + + _Bit_iterator _M_start; + _Bit_iterator _M_finish; + unsigned int* _M_end_of_storage; +}; + +#endif /* __STL_USE_STD_ALLOCATORS */ + +// The next few lines are confusing. What we're doing is declaring a +// partial specialization of vector if we have the necessary +// compiler support. Otherwise, we define a class bit_vector which uses +// the default allocator. + +#if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && !defined(__STL_NO_BOOL) +# define __SGI_STL_VECBOOL_TEMPLATE +# define __BVECTOR vector +# define __VECTOR vector +# define __BVECTOR_BASE _Bvector_base<_Alloc> +# define __BVECTOR_TMPL_LIST template + __STL_END_NAMESPACE +# include + __STL_BEGIN_NAMESPACE +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION && !__STL_NO_BOOL */ +# undef __SGI_STL_VECBOOL_TEMPLATE +# define __BVECTOR bit_vector +# define __VECTOR bit_vector +# define __BVECTOR_BASE _Bvector_base<__STL_DEFAULT_ALLOCATOR(bool) > +# define __BVECTOR_TMPL_LIST +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION && !__STL_NO_BOOL */ + + +__BVECTOR_TMPL_LIST +class __BVECTOR : public __BVECTOR_BASE +{ +public: + typedef bool value_type; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Bit_reference reference; + typedef bool const_reference; + typedef _Bit_reference* pointer; + typedef const bool* const_pointer; + + typedef _Bit_iterator iterator; + typedef _Bit_const_iterator const_iterator; + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + typedef reverse_iterator const_reverse_iterator; + typedef reverse_iterator reverse_iterator; +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + typedef reverse_iterator const_reverse_iterator; + typedef reverse_iterator + reverse_iterator; +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + + typedef typename __BVECTOR_BASE::allocator_type allocator_type; + allocator_type get_allocator() const { + return __BVECTOR_BASE::get_allocator(); + } + +protected: +#ifdef __STL_USE_NAMESPACES + using __BVECTOR_BASE::_M_bit_alloc; + using __BVECTOR_BASE::_M_deallocate; + using __BVECTOR_BASE::_M_start; + using __BVECTOR_BASE::_M_finish; + using __BVECTOR_BASE::_M_end_of_storage; +#endif /* __STL_USE_NAMESPACES */ + +protected: + void _M_initialize(size_type __n) { + unsigned int* __q = _M_bit_alloc(__n); + _M_end_of_storage = __q + (__n + __WORD_BIT - 1)/__WORD_BIT; + _M_start = iterator(__q, 0); + _M_finish = _M_start + difference_type(__n); + } + void _M_insert_aux(iterator __position, bool __x) { + if (_M_finish._M_p != _M_end_of_storage) { + copy_backward(__position, _M_finish, _M_finish + 1); + *__position = __x; + ++_M_finish; + } + else { + size_type __len = size() ? 2 * size() : __WORD_BIT; + unsigned int* __q = _M_bit_alloc(__len); + iterator __i = copy(begin(), __position, iterator(__q, 0)); + *__i++ = __x; + _M_finish = copy(__position, end(), __i); + _M_deallocate(); + _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT; + _M_start = iterator(__q, 0); + } + } + +#ifdef __STL_MEMBER_TEMPLATES + template + void _M_initialize_range(_InputIterator __first, _InputIterator __last, + input_iterator_tag) { + _M_start = iterator(); + _M_finish = iterator(); + _M_end_of_storage = 0; + for ( ; __first != __last; ++__first) + push_back(*__first); + } + + template + void _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last, + forward_iterator_tag) { + size_type __n = 0; + distance(__first, __last, __n); + _M_initialize(__n); + copy(__first, __last, _M_start); + } + + template + void _M_insert_range(iterator __pos, + _InputIterator __first, _InputIterator __last, + input_iterator_tag) { + for ( ; __first != __last; ++__first) { + __pos = insert(__pos, *__first); + ++__pos; + } + } + + template + void _M_insert_range(iterator __position, + _ForwardIterator __first, _ForwardIterator __last, + forward_iterator_tag) { + if (__first != __last) { + size_type __n = 0; + distance(__first, __last, __n); + if (capacity() - size() >= __n) { + copy_backward(__position, end(), _M_finish + difference_type(__n)); + copy(__first, __last, __position); + _M_finish += difference_type(__n); + } + else { + size_type __len = size() + max(size(), __n); + unsigned int* __q = _M_bit_alloc(__len); + iterator __i = copy(begin(), __position, iterator(__q, 0)); + __i = copy(__first, __last, __i); + _M_finish = copy(__position, end(), __i); + _M_deallocate(); + _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT; + _M_start = iterator(__q, 0); + } + } + } + +#endif /* __STL_MEMBER_TEMPLATES */ + +public: + iterator begin() { return _M_start; } + const_iterator begin() const { return _M_start; } + iterator end() { return _M_finish; } + const_iterator end() const { return _M_finish; } + + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + + size_type size() const { return size_type(end() - begin()); } + size_type max_size() const { return size_type(-1); } + size_type capacity() const { + return size_type(const_iterator(_M_end_of_storage, 0) - begin()); + } + bool empty() const { return begin() == end(); } + + reference operator[](size_type __n) + { return *(begin() + difference_type(__n)); } + const_reference operator[](size_type __n) const + { return *(begin() + difference_type(__n)); } + +#ifdef __STL_THROW_RANGE_ERRORS + void _M_range_check(size_type __n) const { + if (__n >= this->size()) + __stl_throw_range_error("vector"); + } + + reference at(size_type __n) + { _M_range_check(__n); return (*this)[__n]; } + const_reference at(size_type __n) const + { _M_range_check(__n); return (*this)[__n]; } +#endif /* __STL_THROW_RANGE_ERRORS */ + + explicit __VECTOR(const allocator_type& __a = allocator_type()) + : __BVECTOR_BASE(__a) {} + + __VECTOR(size_type __n, bool __value, + const allocator_type& __a = allocator_type()) + : __BVECTOR_BASE(__a) + { + _M_initialize(__n); + fill(_M_start._M_p, _M_end_of_storage, __value ? ~0 : 0); + } + + explicit __VECTOR(size_type __n) + : __BVECTOR_BASE(allocator_type()) + { + _M_initialize(__n); + fill(_M_start._M_p, _M_end_of_storage, 0); + } + + __VECTOR(const __VECTOR& __x) : __BVECTOR_BASE(__x.get_allocator()) { + _M_initialize(__x.size()); + copy(__x.begin(), __x.end(), _M_start); + } + +#ifdef __STL_MEMBER_TEMPLATES + + // Check whether it's an integral type. If so, it's not an iterator. + + template + void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) { + _M_initialize(__n); + fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0); + } + + template + void _M_initialize_dispatch(_InputIterator __first, _InputIterator __last, + __false_type) { + _M_initialize_range(__first, __last, __ITERATOR_CATEGORY(__first)); + } + + template + __VECTOR(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : __BVECTOR_BASE(__a) + { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_initialize_dispatch(__first, __last, _Integral()); + } + +#else /* __STL_MEMBER_TEMPLATES */ + + __VECTOR(const_iterator __first, const_iterator __last, + const allocator_type& __a = allocator_type()) + : __BVECTOR_BASE(__a) + { + size_type __n = 0; + distance(__first, __last, __n); + _M_initialize(__n); + copy(__first, __last, _M_start); + } + __VECTOR(const bool* __first, const bool* __last, + const allocator_type& __a = allocator_type()) + : __BVECTOR_BASE(__a) + { + size_type __n = 0; + distance(__first, __last, __n); + _M_initialize(__n); + copy(__first, __last, _M_start); + } + +#endif /* __STL_MEMBER_TEMPLATES */ + + ~__VECTOR() { } + + __VECTOR& operator=(const __VECTOR& __x) { + if (&__x == this) return *this; + if (__x.size() > capacity()) { + _M_deallocate(); + _M_initialize(__x.size()); + } + copy(__x.begin(), __x.end(), begin()); + _M_finish = begin() + difference_type(__x.size()); + return *this; + } + + // assign(), a generalized assignment member function. Two + // versions: one that takes a count, and one that takes a range. + // The range version is a member template, so we dispatch on whether + // or not the type is an integer. + + void _M_fill_assign(size_t __n, bool __x) { + if (__n > size()) { + fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0); + insert(end(), __n - size(), __x); + } + else { + erase(begin() + __n, end()); + fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0); + } + } + + void assign(size_t __n, bool __x) { _M_fill_assign(__n, __x); } + +#ifdef __STL_MEMBER_TEMPLATES + + template + void assign(_InputIterator __first, _InputIterator __last) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_assign_dispatch(__first, __last, _Integral()); + } + + template + void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type) + { _M_fill_assign((size_t) __n, (bool) __val); } + + template + void _M_assign_dispatch(_InputIter __first, _InputIter __last, __false_type) + { _M_assign_aux(__first, __last, __ITERATOR_CATEGORY(__first)); } + + template + void _M_assign_aux(_InputIterator __first, _InputIterator __last, + input_iterator_tag) { + iterator __cur = begin(); + for ( ; __first != __last && __cur != end(); ++__cur, ++__first) + *__cur = *__first; + if (__first == __last) + erase(__cur, end()); + else + insert(end(), __first, __last); + } + + template + void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last, + forward_iterator_tag) { + size_type __len = 0; + distance(__first, __last, __len); + if (__len < size()) + erase(copy(__first, __last, begin()), end()); + else { + _ForwardIterator __mid = __first; + advance(__mid, size()); + copy(__first, __mid, begin()); + insert(end(), __mid, __last); + } + } + +#endif /* __STL_MEMBER_TEMPLATES */ + + void reserve(size_type __n) { + if (capacity() < __n) { + unsigned int* __q = _M_bit_alloc(__n); + _M_finish = copy(begin(), end(), iterator(__q, 0)); + _M_deallocate(); + _M_start = iterator(__q, 0); + _M_end_of_storage = __q + (__n + __WORD_BIT - 1)/__WORD_BIT; + } + } + + reference front() { return *begin(); } + const_reference front() const { return *begin(); } + reference back() { return *(end() - 1); } + const_reference back() const { return *(end() - 1); } + void push_back(bool __x) { + if (_M_finish._M_p != _M_end_of_storage) + *_M_finish++ = __x; + else + _M_insert_aux(end(), __x); + } + void swap(__BVECTOR& __x) { + __STD::swap(_M_start, __x._M_start); + __STD::swap(_M_finish, __x._M_finish); + __STD::swap(_M_end_of_storage, __x._M_end_of_storage); + } + iterator insert(iterator __position, bool __x = bool()) { + difference_type __n = __position - begin(); + if (_M_finish._M_p != _M_end_of_storage && __position == end()) + *_M_finish++ = __x; + else + _M_insert_aux(__position, __x); + return begin() + __n; + } + +#ifdef __STL_MEMBER_TEMPLATES + // Check whether it's an integral type. If so, it's not an iterator. + + template + void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x, + __true_type) { + _M_fill_insert(__pos, __n, __x); + } + + template + void _M_insert_dispatch(iterator __pos, + _InputIterator __first, _InputIterator __last, + __false_type) { + _M_insert_range(__pos, __first, __last, __ITERATOR_CATEGORY(__first)); + } + + template + void insert(iterator __position, + _InputIterator __first, _InputIterator __last) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_insert_dispatch(__position, __first, __last, _Integral()); + } + +#else /* __STL_MEMBER_TEMPLATES */ + void insert(iterator __position, + const_iterator __first, const_iterator __last) { + if (__first == __last) return; + size_type __n = 0; + distance(__first, __last, __n); + if (capacity() - size() >= __n) { + copy_backward(__position, end(), _M_finish + __n); + copy(__first, __last, __position); + _M_finish += __n; + } + else { + size_type __len = size() + max(size(), __n); + unsigned int* __q = _M_bit_alloc(__len); + iterator __i = copy(begin(), __position, iterator(__q, 0)); + __i = copy(__first, __last, __i); + _M_finish = copy(__position, end(), __i); + _M_deallocate(); + _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT; + _M_start = iterator(__q, 0); + } + } + + void insert(iterator __position, const bool* __first, const bool* __last) { + if (__first == __last) return; + size_type __n = 0; + distance(__first, __last, __n); + if (capacity() - size() >= __n) { + copy_backward(__position, end(), _M_finish + __n); + copy(__first, __last, __position); + _M_finish += __n; + } + else { + size_type __len = size() + max(size(), __n); + unsigned int* __q = _M_bit_alloc(__len); + iterator __i = copy(begin(), __position, iterator(__q, 0)); + __i = copy(__first, __last, __i); + _M_finish = copy(__position, end(), __i); + _M_deallocate(); + _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT; + _M_start = iterator(__q, 0); + } + } +#endif /* __STL_MEMBER_TEMPLATES */ + + void _M_fill_insert(iterator __position, size_type __n, bool __x) { + if (__n == 0) return; + if (capacity() - size() >= __n) { + copy_backward(__position, end(), _M_finish + difference_type(__n)); + fill(__position, __position + difference_type(__n), __x); + _M_finish += difference_type(__n); + } + else { + size_type __len = size() + max(size(), __n); + unsigned int* __q = _M_bit_alloc(__len); + iterator __i = copy(begin(), __position, iterator(__q, 0)); + fill_n(__i, __n, __x); + _M_finish = copy(__position, end(), __i + difference_type(__n)); + _M_deallocate(); + _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT; + _M_start = iterator(__q, 0); + } + } + + void insert(iterator __position, size_type __n, bool __x) { + _M_fill_insert(__position, __n, __x); + } + + void pop_back() { --_M_finish; } + iterator erase(iterator __position) { + if (__position + 1 != end()) + copy(__position + 1, end(), __position); + --_M_finish; + return __position; + } + iterator erase(iterator __first, iterator __last) { + _M_finish = copy(__last, end(), __first); + return __first; + } + void resize(size_type __new_size, bool __x = bool()) { + if (__new_size < size()) + erase(begin() + difference_type(__new_size), end()); + else + insert(end(), __new_size - size(), __x); + } + void flip() { + for (unsigned int* __p = _M_start._M_p; __p != _M_end_of_storage; ++__p) + *__p = ~*__p; + } + + void clear() { erase(begin(), end()); } +}; + +#ifdef __SGI_STL_VECBOOL_TEMPLATE + +// This typedef is non-standard. It is provided for backward compatibility. +typedef vector bit_vector; + +#else /* __SGI_STL_VECBOOL_TEMPLATE */ + +inline void swap(bit_vector& __x, bit_vector& __y) { + __x.swap(__y); +} + +inline bool +operator==(const bit_vector& __x, const bit_vector& __y) +{ + return (__x.size() == __y.size() && + equal(__x.begin(), __x.end(), __y.begin())); +} + +inline bool +operator!=(const bit_vector& __x, const bit_vector& __y) +{ + return !(__x == __y); +} + +inline bool +operator<(const bit_vector& __x, const bit_vector& __y) +{ + return lexicographical_compare(__x.begin(), __x.end(), + __y.begin(), __y.end()); +} + +inline bool operator>(const bit_vector& __x, const bit_vector& __y) +{ + return __y < __x; +} + +inline bool operator<=(const bit_vector& __x, const bit_vector& __y) +{ + return !(__y < __x); +} + +inline bool operator>=(const bit_vector& __x, const bit_vector& __y) +{ + return !(__x < __y); +} + +#endif /* __SGI_STL_VECBOOL_TEMPLATE */ + +#undef __SGI_STL_VECBOOL_TEMPLATE +#undef __BVECTOR +#undef __VECTOR +#undef __BVECTOR_BASE +#undef __BVECTOR_TMPL_LIST + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_BVECTOR_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_config.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_config.h new file mode 100644 index 0000000..6f37131 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_config.h @@ -0,0 +1,576 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * Copyright (c) 1997 + * Silicon Graphics + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __STL_CONFIG_H +# define __STL_CONFIG_H + +// Flags: +// * __STL_NO_BOOL: defined if the compiler doesn't have bool as a builtin +// type. +// * __STL_HAS_WCHAR_T: defined if the compier has wchar_t as a builtin type. +// * __STL_NO_DRAND48: defined if the compiler doesn't have the drand48 +// function. +// * __STL_STATIC_TEMPLATE_MEMBER_BUG: defined if the compiler can't handle +// static members of template classes. +// * __STL_STATIC_CONST_INIT_BUG: defined if the compiler can't handle a +// constant-initializer in the declaration of a static const data member +// of integer type. (See section 9.4.2, paragraph 4, of the C++ standard.) +// * __STL_CLASS_PARTIAL_SPECIALIZATION: defined if the compiler supports +// partial specialization of template classes. +// * __STL_PARTIAL_SPECIALIZATION_SYNTAX: defined if the compiler +// supports partial specialization syntax for full specialization of +// class templates. (Even if it doesn't actually support partial +// specialization itself.) +// * __STL_FUNCTION_TMPL_PARTIAL_ORDER: defined if the compiler supports +// partial ordering of function templates. (a.k.a partial specialization +// of function templates.) +// * __STL_MEMBER_TEMPLATES: defined if the compiler supports template +// member functions of classes. +// * __STL_MEMBER_TEMPLATE_CLASSES: defined if the compiler supports +// nested classes that are member templates of other classes. +// * __STL_TEMPLATE_FRIENDS: defined if the compiler supports templatized +// friend declarations. +// * __STL_EXPLICIT_FUNCTION_TMPL_ARGS: defined if the compiler +// supports calling a function template by providing its template +// arguments explicitly. +// * __STL_LIMITED_DEFAULT_TEMPLATES: defined if the compiler is unable +// to handle default template parameters that depend on previous template +// parameters. +// * __STL_NON_TYPE_TMPL_PARAM_BUG: defined if the compiler has trouble with +// function template argument deduction for non-type template parameters. +// * __SGI_STL_NO_ARROW_OPERATOR: defined if the compiler is unable +// to support the -> operator for iterators. +// * __STL_DEFAULT_CONSTRUCTOR_BUG: defined if T() does not work properly +// when T is a builtin type. +// * __STL_USE_EXCEPTIONS: defined if the compiler (in the current compilation +// mode) supports exceptions. +// * __STL_USE_NAMESPACES: defined if the compiler has the necessary +// support for namespaces. +// * __STL_NO_EXCEPTION_HEADER: defined if the compiler does not have a +// standard-conforming header . +// * __STL_NO_BAD_ALLOC: defined if the compiler does not have a +// header, or if does not contain a bad_alloc class. If a bad_alloc +// class exists, it is assumed to be in namespace std. +// * __STL_SGI_THREADS: defined if this is being compiled for an SGI IRIX +// system in multithreaded mode, using native SGI threads instead of +// pthreads. +// * __STL_WIN32THREADS: defined if this is being compiled on a WIN32 +// compiler in multithreaded mode. +// * __STL_PTHREADS: defined if we should use portable pthreads +// synchronization. +// * __STL_UITHREADS: defined if we should use UI / solaris / UnixWare threads +// synchronization. UIthreads are similar to pthreads, but are based +// on an earlier version of the Posix threads standard. +// * __STL_LONG_LONG if the compiler has long long and unsigned long long +// types. (They're not in the C++ standard, but they are expected to be +// included in the forthcoming C9X standard.) +// * __STL_THREADS is defined if thread safety is needed. +// * __STL_VOLATILE is defined to be "volatile" if threads are being +// used, and the empty string otherwise. +// * __STL_USE_CONCEPT_CHECKS enables some extra compile-time error +// checking to make sure that user-defined template arguments satisfy +// all of the appropriate requirements. This may result in more +// comprehensible error messages. It incurs no runtime overhead. This +// feature requires member templates and partial specialization. +// * __STL_NO_USING_CLAUSE_IN_CLASS: The compiler does not handle "using" +// clauses inside of class definitions. +// * __STL_NO_FRIEND_TEMPLATE_CLASS: The compiler does not handle friend +// declaractions where the friend is a template class. +// * __STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE: The compiler does not +// support the use of a function pointer type as the argument +// for a template. +// * __STL_MEMBER_TEMPLATE_KEYWORD: standard C++ requires the template +// keyword in a few new places (14.2.4). This flag is set for +// compilers that support (and require) this usage. + + +// User-settable macros that control compilation: +// * __STL_USE_SGI_ALLOCATORS: if defined, then the STL will use older +// SGI-style allocators, instead of standard-conforming allocators, +// even if the compiler supports all of the language features needed +// for standard-conforming allocators. +// * __STL_NO_NAMESPACES: if defined, don't put the library in namespace +// std, even if the compiler supports namespaces. +// * __STL_NO_RELOPS_NAMESPACE: if defined, don't put the relational +// operator templates (>, <=. >=, !=) in namespace std::rel_ops, even +// if the compiler supports namespaces and partial ordering of +// function templates. +// * __STL_ASSERTIONS: if defined, then enable runtime checking through the +// __stl_assert macro. +// * _PTHREADS: if defined, use Posix threads for multithreading support. +// * _UITHREADS:if defined, use SCO/Solaris/UI threads for multithreading +// support +// * _NOTHREADS: if defined, don't use any multithreading support. +// * _STL_NO_CONCEPT_CHECKS: if defined, disables the error checking that +// we get from __STL_USE_CONCEPT_CHECKS. +// * __STL_USE_NEW_IOSTREAMS: if defined, then the STL will use new, +// standard-conforming iostreams (e.g. the header). If not +// defined, the STL will use old cfront-style iostreams (e.g. the +// header). + +// Other macros defined by this file: + +// * bool, true, and false, if __STL_NO_BOOL is defined. +// * typename, as a null macro if it's not already a keyword. +// * explicit, as a null macro if it's not already a keyword. +// * namespace-related macros (__STD, __STL_BEGIN_NAMESPACE, etc.) +// * exception-related macros (__STL_TRY, __STL_UNWIND, etc.) +// * __stl_assert, either as a test or as a null macro, depending on +// whether or not __STL_ASSERTIONS is defined. + +# if defined(_PTHREADS) && !defined(_NOTHREADS) +# define __STL_PTHREADS +# endif + +# if defined(_UITHREADS) && !defined(_PTHREADS) && !defined(_NOTHREADS) +# define __STL_UITHREADS +# endif + +# if defined(__sgi) && !defined(__GNUC__) +# include +# if !defined(_BOOL) +# define __STL_NO_BOOL +# endif +# if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32 +# define __STL_STATIC_CONST_INIT_BUG +# endif +# if defined(_WCHAR_T_IS_KEYWORD) +# define __STL_HAS_WCHAR_T +# endif +# if !defined(_TYPENAME_IS_KEYWORD) +# define __STL_NEED_TYPENAME +# endif +# ifdef _PARTIAL_SPECIALIZATION_OF_CLASS_TEMPLATES +# define __STL_CLASS_PARTIAL_SPECIALIZATION +# endif +# if (_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32 +# define __STL_FUNCTION_TMPL_PARTIAL_ORDER +# endif +# ifdef _MEMBER_TEMPLATES +# define __STL_MEMBER_TEMPLATES +# define __STL_TEMPLATE_FRIENDS +# define __STL_MEMBER_TEMPLATE_CLASSES +# endif +# if defined(_MEMBER_TEMPLATE_KEYWORD) +# define __STL_MEMBER_TEMPLATE_KEYWORD +# endif +# if defined(_STANDARD_C_PLUS_PLUS) +# define __STL_EXPLICIT_FUNCTION_TMPL_ARGS +# endif +# if (_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32 +# define __STL_MEMBER_TEMPLATE_KEYWORD +# endif +# if COMPILER_VERSION < 720 || (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32) +# define __STL_DEFAULT_CONSTRUCTOR_BUG +# endif +# if !defined(_EXPLICIT_IS_KEYWORD) +# define __STL_NEED_EXPLICIT +# endif +# ifdef __EXCEPTIONS +# define __STL_USE_EXCEPTIONS +# endif +# if (_COMPILER_VERSION >= 721) && defined(_NAMESPACES) +# define __STL_HAS_NAMESPACES +# endif +# if (_COMPILER_VERSION < 721) || \ + !defined(__STL_HAS_NAMESPACES) || defined(__STL_NO_NAMESPACES) +# define __STL_NO_EXCEPTION_HEADER +# endif +# if _COMPILER_VERSION < 730 || !defined(_STANDARD_C_PLUS_PLUS) || \ + !defined(_NAMESPACES) +# define __STL_NO_BAD_ALLOC +# endif +# if !defined(_NOTHREADS) && !defined(__STL_PTHREADS) +# define __STL_SGI_THREADS +# endif +# if defined(_LONGLONG) && defined(_SGIAPI) && _SGIAPI +# define __STL_LONG_LONG +# endif +# if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS) +# define __STL_USE_NEW_IOSTREAMS +# endif +# if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS) +# define __STL_CAN_THROW_RANGE_ERRORS +# endif +# if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS) +# define __SGI_STL_USE_AUTO_PTR_CONVERSIONS +# endif +# endif + + +/* + * Jochen Schlick '1999 - added new #defines (__STL)_UITHREADS (for + * providing SCO / Solaris / UI thread support) + * - added the necessary defines for the SCO UDK 7 + * compiler (and its template friend behavior) + * - all UDK7 specific STL changes are based on the + * macro __USLC__ being defined + */ +// SCO UDK 7 compiler (UnixWare 7x, OSR 5, UnixWare 2x) +# if defined(__USLC__) +# define __STL_HAS_WCHAR_T +# define __STL_CLASS_PARTIAL_SPECIALIZATION +# define __STL_PARTIAL_SPECIALIZATION_SYNTAX +# define __STL_FUNCTION_TMPL_PARTIAL_ORDER +# define __STL_MEMBER_TEMPLATES +# define __STL_MEMBER_TEMPLATE_CLASSES +# define __STL_USE_EXCEPTIONS +# define __STL_HAS_NAMESPACES +# define __STL_USE_NAMESPACES +# define __STL_LONG_LONG +# if defined(_REENTRANT) +# define _UITHREADS /* if UnixWare < 7.0.1 */ +# define __STL_UITHREADS +// use the following defines instead of the UI threads defines when +// you want to use POSIX threads +//# define _PTHREADS /* only if UnixWare >=7.0.1 */ +//# define __STL_PTHREADS +# endif +# endif + + + +# ifdef __GNUC__ +# if __GNUC__ == 2 && __GNUC_MINOR__ <= 7 +# define __STL_STATIC_TEMPLATE_MEMBER_BUG +# endif +# if __GNUC__ < 2 +# define __STL_NEED_TYPENAME +# define __STL_NEED_EXPLICIT +# endif +# if __GNUC__ == 2 && __GNUC_MINOR__ <= 8 +# define __STL_NO_EXCEPTION_HEADER +# define __STL_NO_BAD_ALLOC +# endif +# if __GNUC__ == 2 && __GNUC_MINOR__ >= 8 +# define __STL_CLASS_PARTIAL_SPECIALIZATION +# define __STL_FUNCTION_TMPL_PARTIAL_ORDER +# define __STL_EXPLICIT_FUNCTION_TMPL_ARGS +# define __STL_MEMBER_TEMPLATES +# define __STL_CAN_THROW_RANGE_ERRORS + // g++ 2.8.1 supports member template functions, but not member + // template nested classes. +# if __GNUC_MINOR__ >= 9 +# define __STL_MEMBER_TEMPLATE_CLASSES +# define __STL_TEMPLATE_FRIENDS +# define __SGI_STL_USE_AUTO_PTR_CONVERSIONS +# define __STL_HAS_NAMESPACES +//# define __STL_USE_NEW_IOSTREAMS +# endif +# endif +# define __STL_DEFAULT_CONSTRUCTOR_BUG +# ifdef __EXCEPTIONS +# define __STL_USE_EXCEPTIONS +# endif +# ifdef _REENTRANT +# define __STL_PTHREADS +# endif +# if (__GNUC__ < 2) || (__GNUC__ == 2 && __GNUC_MINOR__ < 95) +# define __STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE +# endif +# endif + +# if defined(__SUNPRO_CC) +# define __STL_NO_BOOL +# define __STL_NEED_TYPENAME +# define __STL_NEED_EXPLICIT +# define __STL_USE_EXCEPTIONS +# ifdef _REENTRANT +# define __STL_PTHREADS +# endif +# define __SGI_STL_NO_ARROW_OPERATOR +# define __STL_PARTIAL_SPECIALIZATION_SYNTAX +# define __STL_NO_EXCEPTION_HEADER +# define __STL_NO_BAD_ALLOC +# endif + +# if defined(__COMO__) +# define __STL_MEMBER_TEMPLATES +# define __STL_MEMBER_TEMPLATE_CLASSES +# define __STL_TEMPLATE_FRIENDS +# define __STL_CLASS_PARTIAL_SPECIALIZATION +# define __STL_USE_EXCEPTIONS +# define __STL_HAS_NAMESPACES +# endif + +// Intel compiler, which uses the EDG front end. +# if defined(__ICL) +# define __STL_LONG_LONG +# define __STL_MEMBER_TEMPLATES +# define __STL_MEMBER_TEMPLATE_CLASSES +# define __STL_TEMPLATE_FRIENDS +# define __STL_FUNCTION_TMPL_PARTIAL_ORDER +# define __STL_CLASS_PARTIAL_SPECIALIZATION +# define __STL_NO_DRAND48 +# define __STL_HAS_NAMESPACES +# define __STL_USE_EXCEPTIONS +# define __STL_MEMBER_TEMPLATE_KEYWORD +# ifdef _CPPUNWIND +# define __STL_USE_EXCEPTIONS +# endif +# ifdef _MT +# define __STL_WIN32THREADS +# endif +# endif + +// Mingw32, egcs compiler using the Microsoft C runtime +# if defined(__MINGW32__) +# define __STL_NO_DRAND48 +# ifdef _MT +# define __STL_WIN32THREADS +# endif +# endif + +// Cygwin32, egcs compiler on MS Windows +# if defined(__CYGWIN__) +# define __STL_NO_DRAND48 +# endif + + + +// Microsoft compiler. +# if defined(_MSC_VER) && !defined(__ICL) && !defined(__MWERKS__) +# define __STL_NO_DRAND48 +# define __STL_STATIC_CONST_INIT_BUG +# define __STL_NEED_TYPENAME +# define __STL_NO_USING_CLAUSE_IN_CLASS +# define __STL_NO_FRIEND_TEMPLATE_CLASS +# if _MSC_VER < 1100 /* 1000 is version 4.0, 1100 is 5.0, 1200 is 6.0. */ +# define __STL_NEED_EXPLICIT +# define __STL_NO_BOOL +# define __STL_NO_BAD_ALLOC +# endif +# if _MSC_VER > 1000 +# include +# define __STL_DONT_USE_BOOL_TYPEDEF +# endif +# define __STL_NON_TYPE_TMPL_PARAM_BUG +# define __SGI_STL_NO_ARROW_OPERATOR +# define __STL_DEFAULT_CONSTRUCTOR_BUG +# ifdef _CPPUNWIND +# define __STL_USE_EXCEPTIONS +# endif +# ifdef _MT +# define __STL_WIN32THREADS +# endif +# if _MSC_VER >= 1200 +# define __STL_PARTIAL_SPECIALIZATION_SYNTAX +# define __STL_HAS_NAMESPACES +# define __STL_CAN_THROW_RANGE_ERRORS +# define NOMINMAX +# undef min +# undef max +// disable warning 'initializers put in unrecognized initialization area' +# pragma warning ( disable : 4075 ) +// disable warning 'empty controlled statement found' +# pragma warning ( disable : 4390 ) +// disable warning 'debug symbol greater than 255 chars' +# pragma warning ( disable : 4786 ) +# endif +# if _MSC_VER < 1100 +# define __STL_NO_EXCEPTION_HEADER +# define __STL_NO_BAD_ALLOC +# endif + // Because of a Microsoft front end bug, we must not provide a + // namespace qualifier when declaring a friend function. +# define __STD_QUALIFIER +# endif + +# if defined(__BORLANDC__) +# define __STL_NO_BAD_ALLOC +# define __STL_NO_DRAND48 +# define __STL_DEFAULT_CONSTRUCTOR_BUG +# if __BORLANDC__ >= 0x540 /* C++ Builder 4.0 */ +# define __STL_CLASS_PARTIAL_SPECIALIZATION +# define __STL_FUNCTION_TMPL_PARTIAL_ORDER +# define __STL_EXPLICIT_FUNCTION_TMPL_ARGS +# define __STL_MEMBER_TEMPLATES +# define __STL_TEMPLATE_FRIENDS +# else +# define __STL_NEED_TYPENAME +# define __STL_LIMITED_DEFAULT_TEMPLATES +# define __SGI_STL_NO_ARROW_OPERATOR +# define __STL_NON_TYPE_TMPL_PARAM_BUG +# endif +# ifdef _CPPUNWIND +# define __STL_USE_EXCEPTIONS +# endif +# ifdef __MT__ +# define __STL_WIN32THREADS +# endif +# endif + +# if defined(__STL_NO_BOOL) && !defined(__STL_DONT_USE_BOOL_TYPEDEF) + typedef int bool; +# define true 1 +# define false 0 +# endif + +# ifdef __STL_NEED_TYPENAME +# define typename +# endif + +# ifdef __STL_LIMITED_DEFAULT_TEMPLATES +# define __STL_DEPENDENT_DEFAULT_TMPL(_Tp) +# else +# define __STL_DEPENDENT_DEFAULT_TMPL(_Tp) = _Tp +# endif + +# ifdef __STL_MEMBER_TEMPLATE_KEYWORD +# define __STL_TEMPLATE template +# else +# define __STL_TEMPLATE +# endif + +# ifdef __STL_NEED_EXPLICIT +# define explicit +# endif + +# ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS +# define __STL_NULL_TMPL_ARGS <> +# else +# define __STL_NULL_TMPL_ARGS +# endif + +# if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) \ + || defined (__STL_PARTIAL_SPECIALIZATION_SYNTAX) +# define __STL_TEMPLATE_NULL template<> +# else +# define __STL_TEMPLATE_NULL +# endif + +// Use standard-conforming allocators if we have the necessary language +// features. __STL_USE_SGI_ALLOCATORS is a hook so that users can +// disable new-style allocators, and continue to use the same kind of +// allocators as before, without having to edit library headers. +# if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && \ + defined(__STL_MEMBER_TEMPLATES) && \ + defined(__STL_MEMBER_TEMPLATE_CLASSES) && \ + !defined(__STL_NO_BOOL) && \ + !defined(__STL_NON_TYPE_TMPL_PARAM_BUG) && \ + !defined(__STL_LIMITED_DEFAULT_TEMPLATES) && \ + !defined(__STL_USE_SGI_ALLOCATORS) +# define __STL_USE_STD_ALLOCATORS +# endif + +# ifndef __STL_DEFAULT_ALLOCATOR +# ifdef __STL_USE_STD_ALLOCATORS +# define __STL_DEFAULT_ALLOCATOR(T) allocator< T > +# else +# define __STL_DEFAULT_ALLOCATOR(T) alloc +# endif +# endif + +// __STL_NO_NAMESPACES is a hook so that users can disable namespaces +// without having to edit library headers. __STL_NO_RELOPS_NAMESPACE is +// a hook so that users can disable the std::rel_ops namespace, keeping +// the relational operator template in namespace std, without having to +// edit library headers. +# if defined(__STL_HAS_NAMESPACES) && !defined(__STL_NO_NAMESPACES) +# define __STL_USE_NAMESPACES +# define __STD std +# define __STL_BEGIN_NAMESPACE namespace std { +# define __STL_END_NAMESPACE } +# if defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) && \ + !defined(__STL_NO_RELOPS_NAMESPACE) +# define __STL_USE_NAMESPACE_FOR_RELOPS +# define __STL_BEGIN_RELOPS_NAMESPACE namespace std { namespace rel_ops { +# define __STL_END_RELOPS_NAMESPACE } } +# define __STD_RELOPS std::rel_ops +# else /* Use std::rel_ops namespace */ +# define __STL_USE_NAMESPACE_FOR_RELOPS +# define __STL_BEGIN_RELOPS_NAMESPACE namespace std { +# define __STL_END_RELOPS_NAMESPACE } +# define __STD_RELOPS std +# endif /* Use std::rel_ops namespace */ +# else +# define __STD +# define __STL_BEGIN_NAMESPACE +# define __STL_END_NAMESPACE +# undef __STL_USE_NAMESPACE_FOR_RELOPS +# define __STL_BEGIN_RELOPS_NAMESPACE +# define __STL_END_RELOPS_NAMESPACE +# define __STD_RELOPS +# undef __STL_USE_NAMESPACES +# endif + +// Some versions of the EDG front end sometimes require an explicit +// namespace spec where they shouldn't. This macro facilitates that. +// If the bug becomes irrelevant, then all uses of __STD_QUALIFIER +// should be removed. The 7.3 beta SGI compiler has this bug, but the +// MR version is not expected to have it. + +# if defined(__STL_USE_NAMESPACES) && !defined(__STD_QUALIFIER) +# define __STD_QUALIFIER std:: +# else +# define __STD_QUALIFIER +# endif + +# ifdef __STL_USE_EXCEPTIONS +# define __STL_TRY try +# define __STL_CATCH_ALL catch(...) +# define __STL_THROW(x) throw x +# define __STL_RETHROW throw +# define __STL_NOTHROW throw() +# define __STL_UNWIND(action) catch(...) { action; throw; } +# else +# define __STL_TRY +# define __STL_CATCH_ALL if (false) +# define __STL_THROW(x) +# define __STL_RETHROW +# define __STL_NOTHROW +# define __STL_UNWIND(action) +# endif + +#ifdef __STL_ASSERTIONS +# include +# define __stl_assert(expr) \ + if (!(expr)) { fprintf(stderr, "%s:%d STL assertion failure: %s\n", \ + __FILE__, __LINE__, # expr); abort(); } +#else +# define __stl_assert(expr) +#endif + +#if defined(__STL_WIN32THREADS) || defined(__STL_SGI_THREADS) \ + || defined(__STL_PTHREADS) || defined(__STL_UITHREADS) +# define __STL_THREADS +# define __STL_VOLATILE volatile +#else +# define __STL_VOLATILE +#endif + +#if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) \ + && defined(__STL_MEMBER_TEMPLATES) \ + && !defined(_STL_NO_CONCEPT_CHECKS) +# define __STL_USE_CONCEPT_CHECKS +#endif + + +#endif /* __STL_CONFIG_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_construct.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_construct.h new file mode 100644 index 0000000..a17f9ee --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_construct.h @@ -0,0 +1,124 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H +#define __SGI_STL_INTERNAL_CONSTRUCT_H + +#include + +__STL_BEGIN_NAMESPACE + +// construct and destroy. These functions are not part of the C++ standard, +// and are provided for backward compatibility with the HP STL. We also +// provide internal names _Construct and _Destroy that can be used within +// the library, so that standard-conforming pieces don't have to rely on +// non-standard extensions. + +// Internal names + +template +inline void _Construct(_T1* __p, const _T2& __value) { + new ((void*) __p) _T1(__value); +} + +template +inline void _Construct(_T1* __p) { + new ((void*) __p) _T1(); +} + +template +inline void _Destroy(_Tp* __pointer) { + __pointer->~_Tp(); +} + +template +void +__destroy_aux(_ForwardIterator __first, _ForwardIterator __last, __false_type) +{ + for ( ; __first != __last; ++__first) + destroy(&*__first); +} + +template +inline void __destroy_aux(_ForwardIterator, _ForwardIterator, __true_type) {} + +template +inline void +__destroy(_ForwardIterator __first, _ForwardIterator __last, _Tp*) +{ + typedef typename __type_traits<_Tp>::has_trivial_destructor + _Trivial_destructor; + __destroy_aux(__first, __last, _Trivial_destructor()); +} + +template +inline void _Destroy(_ForwardIterator __first, _ForwardIterator __last) { + __destroy(__first, __last, __VALUE_TYPE(__first)); +} + +inline void _Destroy(char*, char*) {} +inline void _Destroy(int*, int*) {} +inline void _Destroy(long*, long*) {} +inline void _Destroy(float*, float*) {} +inline void _Destroy(double*, double*) {} +#ifdef __STL_HAS_WCHAR_T +inline void _Destroy(wchar_t*, wchar_t*) {} +#endif /* __STL_HAS_WCHAR_T */ + +// -------------------------------------------------- +// Old names from the HP STL. + +template +inline void construct(_T1* __p, const _T2& __value) { + _Construct(__p, __value); +} + +template +inline void construct(_T1* __p) { + _Construct(__p); +} + +template +inline void destroy(_Tp* __pointer) { + _Destroy(__pointer); +} + +template +inline void destroy(_ForwardIterator __first, _ForwardIterator __last) { + _Destroy(__first, __last); +} + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_CONSTRUCT_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_ctraits_fns.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_ctraits_fns.h new file mode 100644 index 0000000..5577f4d --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_ctraits_fns.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 1999 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +// WARNING: This is an internal header file, included by other C++ +// standard library headers. You should not attempt to use this header +// file directly. + +#ifndef __SGI_STL_INTERNAL_CTRAITS_FUNCTIONS_H +#define __SGI_STL_INTERNAL_CTRAITS_FUNCTIONS_H + +// This file contains a few small adapters that allow a character +// traits class to be used as a function object. + +__STL_BEGIN_NAMESPACE + +template +struct _Eq_traits + : public binary_function +{ + bool operator()(const typename _Traits::char_type& __x, + const typename _Traits::char_type& __y) const + { return _Traits::eq(__x, __y); } +}; + +template +struct _Eq_int_traits + : public binary_function +{ + bool operator()(const typename _Traits::char_type& __x, + const typename _Traits::int_type& __y) const + { return _Traits::eq_int_type(_Traits::to_int_type(__x), __y); } +}; + +template +struct _Lt_traits + : public binary_function +{ + bool operator()(const typename _Traits::char_type& __x, + const typename _Traits::char_type& __y) const + { return _Traits::lt(__x, __y); } +}; + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_CTRAITS_FUNCTIONS_H */ + +// Local Variables: +// mode:C++ +// End: + + + + diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_deque.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_deque.h new file mode 100644 index 0000000..7978f7d --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_deque.h @@ -0,0 +1,1652 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#include + +#ifndef __SGI_STL_INTERNAL_DEQUE_H +#define __SGI_STL_INTERNAL_DEQUE_H + +/* Class invariants: + * For any nonsingular iterator i: + * i.node is the address of an element in the map array. The + * contents of i.node is a pointer to the beginning of a node. + * i.first == *(i.node) + * i.last == i.first + node_size + * i.cur is a pointer in the range [i.first, i.last). NOTE: + * the implication of this is that i.cur is always a dereferenceable + * pointer, even if i is a past-the-end iterator. + * Start and Finish are always nonsingular iterators. NOTE: this means + * that an empty deque must have one node, and that a deque + * with N elements, where N is the buffer size, must have two nodes. + * For every node other than start.node and finish.node, every element + * in the node is an initialized object. If start.node == finish.node, + * then [start.cur, finish.cur) are initialized objects, and + * the elements outside that range are uninitialized storage. Otherwise, + * [start.cur, start.last) and [finish.first, finish.cur) are initialized + * objects, and [start.first, start.cur) and [finish.cur, finish.last) + * are uninitialized storage. + * [map, map + map_size) is a valid, non-empty range. + * [start.node, finish.node] is a valid range contained within + * [map, map + map_size). + * A pointer in the range [map, map + map_size) points to an allocated node + * if and only if the pointer is in the range [start.node, finish.node]. + */ + + +/* + * In previous versions of deque, there was an extra template + * parameter so users could control the node size. This extension + * turns out to violate the C++ standard (it can be detected using + * template template parameters), and it has been removed. + */ + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +// Note: this function is simply a kludge to work around several compilers' +// bugs in handling constant expressions. +inline size_t __deque_buf_size(size_t __size) { + return __size < 512 ? size_t(512 / __size) : size_t(1); +} + +template +struct _Deque_iterator { + typedef _Deque_iterator<_Tp, _Tp&, _Tp*> iterator; + typedef _Deque_iterator<_Tp, const _Tp&, const _Tp*> const_iterator; + static size_t _S_buffer_size() { return __deque_buf_size(sizeof(_Tp)); } + + typedef random_access_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Ptr pointer; + typedef _Ref reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp** _Map_pointer; + + typedef _Deque_iterator _Self; + + _Tp* _M_cur; + _Tp* _M_first; + _Tp* _M_last; + _Map_pointer _M_node; + + _Deque_iterator(_Tp* __x, _Map_pointer __y) + : _M_cur(__x), _M_first(*__y), + _M_last(*__y + _S_buffer_size()), _M_node(__y) {} + _Deque_iterator() : _M_cur(0), _M_first(0), _M_last(0), _M_node(0) {} + _Deque_iterator(const iterator& __x) + : _M_cur(__x._M_cur), _M_first(__x._M_first), + _M_last(__x._M_last), _M_node(__x._M_node) {} + + reference operator*() const { return *_M_cur; } +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return _M_cur; } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + + difference_type operator-(const _Self& __x) const { + return difference_type(_S_buffer_size()) * (_M_node - __x._M_node - 1) + + (_M_cur - _M_first) + (__x._M_last - __x._M_cur); + } + + _Self& operator++() { + ++_M_cur; + if (_M_cur == _M_last) { + _M_set_node(_M_node + 1); + _M_cur = _M_first; + } + return *this; + } + _Self operator++(int) { + _Self __tmp = *this; + ++*this; + return __tmp; + } + + _Self& operator--() { + if (_M_cur == _M_first) { + _M_set_node(_M_node - 1); + _M_cur = _M_last; + } + --_M_cur; + return *this; + } + _Self operator--(int) { + _Self __tmp = *this; + --*this; + return __tmp; + } + + _Self& operator+=(difference_type __n) + { + difference_type __offset = __n + (_M_cur - _M_first); + if (__offset >= 0 && __offset < difference_type(_S_buffer_size())) + _M_cur += __n; + else { + difference_type __node_offset = + __offset > 0 ? __offset / difference_type(_S_buffer_size()) + : -difference_type((-__offset - 1) / _S_buffer_size()) - 1; + _M_set_node(_M_node + __node_offset); + _M_cur = _M_first + + (__offset - __node_offset * difference_type(_S_buffer_size())); + } + return *this; + } + + _Self operator+(difference_type __n) const + { + _Self __tmp = *this; + return __tmp += __n; + } + + _Self& operator-=(difference_type __n) { return *this += -__n; } + + _Self operator-(difference_type __n) const { + _Self __tmp = *this; + return __tmp -= __n; + } + + reference operator[](difference_type __n) const { return *(*this + __n); } + + bool operator==(const _Self& __x) const { return _M_cur == __x._M_cur; } + bool operator!=(const _Self& __x) const { return !(*this == __x); } + bool operator<(const _Self& __x) const { + return (_M_node == __x._M_node) ? + (_M_cur < __x._M_cur) : (_M_node < __x._M_node); + } + bool operator>(const _Self& __x) const { return __x < *this; } + bool operator<=(const _Self& __x) const { return !(__x < *this); } + bool operator>=(const _Self& __x) const { return !(*this < __x); } + + void _M_set_node(_Map_pointer __new_node) { + _M_node = __new_node; + _M_first = *__new_node; + _M_last = _M_first + difference_type(_S_buffer_size()); + } +}; + +template +inline _Deque_iterator<_Tp, _Ref, _Ptr> +operator+(ptrdiff_t __n, const _Deque_iterator<_Tp, _Ref, _Ptr>& __x) +{ + return __x + __n; +} + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline random_access_iterator_tag +iterator_category(const _Deque_iterator<_Tp,_Ref,_Ptr>&) +{ + return random_access_iterator_tag(); +} + +template +inline _Tp* value_type(const _Deque_iterator<_Tp,_Ref,_Ptr>&) { return 0; } + +template +inline ptrdiff_t* distance_type(const _Deque_iterator<_Tp,_Ref,_Ptr>&) { + return 0; +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +// Deque base class. It has two purposes. First, its constructor +// and destructor allocate (but don't initialize) storage. This makes +// exception safety easier. Second, the base class encapsulates all of +// the differences between SGI-style allocators and standard-conforming +// allocators. + +#ifdef __STL_USE_STD_ALLOCATORS + +// Base class for ordinary allocators. +template +class _Deque_alloc_base { +public: + typedef typename _Alloc_traits<_Tp,_Alloc>::allocator_type allocator_type; + allocator_type get_allocator() const { return _M_node_allocator; } + + _Deque_alloc_base(const allocator_type& __a) + : _M_node_allocator(__a), _M_map_allocator(__a), + _M_map(0), _M_map_size(0) + {} + +protected: + typedef typename _Alloc_traits<_Tp*, _Alloc>::allocator_type + _Map_allocator_type; + + allocator_type _M_node_allocator; + _Map_allocator_type _M_map_allocator; + + _Tp* _M_allocate_node() { + return _M_node_allocator.allocate(__deque_buf_size(sizeof(_Tp))); + } + void _M_deallocate_node(_Tp* __p) { + _M_node_allocator.deallocate(__p, __deque_buf_size(sizeof(_Tp))); + } + _Tp** _M_allocate_map(size_t __n) + { return _M_map_allocator.allocate(__n); } + void _M_deallocate_map(_Tp** __p, size_t __n) + { _M_map_allocator.deallocate(__p, __n); } + + _Tp** _M_map; + size_t _M_map_size; +}; + +// Specialization for instanceless allocators. +template +class _Deque_alloc_base<_Tp, _Alloc, true> +{ +public: + typedef typename _Alloc_traits<_Tp,_Alloc>::allocator_type allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Deque_alloc_base(const allocator_type&) : _M_map(0), _M_map_size(0) {} + +protected: + typedef typename _Alloc_traits<_Tp, _Alloc>::_Alloc_type _Node_alloc_type; + typedef typename _Alloc_traits<_Tp*, _Alloc>::_Alloc_type _Map_alloc_type; + + _Tp* _M_allocate_node() { + return _Node_alloc_type::allocate(__deque_buf_size(sizeof(_Tp))); + } + void _M_deallocate_node(_Tp* __p) { + _Node_alloc_type::deallocate(__p, __deque_buf_size(sizeof(_Tp))); + } + _Tp** _M_allocate_map(size_t __n) + { return _Map_alloc_type::allocate(__n); } + void _M_deallocate_map(_Tp** __p, size_t __n) + { _Map_alloc_type::deallocate(__p, __n); } + + _Tp** _M_map; + size_t _M_map_size; +}; + +template +class _Deque_base + : public _Deque_alloc_base<_Tp,_Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> +{ +public: + typedef _Deque_alloc_base<_Tp,_Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> + _Base; + typedef typename _Base::allocator_type allocator_type; + typedef _Deque_iterator<_Tp,_Tp&,_Tp*> iterator; + typedef _Deque_iterator<_Tp,const _Tp&,const _Tp*> const_iterator; + + _Deque_base(const allocator_type& __a, size_t __num_elements) + : _Base(__a), _M_start(), _M_finish() + { _M_initialize_map(__num_elements); } + _Deque_base(const allocator_type& __a) + : _Base(__a), _M_start(), _M_finish() {} + ~_Deque_base(); + +protected: + void _M_initialize_map(size_t); + void _M_create_nodes(_Tp** __nstart, _Tp** __nfinish); + void _M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish); + enum { _S_initial_map_size = 8 }; + +protected: + iterator _M_start; + iterator _M_finish; +}; + +#else /* __STL_USE_STD_ALLOCATORS */ + +template +class _Deque_base { +public: + typedef _Deque_iterator<_Tp,_Tp&,_Tp*> iterator; + typedef _Deque_iterator<_Tp,const _Tp&,const _Tp*> const_iterator; + + typedef _Alloc allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Deque_base(const allocator_type&, size_t __num_elements) + : _M_map(0), _M_map_size(0), _M_start(), _M_finish() { + _M_initialize_map(__num_elements); + } + _Deque_base(const allocator_type&) + : _M_map(0), _M_map_size(0), _M_start(), _M_finish() {} + ~_Deque_base(); + +protected: + void _M_initialize_map(size_t); + void _M_create_nodes(_Tp** __nstart, _Tp** __nfinish); + void _M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish); + enum { _S_initial_map_size = 8 }; + +protected: + _Tp** _M_map; + size_t _M_map_size; + iterator _M_start; + iterator _M_finish; + + typedef simple_alloc<_Tp, _Alloc> _Node_alloc_type; + typedef simple_alloc<_Tp*, _Alloc> _Map_alloc_type; + + _Tp* _M_allocate_node() + { return _Node_alloc_type::allocate(__deque_buf_size(sizeof(_Tp))); } + void _M_deallocate_node(_Tp* __p) + { _Node_alloc_type::deallocate(__p, __deque_buf_size(sizeof(_Tp))); } + _Tp** _M_allocate_map(size_t __n) + { return _Map_alloc_type::allocate(__n); } + void _M_deallocate_map(_Tp** __p, size_t __n) + { _Map_alloc_type::deallocate(__p, __n); } +}; + +#endif /* __STL_USE_STD_ALLOCATORS */ + +// Non-inline member functions from _Deque_base. + +template +_Deque_base<_Tp,_Alloc>::~_Deque_base() { + if (_M_map) { + _M_destroy_nodes(_M_start._M_node, _M_finish._M_node + 1); + _M_deallocate_map(_M_map, _M_map_size); + } +} + +template +void +_Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements) +{ + size_t __num_nodes = + __num_elements / __deque_buf_size(sizeof(_Tp)) + 1; + + _M_map_size = max((size_t) _S_initial_map_size, __num_nodes + 2); + _M_map = _M_allocate_map(_M_map_size); + + _Tp** __nstart = _M_map + (_M_map_size - __num_nodes) / 2; + _Tp** __nfinish = __nstart + __num_nodes; + + __STL_TRY { + _M_create_nodes(__nstart, __nfinish); + } + __STL_UNWIND((_M_deallocate_map(_M_map, _M_map_size), + _M_map = 0, _M_map_size = 0)); + _M_start._M_set_node(__nstart); + _M_finish._M_set_node(__nfinish - 1); + _M_start._M_cur = _M_start._M_first; + _M_finish._M_cur = _M_finish._M_first + + __num_elements % __deque_buf_size(sizeof(_Tp)); +} + +template +void _Deque_base<_Tp,_Alloc>::_M_create_nodes(_Tp** __nstart, _Tp** __nfinish) +{ + _Tp** __cur; + __STL_TRY { + for (__cur = __nstart; __cur < __nfinish; ++__cur) + *__cur = _M_allocate_node(); + } + __STL_UNWIND(_M_destroy_nodes(__nstart, __cur)); +} + +template +void +_Deque_base<_Tp,_Alloc>::_M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish) +{ + for (_Tp** __n = __nstart; __n < __nfinish; ++__n) + _M_deallocate_node(*__n); +} + +template +class deque : protected _Deque_base<_Tp, _Alloc> { + + // requirements: + + __STL_CLASS_REQUIRES(_Tp, _Assignable); + + typedef _Deque_base<_Tp, _Alloc> _Base; +public: // Basic types + typedef _Tp value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + typedef typename _Base::allocator_type allocator_type; + allocator_type get_allocator() const { return _Base::get_allocator(); } + +public: // Iterators + typedef typename _Base::iterator iterator; + typedef typename _Base::const_iterator const_iterator; + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + typedef reverse_iterator const_reverse_iterator; + typedef reverse_iterator reverse_iterator; +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + typedef reverse_iterator + const_reverse_iterator; + typedef reverse_iterator + reverse_iterator; +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +protected: // Internal typedefs + typedef pointer* _Map_pointer; + static size_t _S_buffer_size() { return __deque_buf_size(sizeof(_Tp)); } + +protected: +#ifdef __STL_USE_NAMESPACES + using _Base::_M_initialize_map; + using _Base::_M_create_nodes; + using _Base::_M_destroy_nodes; + using _Base::_M_allocate_node; + using _Base::_M_deallocate_node; + using _Base::_M_allocate_map; + using _Base::_M_deallocate_map; + + using _Base::_M_map; + using _Base::_M_map_size; + using _Base::_M_start; + using _Base::_M_finish; +#endif /* __STL_USE_NAMESPACES */ + +public: // Basic accessors + iterator begin() { return _M_start; } + iterator end() { return _M_finish; } + const_iterator begin() const { return _M_start; } + const_iterator end() const { return _M_finish; } + + reverse_iterator rbegin() { return reverse_iterator(_M_finish); } + reverse_iterator rend() { return reverse_iterator(_M_start); } + const_reverse_iterator rbegin() const + { return const_reverse_iterator(_M_finish); } + const_reverse_iterator rend() const + { return const_reverse_iterator(_M_start); } + + reference operator[](size_type __n) + { return _M_start[difference_type(__n)]; } + const_reference operator[](size_type __n) const + { return _M_start[difference_type(__n)]; } + +#ifdef __STL_THROW_RANGE_ERRORS + void _M_range_check(size_type __n) const { + if (__n >= this->size()) + __stl_throw_range_error("deque"); + } + + reference at(size_type __n) + { _M_range_check(__n); return (*this)[__n]; } + const_reference at(size_type __n) const + { _M_range_check(__n); return (*this)[__n]; } +#endif /* __STL_THROW_RANGE_ERRORS */ + + reference front() { return *_M_start; } + reference back() { + iterator __tmp = _M_finish; + --__tmp; + return *__tmp; + } + const_reference front() const { return *_M_start; } + const_reference back() const { + const_iterator __tmp = _M_finish; + --__tmp; + return *__tmp; + } + + size_type size() const { return _M_finish - _M_start; } + size_type max_size() const { return size_type(-1); } + bool empty() const { return _M_finish == _M_start; } + +public: // Constructor, destructor. + explicit deque(const allocator_type& __a = allocator_type()) + : _Base(__a, 0) {} + deque(const deque& __x) : _Base(__x.get_allocator(), __x.size()) + { uninitialized_copy(__x.begin(), __x.end(), _M_start); } + deque(size_type __n, const value_type& __value, + const allocator_type& __a = allocator_type()) : _Base(__a, __n) + { _M_fill_initialize(__value); } + explicit deque(size_type __n) : _Base(allocator_type(), __n) + { _M_fill_initialize(value_type()); } + +#ifdef __STL_MEMBER_TEMPLATES + + // Check whether it's an integral type. If so, it's not an iterator. + template + deque(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) : _Base(__a) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_initialize_dispatch(__first, __last, _Integral()); + } + + template + void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) { + _M_initialize_map(__n); + _M_fill_initialize(__x); + } + + template + void _M_initialize_dispatch(_InputIter __first, _InputIter __last, + __false_type) { + _M_range_initialize(__first, __last, __ITERATOR_CATEGORY(__first)); + } + +#else /* __STL_MEMBER_TEMPLATES */ + + deque(const value_type* __first, const value_type* __last, + const allocator_type& __a = allocator_type()) + : _Base(__a, __last - __first) + { uninitialized_copy(__first, __last, _M_start); } + deque(const_iterator __first, const_iterator __last, + const allocator_type& __a = allocator_type()) + : _Base(__a, __last - __first) + { uninitialized_copy(__first, __last, _M_start); } + +#endif /* __STL_MEMBER_TEMPLATES */ + + ~deque() { destroy(_M_start, _M_finish); } + + deque& operator= (const deque& __x) { + const size_type __len = size(); + if (&__x != this) { + if (__len >= __x.size()) + erase(copy(__x.begin(), __x.end(), _M_start), _M_finish); + else { + const_iterator __mid = __x.begin() + difference_type(__len); + copy(__x.begin(), __mid, _M_start); + insert(_M_finish, __mid, __x.end()); + } + } + return *this; + } + + void swap(deque& __x) { + __STD::swap(_M_start, __x._M_start); + __STD::swap(_M_finish, __x._M_finish); + __STD::swap(_M_map, __x._M_map); + __STD::swap(_M_map_size, __x._M_map_size); + } + +public: + // assign(), a generalized assignment member function. Two + // versions: one that takes a count, and one that takes a range. + // The range version is a member template, so we dispatch on whether + // or not the type is an integer. + + void _M_fill_assign(size_type __n, const _Tp& __val) { + if (__n > size()) { + fill(begin(), end(), __val); + insert(end(), __n - size(), __val); + } + else { + erase(begin() + __n, end()); + fill(begin(), end(), __val); + } + } + + void assign(size_type __n, const _Tp& __val) { + _M_fill_assign(__n, __val); + } + +#ifdef __STL_MEMBER_TEMPLATES + + template + void assign(_InputIterator __first, _InputIterator __last) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_assign_dispatch(__first, __last, _Integral()); + } + +private: // helper functions for assign() + + template + void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type) + { _M_fill_assign((size_type) __n, (_Tp) __val); } + + template + void _M_assign_dispatch(_InputIterator __first, _InputIterator __last, + __false_type) { + _M_assign_aux(__first, __last, __ITERATOR_CATEGORY(__first)); + } + + template + void _M_assign_aux(_InputIterator __first, _InputIterator __last, + input_iterator_tag); + + template + void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last, + forward_iterator_tag) { + size_type __len = 0; + distance(__first, __last, __len); + if (__len > size()) { + _ForwardIterator __mid = __first; + advance(__mid, size()); + copy(__first, __mid, begin()); + insert(end(), __mid, __last); + } + else + erase(copy(__first, __last, begin()), end()); + } + +#endif /* __STL_MEMBER_TEMPLATES */ + +public: // push_* and pop_* + + void push_back(const value_type& __t) { + if (_M_finish._M_cur != _M_finish._M_last - 1) { + construct(_M_finish._M_cur, __t); + ++_M_finish._M_cur; + } + else + _M_push_back_aux(__t); + } + + void push_back() { + if (_M_finish._M_cur != _M_finish._M_last - 1) { + construct(_M_finish._M_cur); + ++_M_finish._M_cur; + } + else + _M_push_back_aux(); + } + + void push_front(const value_type& __t) { + if (_M_start._M_cur != _M_start._M_first) { + construct(_M_start._M_cur - 1, __t); + --_M_start._M_cur; + } + else + _M_push_front_aux(__t); + } + + void push_front() { + if (_M_start._M_cur != _M_start._M_first) { + construct(_M_start._M_cur - 1); + --_M_start._M_cur; + } + else + _M_push_front_aux(); + } + + + void pop_back() { + if (_M_finish._M_cur != _M_finish._M_first) { + --_M_finish._M_cur; + destroy(_M_finish._M_cur); + } + else + _M_pop_back_aux(); + } + + void pop_front() { + if (_M_start._M_cur != _M_start._M_last - 1) { + destroy(_M_start._M_cur); + ++_M_start._M_cur; + } + else + _M_pop_front_aux(); + } + +public: // Insert + + iterator insert(iterator position, const value_type& __x) { + if (position._M_cur == _M_start._M_cur) { + push_front(__x); + return _M_start; + } + else if (position._M_cur == _M_finish._M_cur) { + push_back(__x); + iterator __tmp = _M_finish; + --__tmp; + return __tmp; + } + else { + return _M_insert_aux(position, __x); + } + } + + iterator insert(iterator __position) + { return insert(__position, value_type()); } + + void insert(iterator __pos, size_type __n, const value_type& __x) + { _M_fill_insert(__pos, __n, __x); } + + void _M_fill_insert(iterator __pos, size_type __n, const value_type& __x); + +#ifdef __STL_MEMBER_TEMPLATES + + // Check whether it's an integral type. If so, it's not an iterator. + template + void insert(iterator __pos, _InputIterator __first, _InputIterator __last) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_insert_dispatch(__pos, __first, __last, _Integral()); + } + + template + void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x, + __true_type) { + _M_fill_insert(__pos, (size_type) __n, (value_type) __x); + } + + template + void _M_insert_dispatch(iterator __pos, + _InputIterator __first, _InputIterator __last, + __false_type) { + insert(__pos, __first, __last, __ITERATOR_CATEGORY(__first)); + } + +#else /* __STL_MEMBER_TEMPLATES */ + + void insert(iterator __pos, + const value_type* __first, const value_type* __last); + void insert(iterator __pos, + const_iterator __first, const_iterator __last); + +#endif /* __STL_MEMBER_TEMPLATES */ + + void resize(size_type __new_size, const value_type& __x) { + const size_type __len = size(); + if (__new_size < __len) + erase(_M_start + __new_size, _M_finish); + else + insert(_M_finish, __new_size - __len, __x); + } + + void resize(size_type new_size) { resize(new_size, value_type()); } + +public: // Erase + iterator erase(iterator __pos) { + iterator __next = __pos; + ++__next; + difference_type __index = __pos - _M_start; + if (size_type(__index) < (this->size() >> 1)) { + copy_backward(_M_start, __pos, __next); + pop_front(); + } + else { + copy(__next, _M_finish, __pos); + pop_back(); + } + return _M_start + __index; + } + + iterator erase(iterator __first, iterator __last); + void clear(); + +protected: // Internal construction/destruction + + void _M_fill_initialize(const value_type& __value); + +#ifdef __STL_MEMBER_TEMPLATES + + template + void _M_range_initialize(_InputIterator __first, _InputIterator __last, + input_iterator_tag); + + template + void _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last, + forward_iterator_tag); + +#endif /* __STL_MEMBER_TEMPLATES */ + +protected: // Internal push_* and pop_* + + void _M_push_back_aux(const value_type&); + void _M_push_back_aux(); + void _M_push_front_aux(const value_type&); + void _M_push_front_aux(); + void _M_pop_back_aux(); + void _M_pop_front_aux(); + +protected: // Internal insert functions + +#ifdef __STL_MEMBER_TEMPLATES + + template + void insert(iterator __pos, _InputIterator __first, _InputIterator __last, + input_iterator_tag); + + template + void insert(iterator __pos, + _ForwardIterator __first, _ForwardIterator __last, + forward_iterator_tag); + +#endif /* __STL_MEMBER_TEMPLATES */ + + iterator _M_insert_aux(iterator __pos, const value_type& __x); + iterator _M_insert_aux(iterator __pos); + void _M_insert_aux(iterator __pos, size_type __n, const value_type& __x); + +#ifdef __STL_MEMBER_TEMPLATES + + template + void _M_insert_aux(iterator __pos, + _ForwardIterator __first, _ForwardIterator __last, + size_type __n); + +#else /* __STL_MEMBER_TEMPLATES */ + + void _M_insert_aux(iterator __pos, + const value_type* __first, const value_type* __last, + size_type __n); + + void _M_insert_aux(iterator __pos, + const_iterator __first, const_iterator __last, + size_type __n); + +#endif /* __STL_MEMBER_TEMPLATES */ + + iterator _M_reserve_elements_at_front(size_type __n) { + size_type __vacancies = _M_start._M_cur - _M_start._M_first; + if (__n > __vacancies) + _M_new_elements_at_front(__n - __vacancies); + return _M_start - difference_type(__n); + } + + iterator _M_reserve_elements_at_back(size_type __n) { + size_type __vacancies = (_M_finish._M_last - _M_finish._M_cur) - 1; + if (__n > __vacancies) + _M_new_elements_at_back(__n - __vacancies); + return _M_finish + difference_type(__n); + } + + void _M_new_elements_at_front(size_type __new_elements); + void _M_new_elements_at_back(size_type __new_elements); + +protected: // Allocation of _M_map and nodes + + // Makes sure the _M_map has space for new nodes. Does not actually + // add the nodes. Can invalidate _M_map pointers. (And consequently, + // deque iterators.) + + void _M_reserve_map_at_back (size_type __nodes_to_add = 1) { + if (__nodes_to_add + 1 > _M_map_size - (_M_finish._M_node - _M_map)) + _M_reallocate_map(__nodes_to_add, false); + } + + void _M_reserve_map_at_front (size_type __nodes_to_add = 1) { + if (__nodes_to_add > size_type(_M_start._M_node - _M_map)) + _M_reallocate_map(__nodes_to_add, true); + } + + void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front); +}; + +// Non-inline member functions + +#ifdef __STL_MEMBER_TEMPLATES + +template +template +void deque<_Tp, _Alloc> + ::_M_assign_aux(_InputIter __first, _InputIter __last, input_iterator_tag) +{ + iterator __cur = begin(); + for ( ; __first != __last && __cur != end(); ++__cur, ++__first) + *__cur = *__first; + if (__first == __last) + erase(__cur, end()); + else + insert(end(), __first, __last); +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +void deque<_Tp, _Alloc>::_M_fill_insert(iterator __pos, + size_type __n, const value_type& __x) +{ + if (__pos._M_cur == _M_start._M_cur) { + iterator __new_start = _M_reserve_elements_at_front(__n); + __STL_TRY { + uninitialized_fill(__new_start, _M_start, __x); + _M_start = __new_start; + } + __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node)); + } + else if (__pos._M_cur == _M_finish._M_cur) { + iterator __new_finish = _M_reserve_elements_at_back(__n); + __STL_TRY { + uninitialized_fill(_M_finish, __new_finish, __x); + _M_finish = __new_finish; + } + __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, + __new_finish._M_node + 1)); + } + else + _M_insert_aux(__pos, __n, __x); +} + +#ifndef __STL_MEMBER_TEMPLATES + +template +void deque<_Tp, _Alloc>::insert(iterator __pos, + const value_type* __first, + const value_type* __last) { + size_type __n = __last - __first; + if (__pos._M_cur == _M_start._M_cur) { + iterator __new_start = _M_reserve_elements_at_front(__n); + __STL_TRY { + uninitialized_copy(__first, __last, __new_start); + _M_start = __new_start; + } + __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node)); + } + else if (__pos._M_cur == _M_finish._M_cur) { + iterator __new_finish = _M_reserve_elements_at_back(__n); + __STL_TRY { + uninitialized_copy(__first, __last, _M_finish); + _M_finish = __new_finish; + } + __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, + __new_finish._M_node + 1)); + } + else + _M_insert_aux(__pos, __first, __last, __n); +} + +template +void deque<_Tp,_Alloc>::insert(iterator __pos, + const_iterator __first, const_iterator __last) +{ + size_type __n = __last - __first; + if (__pos._M_cur == _M_start._M_cur) { + iterator __new_start = _M_reserve_elements_at_front(__n); + __STL_TRY { + uninitialized_copy(__first, __last, __new_start); + _M_start = __new_start; + } + __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node)); + } + else if (__pos._M_cur == _M_finish._M_cur) { + iterator __new_finish = _M_reserve_elements_at_back(__n); + __STL_TRY { + uninitialized_copy(__first, __last, _M_finish); + _M_finish = __new_finish; + } + __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, + __new_finish._M_node + 1)); + } + else + _M_insert_aux(__pos, __first, __last, __n); +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +typename deque<_Tp,_Alloc>::iterator +deque<_Tp,_Alloc>::erase(iterator __first, iterator __last) +{ + if (__first == _M_start && __last == _M_finish) { + clear(); + return _M_finish; + } + else { + difference_type __n = __last - __first; + difference_type __elems_before = __first - _M_start; + if (__elems_before < difference_type((this->size() - __n) / 2)) { + copy_backward(_M_start, __first, __last); + iterator __new_start = _M_start + __n; + destroy(_M_start, __new_start); + _M_destroy_nodes(__new_start._M_node, _M_start._M_node); + _M_start = __new_start; + } + else { + copy(__last, _M_finish, __first); + iterator __new_finish = _M_finish - __n; + destroy(__new_finish, _M_finish); + _M_destroy_nodes(__new_finish._M_node + 1, _M_finish._M_node + 1); + _M_finish = __new_finish; + } + return _M_start + __elems_before; + } +} + +template +void deque<_Tp,_Alloc>::clear() +{ + for (_Map_pointer __node = _M_start._M_node + 1; + __node < _M_finish._M_node; + ++__node) { + destroy(*__node, *__node + _S_buffer_size()); + _M_deallocate_node(*__node); + } + + if (_M_start._M_node != _M_finish._M_node) { + destroy(_M_start._M_cur, _M_start._M_last); + destroy(_M_finish._M_first, _M_finish._M_cur); + _M_deallocate_node(_M_finish._M_first); + } + else + destroy(_M_start._M_cur, _M_finish._M_cur); + + _M_finish = _M_start; +} + +// Precondition: _M_start and _M_finish have already been initialized, +// but none of the deque's elements have yet been constructed. +template +void deque<_Tp,_Alloc>::_M_fill_initialize(const value_type& __value) { + _Map_pointer __cur; + __STL_TRY { + for (__cur = _M_start._M_node; __cur < _M_finish._M_node; ++__cur) + uninitialized_fill(*__cur, *__cur + _S_buffer_size(), __value); + uninitialized_fill(_M_finish._M_first, _M_finish._M_cur, __value); + } + __STL_UNWIND(destroy(_M_start, iterator(*__cur, __cur))); +} + +#ifdef __STL_MEMBER_TEMPLATES + +template template +void deque<_Tp,_Alloc>::_M_range_initialize(_InputIterator __first, + _InputIterator __last, + input_iterator_tag) +{ + _M_initialize_map(0); + __STL_TRY { + for ( ; __first != __last; ++__first) + push_back(*__first); + } + __STL_UNWIND(clear()); +} + +template template +void deque<_Tp,_Alloc>::_M_range_initialize(_ForwardIterator __first, + _ForwardIterator __last, + forward_iterator_tag) +{ + size_type __n = 0; + distance(__first, __last, __n); + _M_initialize_map(__n); + + _Map_pointer __cur_node; + __STL_TRY { + for (__cur_node = _M_start._M_node; + __cur_node < _M_finish._M_node; + ++__cur_node) { + _ForwardIterator __mid = __first; + advance(__mid, _S_buffer_size()); + uninitialized_copy(__first, __mid, *__cur_node); + __first = __mid; + } + uninitialized_copy(__first, __last, _M_finish._M_first); + } + __STL_UNWIND(destroy(_M_start, iterator(*__cur_node, __cur_node))); +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +// Called only if _M_finish._M_cur == _M_finish._M_last - 1. +template +void deque<_Tp,_Alloc>::_M_push_back_aux(const value_type& __t) +{ + value_type __t_copy = __t; + _M_reserve_map_at_back(); + *(_M_finish._M_node + 1) = _M_allocate_node(); + __STL_TRY { + construct(_M_finish._M_cur, __t_copy); + _M_finish._M_set_node(_M_finish._M_node + 1); + _M_finish._M_cur = _M_finish._M_first; + } + __STL_UNWIND(_M_deallocate_node(*(_M_finish._M_node + 1))); +} + +// Called only if _M_finish._M_cur == _M_finish._M_last - 1. +template +void deque<_Tp,_Alloc>::_M_push_back_aux() +{ + _M_reserve_map_at_back(); + *(_M_finish._M_node + 1) = _M_allocate_node(); + __STL_TRY { + construct(_M_finish._M_cur); + _M_finish._M_set_node(_M_finish._M_node + 1); + _M_finish._M_cur = _M_finish._M_first; + } + __STL_UNWIND(_M_deallocate_node(*(_M_finish._M_node + 1))); +} + +// Called only if _M_start._M_cur == _M_start._M_first. +template +void deque<_Tp,_Alloc>::_M_push_front_aux(const value_type& __t) +{ + value_type __t_copy = __t; + _M_reserve_map_at_front(); + *(_M_start._M_node - 1) = _M_allocate_node(); + __STL_TRY { + _M_start._M_set_node(_M_start._M_node - 1); + _M_start._M_cur = _M_start._M_last - 1; + construct(_M_start._M_cur, __t_copy); + } + __STL_UNWIND((++_M_start, _M_deallocate_node(*(_M_start._M_node - 1)))); +} + +// Called only if _M_start._M_cur == _M_start._M_first. +template +void deque<_Tp,_Alloc>::_M_push_front_aux() +{ + _M_reserve_map_at_front(); + *(_M_start._M_node - 1) = _M_allocate_node(); + __STL_TRY { + _M_start._M_set_node(_M_start._M_node - 1); + _M_start._M_cur = _M_start._M_last - 1; + construct(_M_start._M_cur); + } + __STL_UNWIND((++_M_start, _M_deallocate_node(*(_M_start._M_node - 1)))); +} + +// Called only if _M_finish._M_cur == _M_finish._M_first. +template +void deque<_Tp,_Alloc>::_M_pop_back_aux() +{ + _M_deallocate_node(_M_finish._M_first); + _M_finish._M_set_node(_M_finish._M_node - 1); + _M_finish._M_cur = _M_finish._M_last - 1; + destroy(_M_finish._M_cur); +} + +// Called only if _M_start._M_cur == _M_start._M_last - 1. Note that +// if the deque has at least one element (a precondition for this member +// function), and if _M_start._M_cur == _M_start._M_last, then the deque +// must have at least two nodes. +template +void deque<_Tp,_Alloc>::_M_pop_front_aux() +{ + destroy(_M_start._M_cur); + _M_deallocate_node(_M_start._M_first); + _M_start._M_set_node(_M_start._M_node + 1); + _M_start._M_cur = _M_start._M_first; +} + +#ifdef __STL_MEMBER_TEMPLATES + +template template +void deque<_Tp,_Alloc>::insert(iterator __pos, + _InputIterator __first, _InputIterator __last, + input_iterator_tag) +{ + copy(__first, __last, inserter(*this, __pos)); +} + +template template +void +deque<_Tp,_Alloc>::insert(iterator __pos, + _ForwardIterator __first, _ForwardIterator __last, + forward_iterator_tag) { + size_type __n = 0; + distance(__first, __last, __n); + if (__pos._M_cur == _M_start._M_cur) { + iterator __new_start = _M_reserve_elements_at_front(__n); + __STL_TRY { + uninitialized_copy(__first, __last, __new_start); + _M_start = __new_start; + } + __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node)); + } + else if (__pos._M_cur == _M_finish._M_cur) { + iterator __new_finish = _M_reserve_elements_at_back(__n); + __STL_TRY { + uninitialized_copy(__first, __last, _M_finish); + _M_finish = __new_finish; + } + __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, + __new_finish._M_node + 1)); + } + else + _M_insert_aux(__pos, __first, __last, __n); +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +typename deque<_Tp, _Alloc>::iterator +deque<_Tp,_Alloc>::_M_insert_aux(iterator __pos, const value_type& __x) +{ + difference_type __index = __pos - _M_start; + value_type __x_copy = __x; + if (size_type(__index) < this->size() / 2) { + push_front(front()); + iterator __front1 = _M_start; + ++__front1; + iterator __front2 = __front1; + ++__front2; + __pos = _M_start + __index; + iterator __pos1 = __pos; + ++__pos1; + copy(__front2, __pos1, __front1); + } + else { + push_back(back()); + iterator __back1 = _M_finish; + --__back1; + iterator __back2 = __back1; + --__back2; + __pos = _M_start + __index; + copy_backward(__pos, __back2, __back1); + } + *__pos = __x_copy; + return __pos; +} + +template +typename deque<_Tp,_Alloc>::iterator +deque<_Tp,_Alloc>::_M_insert_aux(iterator __pos) +{ + difference_type __index = __pos - _M_start; + if (__index < size() / 2) { + push_front(front()); + iterator __front1 = _M_start; + ++__front1; + iterator __front2 = __front1; + ++__front2; + __pos = _M_start + __index; + iterator __pos1 = __pos; + ++__pos1; + copy(__front2, __pos1, __front1); + } + else { + push_back(back()); + iterator __back1 = _M_finish; + --__back1; + iterator __back2 = __back1; + --__back2; + __pos = _M_start + __index; + copy_backward(__pos, __back2, __back1); + } + *__pos = value_type(); + return __pos; +} + +template +void deque<_Tp,_Alloc>::_M_insert_aux(iterator __pos, + size_type __n, + const value_type& __x) +{ + const difference_type __elems_before = __pos - _M_start; + size_type __length = this->size(); + value_type __x_copy = __x; + if (__elems_before < difference_type(__length / 2)) { + iterator __new_start = _M_reserve_elements_at_front(__n); + iterator __old_start = _M_start; + __pos = _M_start + __elems_before; + __STL_TRY { + if (__elems_before >= difference_type(__n)) { + iterator __start_n = _M_start + difference_type(__n); + uninitialized_copy(_M_start, __start_n, __new_start); + _M_start = __new_start; + copy(__start_n, __pos, __old_start); + fill(__pos - difference_type(__n), __pos, __x_copy); + } + else { + __uninitialized_copy_fill(_M_start, __pos, __new_start, + _M_start, __x_copy); + _M_start = __new_start; + fill(__old_start, __pos, __x_copy); + } + } + __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node)); + } + else { + iterator __new_finish = _M_reserve_elements_at_back(__n); + iterator __old_finish = _M_finish; + const difference_type __elems_after = + difference_type(__length) - __elems_before; + __pos = _M_finish - __elems_after; + __STL_TRY { + if (__elems_after > difference_type(__n)) { + iterator __finish_n = _M_finish - difference_type(__n); + uninitialized_copy(__finish_n, _M_finish, _M_finish); + _M_finish = __new_finish; + copy_backward(__pos, __finish_n, __old_finish); + fill(__pos, __pos + difference_type(__n), __x_copy); + } + else { + __uninitialized_fill_copy(_M_finish, __pos + difference_type(__n), + __x_copy, __pos, _M_finish); + _M_finish = __new_finish; + fill(__pos, __old_finish, __x_copy); + } + } + __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, + __new_finish._M_node + 1)); + } +} + +#ifdef __STL_MEMBER_TEMPLATES + +template template +void deque<_Tp,_Alloc>::_M_insert_aux(iterator __pos, + _ForwardIterator __first, + _ForwardIterator __last, + size_type __n) +{ + const difference_type __elemsbefore = __pos - _M_start; + size_type __length = size(); + if (__elemsbefore < __length / 2) { + iterator __new_start = _M_reserve_elements_at_front(__n); + iterator __old_start = _M_start; + __pos = _M_start + __elemsbefore; + __STL_TRY { + if (__elemsbefore >= difference_type(__n)) { + iterator __start_n = _M_start + difference_type(__n); + uninitialized_copy(_M_start, __start_n, __new_start); + _M_start = __new_start; + copy(__start_n, __pos, __old_start); + copy(__first, __last, __pos - difference_type(__n)); + } + else { + _ForwardIterator __mid = __first; + advance(__mid, difference_type(__n) - __elemsbefore); + __uninitialized_copy_copy(_M_start, __pos, __first, __mid, + __new_start); + _M_start = __new_start; + copy(__mid, __last, __old_start); + } + } + __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node)); + } + else { + iterator __new_finish = _M_reserve_elements_at_back(__n); + iterator __old_finish = _M_finish; + const difference_type __elemsafter = + difference_type(__length) - __elemsbefore; + __pos = _M_finish - __elemsafter; + __STL_TRY { + if (__elemsafter > difference_type(__n)) { + iterator __finish_n = _M_finish - difference_type(__n); + uninitialized_copy(__finish_n, _M_finish, _M_finish); + _M_finish = __new_finish; + copy_backward(__pos, __finish_n, __old_finish); + copy(__first, __last, __pos); + } + else { + _ForwardIterator __mid = __first; + advance(__mid, __elemsafter); + __uninitialized_copy_copy(__mid, __last, __pos, _M_finish, _M_finish); + _M_finish = __new_finish; + copy(__first, __mid, __pos); + } + } + __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, + __new_finish._M_node + 1)); + } +} + +#else /* __STL_MEMBER_TEMPLATES */ + +template +void deque<_Tp,_Alloc>::_M_insert_aux(iterator __pos, + const value_type* __first, + const value_type* __last, + size_type __n) +{ + const difference_type __elemsbefore = __pos - _M_start; + size_type __length = size(); + if (__elemsbefore < __length / 2) { + iterator __new_start = _M_reserve_elements_at_front(__n); + iterator __old_start = _M_start; + __pos = _M_start + __elemsbefore; + __STL_TRY { + if (__elemsbefore >= difference_type(__n)) { + iterator __start_n = _M_start + difference_type(__n); + uninitialized_copy(_M_start, __start_n, __new_start); + _M_start = __new_start; + copy(__start_n, __pos, __old_start); + copy(__first, __last, __pos - difference_type(__n)); + } + else { + const value_type* __mid = + __first + (difference_type(__n) - __elemsbefore); + __uninitialized_copy_copy(_M_start, __pos, __first, __mid, + __new_start); + _M_start = __new_start; + copy(__mid, __last, __old_start); + } + } + __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node)); + } + else { + iterator __new_finish = _M_reserve_elements_at_back(__n); + iterator __old_finish = _M_finish; + const difference_type __elemsafter = + difference_type(__length) - __elemsbefore; + __pos = _M_finish - __elemsafter; + __STL_TRY { + if (__elemsafter > difference_type(__n)) { + iterator __finish_n = _M_finish - difference_type(__n); + uninitialized_copy(__finish_n, _M_finish, _M_finish); + _M_finish = __new_finish; + copy_backward(__pos, __finish_n, __old_finish); + copy(__first, __last, __pos); + } + else { + const value_type* __mid = __first + __elemsafter; + __uninitialized_copy_copy(__mid, __last, __pos, _M_finish, _M_finish); + _M_finish = __new_finish; + copy(__first, __mid, __pos); + } + } + __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, + __new_finish._M_node + 1)); + } +} + +template +void deque<_Tp,_Alloc>::_M_insert_aux(iterator __pos, + const_iterator __first, + const_iterator __last, + size_type __n) +{ + const difference_type __elemsbefore = __pos - _M_start; + size_type __length = size(); + if (__elemsbefore < __length / 2) { + iterator __new_start = _M_reserve_elements_at_front(__n); + iterator __old_start = _M_start; + __pos = _M_start + __elemsbefore; + __STL_TRY { + if (__elemsbefore >= __n) { + iterator __start_n = _M_start + __n; + uninitialized_copy(_M_start, __start_n, __new_start); + _M_start = __new_start; + copy(__start_n, __pos, __old_start); + copy(__first, __last, __pos - difference_type(__n)); + } + else { + const_iterator __mid = __first + (__n - __elemsbefore); + __uninitialized_copy_copy(_M_start, __pos, __first, __mid, + __new_start); + _M_start = __new_start; + copy(__mid, __last, __old_start); + } + } + __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node)); + } + else { + iterator __new_finish = _M_reserve_elements_at_back(__n); + iterator __old_finish = _M_finish; + const difference_type __elemsafter = __length - __elemsbefore; + __pos = _M_finish - __elemsafter; + __STL_TRY { + if (__elemsafter > __n) { + iterator __finish_n = _M_finish - difference_type(__n); + uninitialized_copy(__finish_n, _M_finish, _M_finish); + _M_finish = __new_finish; + copy_backward(__pos, __finish_n, __old_finish); + copy(__first, __last, __pos); + } + else { + const_iterator __mid = __first + __elemsafter; + __uninitialized_copy_copy(__mid, __last, __pos, _M_finish, _M_finish); + _M_finish = __new_finish; + copy(__first, __mid, __pos); + } + } + __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, + __new_finish._M_node + 1)); + } +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +void deque<_Tp,_Alloc>::_M_new_elements_at_front(size_type __new_elems) +{ + size_type __new_nodes + = (__new_elems + _S_buffer_size() - 1) / _S_buffer_size(); + _M_reserve_map_at_front(__new_nodes); + size_type __i; + __STL_TRY { + for (__i = 1; __i <= __new_nodes; ++__i) + *(_M_start._M_node - __i) = _M_allocate_node(); + } +# ifdef __STL_USE_EXCEPTIONS + catch(...) { + for (size_type __j = 1; __j < __i; ++__j) + _M_deallocate_node(*(_M_start._M_node - __j)); + throw; + } +# endif /* __STL_USE_EXCEPTIONS */ +} + +template +void deque<_Tp,_Alloc>::_M_new_elements_at_back(size_type __new_elems) +{ + size_type __new_nodes + = (__new_elems + _S_buffer_size() - 1) / _S_buffer_size(); + _M_reserve_map_at_back(__new_nodes); + size_type __i; + __STL_TRY { + for (__i = 1; __i <= __new_nodes; ++__i) + *(_M_finish._M_node + __i) = _M_allocate_node(); + } +# ifdef __STL_USE_EXCEPTIONS + catch(...) { + for (size_type __j = 1; __j < __i; ++__j) + _M_deallocate_node(*(_M_finish._M_node + __j)); + throw; + } +# endif /* __STL_USE_EXCEPTIONS */ +} + +template +void deque<_Tp,_Alloc>::_M_reallocate_map(size_type __nodes_to_add, + bool __add_at_front) +{ + size_type __old_num_nodes = _M_finish._M_node - _M_start._M_node + 1; + size_type __new_num_nodes = __old_num_nodes + __nodes_to_add; + + _Map_pointer __new_nstart; + if (_M_map_size > 2 * __new_num_nodes) { + __new_nstart = _M_map + (_M_map_size - __new_num_nodes) / 2 + + (__add_at_front ? __nodes_to_add : 0); + if (__new_nstart < _M_start._M_node) + copy(_M_start._M_node, _M_finish._M_node + 1, __new_nstart); + else + copy_backward(_M_start._M_node, _M_finish._M_node + 1, + __new_nstart + __old_num_nodes); + } + else { + size_type __new_map_size = + _M_map_size + max(_M_map_size, __nodes_to_add) + 2; + + _Map_pointer __new_map = _M_allocate_map(__new_map_size); + __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2 + + (__add_at_front ? __nodes_to_add : 0); + copy(_M_start._M_node, _M_finish._M_node + 1, __new_nstart); + _M_deallocate_map(_M_map, _M_map_size); + + _M_map = __new_map; + _M_map_size = __new_map_size; + } + + _M_start._M_set_node(__new_nstart); + _M_finish._M_set_node(__new_nstart + __old_num_nodes - 1); +} + + +// Nonmember functions. + +template +inline bool operator==(const deque<_Tp, _Alloc>& __x, + const deque<_Tp, _Alloc>& __y) { + return __x.size() == __y.size() && + equal(__x.begin(), __x.end(), __y.begin()); +} + +template +inline bool operator<(const deque<_Tp, _Alloc>& __x, + const deque<_Tp, _Alloc>& __y) { + return lexicographical_compare(__x.begin(), __x.end(), + __y.begin(), __y.end()); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const deque<_Tp, _Alloc>& __x, + const deque<_Tp, _Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool operator>(const deque<_Tp, _Alloc>& __x, + const deque<_Tp, _Alloc>& __y) { + return __y < __x; +} + +template +inline bool operator<=(const deque<_Tp, _Alloc>& __x, + const deque<_Tp, _Alloc>& __y) { + return !(__y < __x); +} +template +inline bool operator>=(const deque<_Tp, _Alloc>& __x, + const deque<_Tp, _Alloc>& __y) { + return !(__x < __y); +} + +template +inline void swap(deque<_Tp,_Alloc>& __x, deque<_Tp,_Alloc>& __y) { + __x.swap(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_DEQUE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_exception.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_exception.h new file mode 100644 index 0000000..37b54d7 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_exception.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 1998 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_EXCEPTION_H +#define __SGI_STL_EXCEPTION_H + +// This header exists solely for portability. Normally it just includes +// the header . + +// The header contains low-level functions that interact +// with a compiler's exception-handling mechanism. It is assumed to +// be supplied with the compiler, rather than with the library, because +// it is inherently tied very closely to the compiler itself. + +// On platforms where does not exist, this header defines +// an exception base class. This is *not* a substitute for everything +// in , but it suffices to support a bare minimum of STL +// functionality. + +#include + +#ifndef __STL_NO_EXCEPTION_HEADER + +#include +#define __STL_EXCEPTION_BASE exception + +#else /* __STL_NO_EXCEPTION_HEADER */ + +__STL_BEGIN_NAMESPACE + +class _Exception { +public: + virtual ~_Exception() __STL_NOTHROW {} + virtual const char* what() const __STL_NOTHROW { return ""; } +}; + +#define __STL_EXCEPTION_BASE _Exception + +__STL_END_NAMESPACE + +#endif /* __STL_NO_EXCEPTION_HEADER */ + +#endif /* __SGI_STL_EXCEPTION_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_function.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_function.h new file mode 100644 index 0000000..90752e2 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_function.h @@ -0,0 +1,725 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996-1998 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_FUNCTION_H +#define __SGI_STL_INTERNAL_FUNCTION_H + +__STL_BEGIN_NAMESPACE + +template +struct unary_function { + typedef _Arg argument_type; + typedef _Result result_type; +}; + +template +struct binary_function { + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; +}; + +template +struct plus : public binary_function<_Tp,_Tp,_Tp> { + _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; } +}; + +template +struct minus : public binary_function<_Tp,_Tp,_Tp> { + _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; } +}; + +template +struct multiplies : public binary_function<_Tp,_Tp,_Tp> { + _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; } +}; + +template +struct divides : public binary_function<_Tp,_Tp,_Tp> { + _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x / __y; } +}; + +// identity_element (not part of the C++ standard). + +template inline _Tp identity_element(plus<_Tp>) { + return _Tp(0); +} +template inline _Tp identity_element(multiplies<_Tp>) { + return _Tp(1); +} + +template +struct modulus : public binary_function<_Tp,_Tp,_Tp> +{ + _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x % __y; } +}; + +template +struct negate : public unary_function<_Tp,_Tp> +{ + _Tp operator()(const _Tp& __x) const { return -__x; } +}; + +template +struct equal_to : public binary_function<_Tp,_Tp,bool> +{ + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; } +}; + +template +struct not_equal_to : public binary_function<_Tp,_Tp,bool> +{ + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x != __y; } +}; + +template +struct greater : public binary_function<_Tp,_Tp,bool> +{ + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x > __y; } +}; + +template +struct less : public binary_function<_Tp,_Tp,bool> +{ + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; } +}; + +template +struct greater_equal : public binary_function<_Tp,_Tp,bool> +{ + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x >= __y; } +}; + +template +struct less_equal : public binary_function<_Tp,_Tp,bool> +{ + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x <= __y; } +}; + +template +struct logical_and : public binary_function<_Tp,_Tp,bool> +{ + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x && __y; } +}; + +template +struct logical_or : public binary_function<_Tp,_Tp,bool> +{ + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x || __y; } +}; + +template +struct logical_not : public unary_function<_Tp,bool> +{ + bool operator()(const _Tp& __x) const { return !__x; } +}; + +template +class unary_negate + : public unary_function { +protected: + _Predicate _M_pred; +public: + explicit unary_negate(const _Predicate& __x) : _M_pred(__x) {} + bool operator()(const typename _Predicate::argument_type& __x) const { + return !_M_pred(__x); + } +}; + +template +inline unary_negate<_Predicate> +not1(const _Predicate& __pred) +{ + return unary_negate<_Predicate>(__pred); +} + +template +class binary_negate + : public binary_function { +protected: + _Predicate _M_pred; +public: + explicit binary_negate(const _Predicate& __x) : _M_pred(__x) {} + bool operator()(const typename _Predicate::first_argument_type& __x, + const typename _Predicate::second_argument_type& __y) const + { + return !_M_pred(__x, __y); + } +}; + +template +inline binary_negate<_Predicate> +not2(const _Predicate& __pred) +{ + return binary_negate<_Predicate>(__pred); +} + +template +class binder1st + : public unary_function { +protected: + _Operation op; + typename _Operation::first_argument_type value; +public: + binder1st(const _Operation& __x, + const typename _Operation::first_argument_type& __y) + : op(__x), value(__y) {} + typename _Operation::result_type + operator()(const typename _Operation::second_argument_type& __x) const { + return op(value, __x); + } +}; + +template +inline binder1st<_Operation> +bind1st(const _Operation& __fn, const _Tp& __x) +{ + typedef typename _Operation::first_argument_type _Arg1_type; + return binder1st<_Operation>(__fn, _Arg1_type(__x)); +} + +template +class binder2nd + : public unary_function { +protected: + _Operation op; + typename _Operation::second_argument_type value; +public: + binder2nd(const _Operation& __x, + const typename _Operation::second_argument_type& __y) + : op(__x), value(__y) {} + typename _Operation::result_type + operator()(const typename _Operation::first_argument_type& __x) const { + return op(__x, value); + } +}; + +template +inline binder2nd<_Operation> +bind2nd(const _Operation& __fn, const _Tp& __x) +{ + typedef typename _Operation::second_argument_type _Arg2_type; + return binder2nd<_Operation>(__fn, _Arg2_type(__x)); +} + +// unary_compose and binary_compose (extensions, not part of the standard). + +template +class unary_compose + : public unary_function +{ +protected: + _Operation1 _M_fn1; + _Operation2 _M_fn2; +public: + unary_compose(const _Operation1& __x, const _Operation2& __y) + : _M_fn1(__x), _M_fn2(__y) {} + typename _Operation1::result_type + operator()(const typename _Operation2::argument_type& __x) const { + return _M_fn1(_M_fn2(__x)); + } +}; + +template +inline unary_compose<_Operation1,_Operation2> +compose1(const _Operation1& __fn1, const _Operation2& __fn2) +{ + return unary_compose<_Operation1,_Operation2>(__fn1, __fn2); +} + +template +class binary_compose + : public unary_function { +protected: + _Operation1 _M_fn1; + _Operation2 _M_fn2; + _Operation3 _M_fn3; +public: + binary_compose(const _Operation1& __x, const _Operation2& __y, + const _Operation3& __z) + : _M_fn1(__x), _M_fn2(__y), _M_fn3(__z) { } + typename _Operation1::result_type + operator()(const typename _Operation2::argument_type& __x) const { + return _M_fn1(_M_fn2(__x), _M_fn3(__x)); + } +}; + +template +inline binary_compose<_Operation1, _Operation2, _Operation3> +compose2(const _Operation1& __fn1, const _Operation2& __fn2, + const _Operation3& __fn3) +{ + return binary_compose<_Operation1,_Operation2,_Operation3> + (__fn1, __fn2, __fn3); +} + +template +class pointer_to_unary_function : public unary_function<_Arg, _Result> { +protected: + _Result (*_M_ptr)(_Arg); +public: + pointer_to_unary_function() {} + explicit pointer_to_unary_function(_Result (*__x)(_Arg)) : _M_ptr(__x) {} + _Result operator()(_Arg __x) const { return _M_ptr(__x); } +}; + +template +inline pointer_to_unary_function<_Arg, _Result> ptr_fun(_Result (*__x)(_Arg)) +{ + return pointer_to_unary_function<_Arg, _Result>(__x); +} + +template +class pointer_to_binary_function : + public binary_function<_Arg1,_Arg2,_Result> { +protected: + _Result (*_M_ptr)(_Arg1, _Arg2); +public: + pointer_to_binary_function() {} + explicit pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2)) + : _M_ptr(__x) {} + _Result operator()(_Arg1 __x, _Arg2 __y) const { + return _M_ptr(__x, __y); + } +}; + +template +inline pointer_to_binary_function<_Arg1,_Arg2,_Result> +ptr_fun(_Result (*__x)(_Arg1, _Arg2)) { + return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__x); +} + +// identity is an extensions: it is not part of the standard. +template +struct _Identity : public unary_function<_Tp,_Tp> { + const _Tp& operator()(const _Tp& __x) const { return __x; } +}; + +template struct identity : public _Identity<_Tp> {}; + +// select1st and select2nd are extensions: they are not part of the standard. +template +struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { + const typename _Pair::first_type& operator()(const _Pair& __x) const { + return __x.first; + } +}; + +template +struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type> +{ + const typename _Pair::second_type& operator()(const _Pair& __x) const { + return __x.second; + } +}; + +template struct select1st : public _Select1st<_Pair> {}; +template struct select2nd : public _Select2nd<_Pair> {}; + +// project1st and project2nd are extensions: they are not part of the standard +template +struct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> { + _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; } +}; + +template +struct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> { + _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; } +}; + +template +struct project1st : public _Project1st<_Arg1, _Arg2> {}; + +template +struct project2nd : public _Project2nd<_Arg1, _Arg2> {}; + +// constant_void_fun, constant_unary_fun, and constant_binary_fun are +// extensions: they are not part of the standard. (The same, of course, +// is true of the helper functions constant0, constant1, and constant2.) + +template +struct _Constant_void_fun { + typedef _Result result_type; + result_type _M_val; + + _Constant_void_fun(const result_type& __v) : _M_val(__v) {} + const result_type& operator()() const { return _M_val; } +}; + +template +struct _Constant_unary_fun { + typedef _Argument argument_type; + typedef _Result result_type; + result_type _M_val; + + _Constant_unary_fun(const result_type& __v) : _M_val(__v) {} + const result_type& operator()(const _Argument&) const { return _M_val; } +}; + +template +struct _Constant_binary_fun { + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; + _Result _M_val; + + _Constant_binary_fun(const _Result& __v) : _M_val(__v) {} + const result_type& operator()(const _Arg1&, const _Arg2&) const { + return _M_val; + } +}; + +template +struct constant_void_fun : public _Constant_void_fun<_Result> { + constant_void_fun(const _Result& __v) : _Constant_void_fun<_Result>(__v) {} +}; + + +template +struct constant_unary_fun : public _Constant_unary_fun<_Result, _Argument> +{ + constant_unary_fun(const _Result& __v) + : _Constant_unary_fun<_Result, _Argument>(__v) {} +}; + + +template +struct constant_binary_fun + : public _Constant_binary_fun<_Result, _Arg1, _Arg2> +{ + constant_binary_fun(const _Result& __v) + : _Constant_binary_fun<_Result, _Arg1, _Arg2>(__v) {} +}; + +template +inline constant_void_fun<_Result> constant0(const _Result& __val) +{ + return constant_void_fun<_Result>(__val); +} + +template +inline constant_unary_fun<_Result,_Result> constant1(const _Result& __val) +{ + return constant_unary_fun<_Result,_Result>(__val); +} + +template +inline constant_binary_fun<_Result,_Result,_Result> +constant2(const _Result& __val) +{ + return constant_binary_fun<_Result,_Result,_Result>(__val); +} + +// subtractive_rng is an extension: it is not part of the standard. +// Note: this code assumes that int is 32 bits. +class subtractive_rng : public unary_function { +private: + unsigned int _M_table[55]; + size_t _M_index1; + size_t _M_index2; +public: + unsigned int operator()(unsigned int __limit) { + _M_index1 = (_M_index1 + 1) % 55; + _M_index2 = (_M_index2 + 1) % 55; + _M_table[_M_index1] = _M_table[_M_index1] - _M_table[_M_index2]; + return _M_table[_M_index1] % __limit; + } + + void _M_initialize(unsigned int __seed) + { + unsigned int __k = 1; + _M_table[54] = __seed; + size_t __i; + for (__i = 0; __i < 54; __i++) { + size_t __ii = (21 * (__i + 1) % 55) - 1; + _M_table[__ii] = __k; + __k = __seed - __k; + __seed = _M_table[__ii]; + } + for (int __loop = 0; __loop < 4; __loop++) { + for (__i = 0; __i < 55; __i++) + _M_table[__i] = _M_table[__i] - _M_table[(1 + __i + 30) % 55]; + } + _M_index1 = 0; + _M_index2 = 31; + } + + subtractive_rng(unsigned int __seed) { _M_initialize(__seed); } + subtractive_rng() { _M_initialize(161803398u); } +}; + + +// Adaptor function objects: pointers to member functions. + +// There are a total of 16 = 2^4 function objects in this family. +// (1) Member functions taking no arguments vs member functions taking +// one argument. +// (2) Call through pointer vs call through reference. +// (3) Member function with void return type vs member function with +// non-void return type. +// (4) Const vs non-const member function. + +// Note that choice (3) is nothing more than a workaround: according +// to the draft, compilers should handle void and non-void the same way. +// This feature is not yet widely implemented, though. You can only use +// member functions returning void if your compiler supports partial +// specialization. + +// All of this complexity is in the function objects themselves. You can +// ignore it by using the helper function mem_fun and mem_fun_ref, +// which create whichever type of adaptor is appropriate. +// (mem_fun1 and mem_fun1_ref are no longer part of the C++ standard, +// but they are provided for backward compatibility.) + + +template +class mem_fun_t : public unary_function<_Tp*,_Ret> { +public: + explicit mem_fun_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {} + _Ret operator()(_Tp* __p) const { return (__p->*_M_f)(); } +private: + _Ret (_Tp::*_M_f)(); +}; + +template +class const_mem_fun_t : public unary_function { +public: + explicit const_mem_fun_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {} + _Ret operator()(const _Tp* __p) const { return (__p->*_M_f)(); } +private: + _Ret (_Tp::*_M_f)() const; +}; + + +template +class mem_fun_ref_t : public unary_function<_Tp,_Ret> { +public: + explicit mem_fun_ref_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {} + _Ret operator()(_Tp& __r) const { return (__r.*_M_f)(); } +private: + _Ret (_Tp::*_M_f)(); +}; + +template +class const_mem_fun_ref_t : public unary_function<_Tp,_Ret> { +public: + explicit const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {} + _Ret operator()(const _Tp& __r) const { return (__r.*_M_f)(); } +private: + _Ret (_Tp::*_M_f)() const; +}; + +template +class mem_fun1_t : public binary_function<_Tp*,_Arg,_Ret> { +public: + explicit mem_fun1_t(_Ret (_Tp::*__pf)(_Arg)) : _M_f(__pf) {} + _Ret operator()(_Tp* __p, _Arg __x) const { return (__p->*_M_f)(__x); } +private: + _Ret (_Tp::*_M_f)(_Arg); +}; + +template +class const_mem_fun1_t : public binary_function { +public: + explicit const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {} + _Ret operator()(const _Tp* __p, _Arg __x) const + { return (__p->*_M_f)(__x); } +private: + _Ret (_Tp::*_M_f)(_Arg) const; +}; + +template +class mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret> { +public: + explicit mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg)) : _M_f(__pf) {} + _Ret operator()(_Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); } +private: + _Ret (_Tp::*_M_f)(_Arg); +}; + +template +class const_mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret> { +public: + explicit const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {} + _Ret operator()(const _Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); } +private: + _Ret (_Tp::*_M_f)(_Arg) const; +}; + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +class mem_fun_t : public unary_function<_Tp*,void> { +public: + explicit mem_fun_t(void (_Tp::*__pf)()) : _M_f(__pf) {} + void operator()(_Tp* __p) const { (__p->*_M_f)(); } +private: + void (_Tp::*_M_f)(); +}; + +template +class const_mem_fun_t : public unary_function { +public: + explicit const_mem_fun_t(void (_Tp::*__pf)() const) : _M_f(__pf) {} + void operator()(const _Tp* __p) const { (__p->*_M_f)(); } +private: + void (_Tp::*_M_f)() const; +}; + +template +class mem_fun_ref_t : public unary_function<_Tp,void> { +public: + explicit mem_fun_ref_t(void (_Tp::*__pf)()) : _M_f(__pf) {} + void operator()(_Tp& __r) const { (__r.*_M_f)(); } +private: + void (_Tp::*_M_f)(); +}; + +template +class const_mem_fun_ref_t : public unary_function<_Tp,void> { +public: + explicit const_mem_fun_ref_t(void (_Tp::*__pf)() const) : _M_f(__pf) {} + void operator()(const _Tp& __r) const { (__r.*_M_f)(); } +private: + void (_Tp::*_M_f)() const; +}; + +template +class mem_fun1_t : public binary_function<_Tp*,_Arg,void> { +public: + explicit mem_fun1_t(void (_Tp::*__pf)(_Arg)) : _M_f(__pf) {} + void operator()(_Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); } +private: + void (_Tp::*_M_f)(_Arg); +}; + +template +class const_mem_fun1_t + : public binary_function { +public: + explicit const_mem_fun1_t(void (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {} + void operator()(const _Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); } +private: + void (_Tp::*_M_f)(_Arg) const; +}; + +template +class mem_fun1_ref_t + : public binary_function<_Tp,_Arg,void> { +public: + explicit mem_fun1_ref_t(void (_Tp::*__pf)(_Arg)) : _M_f(__pf) {} + void operator()(_Tp& __r, _Arg __x) const { (__r.*_M_f)(__x); } +private: + void (_Tp::*_M_f)(_Arg); +}; + +template +class const_mem_fun1_ref_t + : public binary_function<_Tp,_Arg,void> { +public: + explicit const_mem_fun1_ref_t(void (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {} + void operator()(const _Tp& __r, _Arg __x) const { (__r.*_M_f)(__x); } +private: + void (_Tp::*_M_f)(_Arg) const; +}; + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +// Mem_fun adaptor helper functions. There are only two: +// mem_fun and mem_fun_ref. (mem_fun1 and mem_fun1_ref +// are provided for backward compatibility, but they are no longer +// part of the C++ standard.) + +template +inline mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)()) + { return mem_fun_t<_Ret,_Tp>(__f); } + +template +inline const_mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)() const) + { return const_mem_fun_t<_Ret,_Tp>(__f); } + +template +inline mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)()) + { return mem_fun_ref_t<_Ret,_Tp>(__f); } + +template +inline const_mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)() const) + { return const_mem_fun_ref_t<_Ret,_Tp>(__f); } + +template +inline mem_fun1_t<_Ret,_Tp,_Arg> mem_fun(_Ret (_Tp::*__f)(_Arg)) + { return mem_fun1_t<_Ret,_Tp,_Arg>(__f); } + +template +inline const_mem_fun1_t<_Ret,_Tp,_Arg> mem_fun(_Ret (_Tp::*__f)(_Arg) const) + { return const_mem_fun1_t<_Ret,_Tp,_Arg>(__f); } + +template +inline mem_fun1_ref_t<_Ret,_Tp,_Arg> mem_fun_ref(_Ret (_Tp::*__f)(_Arg)) + { return mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f); } + +template +inline const_mem_fun1_ref_t<_Ret,_Tp,_Arg> +mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const) + { return const_mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f); } + +template +inline mem_fun1_t<_Ret,_Tp,_Arg> mem_fun1(_Ret (_Tp::*__f)(_Arg)) + { return mem_fun1_t<_Ret,_Tp,_Arg>(__f); } + +template +inline const_mem_fun1_t<_Ret,_Tp,_Arg> mem_fun1(_Ret (_Tp::*__f)(_Arg) const) + { return const_mem_fun1_t<_Ret,_Tp,_Arg>(__f); } + +template +inline mem_fun1_ref_t<_Ret,_Tp,_Arg> mem_fun1_ref(_Ret (_Tp::*__f)(_Arg)) + { return mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f); } + +template +inline const_mem_fun1_ref_t<_Ret,_Tp,_Arg> +mem_fun1_ref(_Ret (_Tp::*__f)(_Arg) const) + { return const_mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f); } + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_FUNCTION_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_fun.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_fun.h new file mode 100644 index 0000000..44ab9bb --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_fun.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 1996-1998 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_HASH_FUN_H +#define __SGI_STL_HASH_FUN_H + +#include + +__STL_BEGIN_NAMESPACE + +template struct hash { }; + +inline size_t __stl_hash_string(const char* __s) +{ + unsigned long __h = 0; + for ( ; *__s; ++__s) + __h = 5*__h + *__s; + + return size_t(__h); +} + +__STL_TEMPLATE_NULL struct hash +{ + size_t operator()(const char* __s) const { return __stl_hash_string(__s); } +}; + +__STL_TEMPLATE_NULL struct hash +{ + size_t operator()(const char* __s) const { return __stl_hash_string(__s); } +}; + +__STL_TEMPLATE_NULL struct hash { + size_t operator()(char __x) const { return __x; } +}; +__STL_TEMPLATE_NULL struct hash { + size_t operator()(unsigned char __x) const { return __x; } +}; +__STL_TEMPLATE_NULL struct hash { + size_t operator()(unsigned char __x) const { return __x; } +}; +__STL_TEMPLATE_NULL struct hash { + size_t operator()(short __x) const { return __x; } +}; +__STL_TEMPLATE_NULL struct hash { + size_t operator()(unsigned short __x) const { return __x; } +}; +__STL_TEMPLATE_NULL struct hash { + size_t operator()(int __x) const { return __x; } +}; +__STL_TEMPLATE_NULL struct hash { + size_t operator()(unsigned int __x) const { return __x; } +}; +__STL_TEMPLATE_NULL struct hash { + size_t operator()(long __x) const { return __x; } +}; +__STL_TEMPLATE_NULL struct hash { + size_t operator()(unsigned long __x) const { return __x; } +}; + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_HASH_FUN_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_map.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_map.h new file mode 100644 index 0000000..0d5bc8a --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_map.h @@ -0,0 +1,532 @@ +/* + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_HASH_MAP_H +#define __SGI_STL_INTERNAL_HASH_MAP_H + +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +// Forward declaration of equality operator; needed for friend declaration. + +template ), + class _EqualKey __STL_DEPENDENT_DEFAULT_TMPL(equal_to<_Key>), + class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) > +class hash_map; + +template +inline bool operator==(const hash_map<_Key, _Tp, _HashFn, _EqKey, _Alloc>&, + const hash_map<_Key, _Tp, _HashFn, _EqKey, _Alloc>&); + +template +class hash_map +{ + // requirements: + + __STL_CLASS_REQUIRES(_Key, _Assignable); + __STL_CLASS_REQUIRES(_Tp, _Assignable); + __STL_CLASS_UNARY_FUNCTION_CHECK(_HashFcn, size_t, _Key); + __STL_CLASS_BINARY_FUNCTION_CHECK(_EqualKey, bool, _Key, _Key); + +private: + typedef hashtable,_Key,_HashFcn, + _Select1st >,_EqualKey,_Alloc> _Ht; + _Ht _M_ht; + +public: + typedef typename _Ht::key_type key_type; + typedef _Tp data_type; + typedef _Tp mapped_type; + typedef typename _Ht::value_type value_type; + typedef typename _Ht::hasher hasher; + typedef typename _Ht::key_equal key_equal; + + typedef typename _Ht::size_type size_type; + typedef typename _Ht::difference_type difference_type; + typedef typename _Ht::pointer pointer; + typedef typename _Ht::const_pointer const_pointer; + typedef typename _Ht::reference reference; + typedef typename _Ht::const_reference const_reference; + + typedef typename _Ht::iterator iterator; + typedef typename _Ht::const_iterator const_iterator; + + typedef typename _Ht::allocator_type allocator_type; + + hasher hash_funct() const { return _M_ht.hash_funct(); } + key_equal key_eq() const { return _M_ht.key_eq(); } + allocator_type get_allocator() const { return _M_ht.get_allocator(); } + +public: + hash_map() : _M_ht(100, hasher(), key_equal(), allocator_type()) {} + explicit hash_map(size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) {} + hash_map(size_type __n, const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) {} + hash_map(size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) {} + +#ifdef __STL_MEMBER_TEMPLATES + template + hash_map(_InputIterator __f, _InputIterator __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + template + hash_map(_InputIterator __f, _InputIterator __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + template + hash_map(_InputIterator __f, _InputIterator __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + template + hash_map(_InputIterator __f, _InputIterator __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_unique(__f, __l); } + +#else + hash_map(const value_type* __f, const value_type* __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_map(const value_type* __f, const value_type* __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_map(const value_type* __f, const value_type* __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_map(const value_type* __f, const value_type* __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_unique(__f, __l); } + + hash_map(const_iterator __f, const_iterator __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_map(const_iterator __f, const_iterator __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_map(const_iterator __f, const_iterator __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_map(const_iterator __f, const_iterator __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_unique(__f, __l); } +#endif /*__STL_MEMBER_TEMPLATES */ + +public: + size_type size() const { return _M_ht.size(); } + size_type max_size() const { return _M_ht.max_size(); } + bool empty() const { return _M_ht.empty(); } + void swap(hash_map& __hs) { _M_ht.swap(__hs._M_ht); } + +#ifdef __STL_MEMBER_TEMPLATES + template + friend bool operator== (const hash_map<_K1, _T1, _HF, _EqK, _Al>&, + const hash_map<_K1, _T1, _HF, _EqK, _Al>&); +#else /* __STL_MEMBER_TEMPLATES */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const hash_map&, const hash_map&); +#endif /* __STL_MEMBER_TEMPLATES */ + + + iterator begin() { return _M_ht.begin(); } + iterator end() { return _M_ht.end(); } + const_iterator begin() const { return _M_ht.begin(); } + const_iterator end() const { return _M_ht.end(); } + +public: + pair insert(const value_type& __obj) + { return _M_ht.insert_unique(__obj); } +#ifdef __STL_MEMBER_TEMPLATES + template + void insert(_InputIterator __f, _InputIterator __l) + { _M_ht.insert_unique(__f,__l); } +#else + void insert(const value_type* __f, const value_type* __l) { + _M_ht.insert_unique(__f,__l); + } + void insert(const_iterator __f, const_iterator __l) + { _M_ht.insert_unique(__f, __l); } +#endif /*__STL_MEMBER_TEMPLATES */ + pair insert_noresize(const value_type& __obj) + { return _M_ht.insert_unique_noresize(__obj); } + + iterator find(const key_type& __key) { return _M_ht.find(__key); } + const_iterator find(const key_type& __key) const + { return _M_ht.find(__key); } + + _Tp& operator[](const key_type& __key) { + return _M_ht.find_or_insert(value_type(__key, _Tp())).second; + } + + size_type count(const key_type& __key) const { return _M_ht.count(__key); } + + pair equal_range(const key_type& __key) + { return _M_ht.equal_range(__key); } + pair + equal_range(const key_type& __key) const + { return _M_ht.equal_range(__key); } + + size_type erase(const key_type& __key) {return _M_ht.erase(__key); } + void erase(iterator __it) { _M_ht.erase(__it); } + void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); } + void clear() { _M_ht.clear(); } + + void resize(size_type __hint) { _M_ht.resize(__hint); } + size_type bucket_count() const { return _M_ht.bucket_count(); } + size_type max_bucket_count() const { return _M_ht.max_bucket_count(); } + size_type elems_in_bucket(size_type __n) const + { return _M_ht.elems_in_bucket(__n); } +}; + +template +inline bool +operator==(const hash_map<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>& __hm1, + const hash_map<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>& __hm2) +{ + return __hm1._M_ht == __hm2._M_ht; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!=(const hash_map<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>& __hm1, + const hash_map<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>& __hm2) { + return !(__hm1 == __hm2); +} + +template +inline void +swap(hash_map<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>& __hm1, + hash_map<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>& __hm2) +{ + __hm1.swap(__hm2); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// Forward declaration of equality operator; needed for friend declaration. + +template ), + class _EqualKey __STL_DEPENDENT_DEFAULT_TMPL(equal_to<_Key>), + class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) > +class hash_multimap; + +template +inline bool +operator==(const hash_multimap<_Key,_Tp,_HF,_EqKey,_Alloc>& __hm1, + const hash_multimap<_Key,_Tp,_HF,_EqKey,_Alloc>& __hm2); + +template +class hash_multimap +{ + // requirements: + + __STL_CLASS_REQUIRES(_Key, _Assignable); + __STL_CLASS_REQUIRES(_Tp, _Assignable); + __STL_CLASS_UNARY_FUNCTION_CHECK(_HashFcn, size_t, _Key); + __STL_CLASS_BINARY_FUNCTION_CHECK(_EqualKey, bool, _Key, _Key); + +private: + typedef hashtable, _Key, _HashFcn, + _Select1st >, _EqualKey, _Alloc> + _Ht; + _Ht _M_ht; + +public: + typedef typename _Ht::key_type key_type; + typedef _Tp data_type; + typedef _Tp mapped_type; + typedef typename _Ht::value_type value_type; + typedef typename _Ht::hasher hasher; + typedef typename _Ht::key_equal key_equal; + + typedef typename _Ht::size_type size_type; + typedef typename _Ht::difference_type difference_type; + typedef typename _Ht::pointer pointer; + typedef typename _Ht::const_pointer const_pointer; + typedef typename _Ht::reference reference; + typedef typename _Ht::const_reference const_reference; + + typedef typename _Ht::iterator iterator; + typedef typename _Ht::const_iterator const_iterator; + + typedef typename _Ht::allocator_type allocator_type; + + hasher hash_funct() const { return _M_ht.hash_funct(); } + key_equal key_eq() const { return _M_ht.key_eq(); } + allocator_type get_allocator() const { return _M_ht.get_allocator(); } + +public: + hash_multimap() : _M_ht(100, hasher(), key_equal(), allocator_type()) {} + explicit hash_multimap(size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) {} + hash_multimap(size_type __n, const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) {} + hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) {} + +#ifdef __STL_MEMBER_TEMPLATES + template + hash_multimap(_InputIterator __f, _InputIterator __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + template + hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + template + hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + template + hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_equal(__f, __l); } + +#else + hash_multimap(const value_type* __f, const value_type* __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multimap(const value_type* __f, const value_type* __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multimap(const value_type* __f, const value_type* __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multimap(const value_type* __f, const value_type* __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_equal(__f, __l); } + + hash_multimap(const_iterator __f, const_iterator __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multimap(const_iterator __f, const_iterator __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multimap(const_iterator __f, const_iterator __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multimap(const_iterator __f, const_iterator __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_equal(__f, __l); } +#endif /*__STL_MEMBER_TEMPLATES */ + +public: + size_type size() const { return _M_ht.size(); } + size_type max_size() const { return _M_ht.max_size(); } + bool empty() const { return _M_ht.empty(); } + void swap(hash_multimap& __hs) { _M_ht.swap(__hs._M_ht); } + +#ifdef __STL_MEMBER_TEMPLATES + template + friend bool operator== (const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&, + const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&); +#else /* __STL_MEMBER_TEMPLATES */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const hash_multimap&,const hash_multimap&); +#endif /* __STL_MEMBER_TEMPLATES */ + + iterator begin() { return _M_ht.begin(); } + iterator end() { return _M_ht.end(); } + const_iterator begin() const { return _M_ht.begin(); } + const_iterator end() const { return _M_ht.end(); } + +public: + iterator insert(const value_type& __obj) + { return _M_ht.insert_equal(__obj); } +#ifdef __STL_MEMBER_TEMPLATES + template + void insert(_InputIterator __f, _InputIterator __l) + { _M_ht.insert_equal(__f,__l); } +#else + void insert(const value_type* __f, const value_type* __l) { + _M_ht.insert_equal(__f,__l); + } + void insert(const_iterator __f, const_iterator __l) + { _M_ht.insert_equal(__f, __l); } +#endif /*__STL_MEMBER_TEMPLATES */ + iterator insert_noresize(const value_type& __obj) + { return _M_ht.insert_equal_noresize(__obj); } + + iterator find(const key_type& __key) { return _M_ht.find(__key); } + const_iterator find(const key_type& __key) const + { return _M_ht.find(__key); } + + size_type count(const key_type& __key) const { return _M_ht.count(__key); } + + pair equal_range(const key_type& __key) + { return _M_ht.equal_range(__key); } + pair + equal_range(const key_type& __key) const + { return _M_ht.equal_range(__key); } + + size_type erase(const key_type& __key) {return _M_ht.erase(__key); } + void erase(iterator __it) { _M_ht.erase(__it); } + void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); } + void clear() { _M_ht.clear(); } + +public: + void resize(size_type __hint) { _M_ht.resize(__hint); } + size_type bucket_count() const { return _M_ht.bucket_count(); } + size_type max_bucket_count() const { return _M_ht.max_bucket_count(); } + size_type elems_in_bucket(size_type __n) const + { return _M_ht.elems_in_bucket(__n); } +}; + +template +inline bool +operator==(const hash_multimap<_Key,_Tp,_HF,_EqKey,_Alloc>& __hm1, + const hash_multimap<_Key,_Tp,_HF,_EqKey,_Alloc>& __hm2) +{ + return __hm1._M_ht == __hm2._M_ht; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!=(const hash_multimap<_Key,_Tp,_HF,_EqKey,_Alloc>& __hm1, + const hash_multimap<_Key,_Tp,_HF,_EqKey,_Alloc>& __hm2) { + return !(__hm1 == __hm2); +} + +template +inline void +swap(hash_multimap<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>& __hm1, + hash_multimap<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>& __hm2) +{ + __hm1.swap(__hm2); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// Specialization of insert_iterator so that it will work for hash_map +// and hash_multimap. + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +class insert_iterator > { +protected: + typedef hash_map<_Key, _Tp, _HashFn, _EqKey, _Alloc> _Container; + _Container* container; +public: + typedef _Container container_type; + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + insert_iterator(_Container& __x) : container(&__x) {} + insert_iterator(_Container& __x, typename _Container::iterator) + : container(&__x) {} + insert_iterator<_Container>& + operator=(const typename _Container::value_type& __value) { + container->insert(__value); + return *this; + } + insert_iterator<_Container>& operator*() { return *this; } + insert_iterator<_Container>& operator++() { return *this; } + insert_iterator<_Container>& operator++(int) { return *this; } +}; + +template +class insert_iterator > { +protected: + typedef hash_multimap<_Key, _Tp, _HashFn, _EqKey, _Alloc> _Container; + _Container* container; + typename _Container::iterator iter; +public: + typedef _Container container_type; + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + insert_iterator(_Container& __x) : container(&__x) {} + insert_iterator(_Container& __x, typename _Container::iterator) + : container(&__x) {} + insert_iterator<_Container>& + operator=(const typename _Container::value_type& __value) { + container->insert(__value); + return *this; + } + insert_iterator<_Container>& operator*() { return *this; } + insert_iterator<_Container>& operator++() { return *this; } + insert_iterator<_Container>& operator++(int) { return *this; } +}; + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_HASH_MAP_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_set.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_set.h new file mode 100644 index 0000000..a4b845b --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hash_set.h @@ -0,0 +1,514 @@ +/* + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_HASH_SET_H +#define __SGI_STL_INTERNAL_HASH_SET_H + +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +// Forward declaration of equality operator; needed for friend declaration. + +template ), + class _EqualKey __STL_DEPENDENT_DEFAULT_TMPL(equal_to<_Value>), + class _Alloc = __STL_DEFAULT_ALLOCATOR(_Value) > +class hash_set; + +template +inline bool +operator==(const hash_set<_Value,_HashFcn,_EqualKey,_Alloc>& __hs1, + const hash_set<_Value,_HashFcn,_EqualKey,_Alloc>& __hs2); + +template +class hash_set +{ + // requirements: + + __STL_CLASS_REQUIRES(_Value, _Assignable); + __STL_CLASS_UNARY_FUNCTION_CHECK(_HashFcn, size_t, _Value); + __STL_CLASS_BINARY_FUNCTION_CHECK(_EqualKey, bool, _Value, _Value); + +private: + typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>, + _EqualKey, _Alloc> _Ht; + _Ht _M_ht; + +public: + typedef typename _Ht::key_type key_type; + typedef typename _Ht::value_type value_type; + typedef typename _Ht::hasher hasher; + typedef typename _Ht::key_equal key_equal; + + typedef typename _Ht::size_type size_type; + typedef typename _Ht::difference_type difference_type; + typedef typename _Ht::const_pointer pointer; + typedef typename _Ht::const_pointer const_pointer; + typedef typename _Ht::const_reference reference; + typedef typename _Ht::const_reference const_reference; + + typedef typename _Ht::const_iterator iterator; + typedef typename _Ht::const_iterator const_iterator; + + typedef typename _Ht::allocator_type allocator_type; + + hasher hash_funct() const { return _M_ht.hash_funct(); } + key_equal key_eq() const { return _M_ht.key_eq(); } + allocator_type get_allocator() const { return _M_ht.get_allocator(); } + +public: + hash_set() + : _M_ht(100, hasher(), key_equal(), allocator_type()) {} + explicit hash_set(size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) {} + hash_set(size_type __n, const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) {} + hash_set(size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) {} + +#ifdef __STL_MEMBER_TEMPLATES + template + hash_set(_InputIterator __f, _InputIterator __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + template + hash_set(_InputIterator __f, _InputIterator __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + template + hash_set(_InputIterator __f, _InputIterator __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + template + hash_set(_InputIterator __f, _InputIterator __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_unique(__f, __l); } +#else + + hash_set(const value_type* __f, const value_type* __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_set(const value_type* __f, const value_type* __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_set(const value_type* __f, const value_type* __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_set(const value_type* __f, const value_type* __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_unique(__f, __l); } + + hash_set(const_iterator __f, const_iterator __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_set(const_iterator __f, const_iterator __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_set(const_iterator __f, const_iterator __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_unique(__f, __l); } + hash_set(const_iterator __f, const_iterator __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_unique(__f, __l); } +#endif /*__STL_MEMBER_TEMPLATES */ + +public: + size_type size() const { return _M_ht.size(); } + size_type max_size() const { return _M_ht.max_size(); } + bool empty() const { return _M_ht.empty(); } + void swap(hash_set& __hs) { _M_ht.swap(__hs._M_ht); } + +#ifdef __STL_MEMBER_TEMPLATES + template + friend bool operator== (const hash_set<_Val, _HF, _EqK, _Al>&, + const hash_set<_Val, _HF, _EqK, _Al>&); +#else /* __STL_MEMBER_TEMPLATES */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const hash_set&, const hash_set&); +#endif /* __STL_MEMBER_TEMPLATES */ + + iterator begin() const { return _M_ht.begin(); } + iterator end() const { return _M_ht.end(); } + +public: + pair insert(const value_type& __obj) + { + pair __p = _M_ht.insert_unique(__obj); + return pair(__p.first, __p.second); + } +#ifdef __STL_MEMBER_TEMPLATES + template + void insert(_InputIterator __f, _InputIterator __l) + { _M_ht.insert_unique(__f,__l); } +#else + void insert(const value_type* __f, const value_type* __l) { + _M_ht.insert_unique(__f,__l); + } + void insert(const_iterator __f, const_iterator __l) + {_M_ht.insert_unique(__f, __l); } +#endif /*__STL_MEMBER_TEMPLATES */ + pair insert_noresize(const value_type& __obj) + { + pair __p = + _M_ht.insert_unique_noresize(__obj); + return pair(__p.first, __p.second); + } + + iterator find(const key_type& __key) const { return _M_ht.find(__key); } + + size_type count(const key_type& __key) const { return _M_ht.count(__key); } + + pair equal_range(const key_type& __key) const + { return _M_ht.equal_range(__key); } + + size_type erase(const key_type& __key) {return _M_ht.erase(__key); } + void erase(iterator __it) { _M_ht.erase(__it); } + void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); } + void clear() { _M_ht.clear(); } + +public: + void resize(size_type __hint) { _M_ht.resize(__hint); } + size_type bucket_count() const { return _M_ht.bucket_count(); } + size_type max_bucket_count() const { return _M_ht.max_bucket_count(); } + size_type elems_in_bucket(size_type __n) const + { return _M_ht.elems_in_bucket(__n); } +}; + +template +inline bool +operator==(const hash_set<_Value,_HashFcn,_EqualKey,_Alloc>& __hs1, + const hash_set<_Value,_HashFcn,_EqualKey,_Alloc>& __hs2) +{ + return __hs1._M_ht == __hs2._M_ht; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!=(const hash_set<_Value,_HashFcn,_EqualKey,_Alloc>& __hs1, + const hash_set<_Value,_HashFcn,_EqualKey,_Alloc>& __hs2) { + return !(__hs1 == __hs2); +} + +template +inline void +swap(hash_set<_Val,_HashFcn,_EqualKey,_Alloc>& __hs1, + hash_set<_Val,_HashFcn,_EqualKey,_Alloc>& __hs2) +{ + __hs1.swap(__hs2); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + + +template ), + class _EqualKey __STL_DEPENDENT_DEFAULT_TMPL(equal_to<_Value>), + class _Alloc = __STL_DEFAULT_ALLOCATOR(_Value) > +class hash_multiset; + +template +inline bool +operator==(const hash_multiset<_Val,_HashFcn,_EqualKey,_Alloc>& __hs1, + const hash_multiset<_Val,_HashFcn,_EqualKey,_Alloc>& __hs2); + + +template +class hash_multiset +{ + // requirements: + + __STL_CLASS_REQUIRES(_Value, _Assignable); + __STL_CLASS_UNARY_FUNCTION_CHECK(_HashFcn, size_t, _Value); + __STL_CLASS_BINARY_FUNCTION_CHECK(_EqualKey, bool, _Value, _Value); + +private: + typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>, + _EqualKey, _Alloc> _Ht; + _Ht _M_ht; + +public: + typedef typename _Ht::key_type key_type; + typedef typename _Ht::value_type value_type; + typedef typename _Ht::hasher hasher; + typedef typename _Ht::key_equal key_equal; + + typedef typename _Ht::size_type size_type; + typedef typename _Ht::difference_type difference_type; + typedef typename _Ht::const_pointer pointer; + typedef typename _Ht::const_pointer const_pointer; + typedef typename _Ht::const_reference reference; + typedef typename _Ht::const_reference const_reference; + + typedef typename _Ht::const_iterator iterator; + typedef typename _Ht::const_iterator const_iterator; + + typedef typename _Ht::allocator_type allocator_type; + + hasher hash_funct() const { return _M_ht.hash_funct(); } + key_equal key_eq() const { return _M_ht.key_eq(); } + allocator_type get_allocator() const { return _M_ht.get_allocator(); } + +public: + hash_multiset() + : _M_ht(100, hasher(), key_equal(), allocator_type()) {} + explicit hash_multiset(size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) {} + hash_multiset(size_type __n, const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) {} + hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) {} + +#ifdef __STL_MEMBER_TEMPLATES + template + hash_multiset(_InputIterator __f, _InputIterator __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + template + hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + template + hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + template + hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_equal(__f, __l); } +#else + + hash_multiset(const value_type* __f, const value_type* __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multiset(const value_type* __f, const value_type* __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multiset(const value_type* __f, const value_type* __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multiset(const value_type* __f, const value_type* __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_equal(__f, __l); } + + hash_multiset(const_iterator __f, const_iterator __l) + : _M_ht(100, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multiset(const_iterator __f, const_iterator __l, size_type __n) + : _M_ht(__n, hasher(), key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multiset(const_iterator __f, const_iterator __l, size_type __n, + const hasher& __hf) + : _M_ht(__n, __hf, key_equal(), allocator_type()) + { _M_ht.insert_equal(__f, __l); } + hash_multiset(const_iterator __f, const_iterator __l, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a = allocator_type()) + : _M_ht(__n, __hf, __eql, __a) + { _M_ht.insert_equal(__f, __l); } +#endif /*__STL_MEMBER_TEMPLATES */ + +public: + size_type size() const { return _M_ht.size(); } + size_type max_size() const { return _M_ht.max_size(); } + bool empty() const { return _M_ht.empty(); } + void swap(hash_multiset& hs) { _M_ht.swap(hs._M_ht); } + +#ifdef __STL_MEMBER_TEMPLATES + template + friend bool operator== (const hash_multiset<_Val, _HF, _EqK, _Al>&, + const hash_multiset<_Val, _HF, _EqK, _Al>&); +#else /* __STL_MEMBER_TEMPLATES */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const hash_multiset&,const hash_multiset&); +#endif /* __STL_MEMBER_TEMPLATES */ + + iterator begin() const { return _M_ht.begin(); } + iterator end() const { return _M_ht.end(); } + +public: + iterator insert(const value_type& __obj) + { return _M_ht.insert_equal(__obj); } +#ifdef __STL_MEMBER_TEMPLATES + template + void insert(_InputIterator __f, _InputIterator __l) + { _M_ht.insert_equal(__f,__l); } +#else + void insert(const value_type* __f, const value_type* __l) { + _M_ht.insert_equal(__f,__l); + } + void insert(const_iterator __f, const_iterator __l) + { _M_ht.insert_equal(__f, __l); } +#endif /*__STL_MEMBER_TEMPLATES */ + iterator insert_noresize(const value_type& __obj) + { return _M_ht.insert_equal_noresize(__obj); } + + iterator find(const key_type& __key) const { return _M_ht.find(__key); } + + size_type count(const key_type& __key) const { return _M_ht.count(__key); } + + pair equal_range(const key_type& __key) const + { return _M_ht.equal_range(__key); } + + size_type erase(const key_type& __key) {return _M_ht.erase(__key); } + void erase(iterator __it) { _M_ht.erase(__it); } + void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); } + void clear() { _M_ht.clear(); } + +public: + void resize(size_type __hint) { _M_ht.resize(__hint); } + size_type bucket_count() const { return _M_ht.bucket_count(); } + size_type max_bucket_count() const { return _M_ht.max_bucket_count(); } + size_type elems_in_bucket(size_type __n) const + { return _M_ht.elems_in_bucket(__n); } +}; + +template +inline bool +operator==(const hash_multiset<_Val,_HashFcn,_EqualKey,_Alloc>& __hs1, + const hash_multiset<_Val,_HashFcn,_EqualKey,_Alloc>& __hs2) +{ + return __hs1._M_ht == __hs2._M_ht; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!=(const hash_multiset<_Val,_HashFcn,_EqualKey,_Alloc>& __hs1, + const hash_multiset<_Val,_HashFcn,_EqualKey,_Alloc>& __hs2) { + return !(__hs1 == __hs2); +} + +template +inline void +swap(hash_multiset<_Val,_HashFcn,_EqualKey,_Alloc>& __hs1, + hash_multiset<_Val,_HashFcn,_EqualKey,_Alloc>& __hs2) { + __hs1.swap(__hs2); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// Specialization of insert_iterator so that it will work for hash_set +// and hash_multiset. + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +class insert_iterator > { +protected: + typedef hash_set<_Value, _HashFcn, _EqualKey, _Alloc> _Container; + _Container* container; +public: + typedef _Container container_type; + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + insert_iterator(_Container& __x) : container(&__x) {} + insert_iterator(_Container& __x, typename _Container::iterator) + : container(&__x) {} + insert_iterator<_Container>& + operator=(const typename _Container::value_type& __value) { + container->insert(__value); + return *this; + } + insert_iterator<_Container>& operator*() { return *this; } + insert_iterator<_Container>& operator++() { return *this; } + insert_iterator<_Container>& operator++(int) { return *this; } +}; + +template +class insert_iterator > { +protected: + typedef hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> _Container; + _Container* container; + typename _Container::iterator iter; +public: + typedef _Container container_type; + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + insert_iterator(_Container& __x) : container(&__x) {} + insert_iterator(_Container& __x, typename _Container::iterator) + : container(&__x) {} + insert_iterator<_Container>& + operator=(const typename _Container::value_type& __value) { + container->insert(__value); + return *this; + } + insert_iterator<_Container>& operator*() { return *this; } + insert_iterator<_Container>& operator++() { return *this; } + insert_iterator<_Container>& operator++(int) { return *this; } +}; + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_HASH_SET_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hashtable.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hashtable.h new file mode 100644 index 0000000..04a0823 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_hashtable.h @@ -0,0 +1,1054 @@ +/* + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_HASHTABLE_H +#define __SGI_STL_INTERNAL_HASHTABLE_H + +// Hashtable class, used to implement the hashed associative containers +// hash_set, hash_map, hash_multiset, and hash_multimap. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +__STL_BEGIN_NAMESPACE + +template +struct _Hashtable_node +{ + _Hashtable_node* _M_next; + _Val _M_val; +}; + +template +class hashtable; + +template +struct _Hashtable_iterator; + +template +struct _Hashtable_const_iterator; + +template +struct _Hashtable_iterator { + typedef hashtable<_Val,_Key,_HashFcn,_ExtractKey,_EqualKey,_Alloc> + _Hashtable; + typedef _Hashtable_iterator<_Val, _Key, _HashFcn, + _ExtractKey, _EqualKey, _Alloc> + iterator; + typedef _Hashtable_const_iterator<_Val, _Key, _HashFcn, + _ExtractKey, _EqualKey, _Alloc> + const_iterator; + typedef _Hashtable_node<_Val> _Node; + + typedef forward_iterator_tag iterator_category; + typedef _Val value_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef _Val& reference; + typedef _Val* pointer; + + _Node* _M_cur; + _Hashtable* _M_ht; + + _Hashtable_iterator(_Node* __n, _Hashtable* __tab) + : _M_cur(__n), _M_ht(__tab) {} + _Hashtable_iterator() {} + reference operator*() const { return _M_cur->_M_val; } +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return &(operator*()); } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + iterator& operator++(); + iterator operator++(int); + bool operator==(const iterator& __it) const + { return _M_cur == __it._M_cur; } + bool operator!=(const iterator& __it) const + { return _M_cur != __it._M_cur; } +}; + + +template +struct _Hashtable_const_iterator { + typedef hashtable<_Val,_Key,_HashFcn,_ExtractKey,_EqualKey,_Alloc> + _Hashtable; + typedef _Hashtable_iterator<_Val,_Key,_HashFcn, + _ExtractKey,_EqualKey,_Alloc> + iterator; + typedef _Hashtable_const_iterator<_Val, _Key, _HashFcn, + _ExtractKey, _EqualKey, _Alloc> + const_iterator; + typedef _Hashtable_node<_Val> _Node; + + typedef forward_iterator_tag iterator_category; + typedef _Val value_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef const _Val& reference; + typedef const _Val* pointer; + + const _Node* _M_cur; + const _Hashtable* _M_ht; + + _Hashtable_const_iterator(const _Node* __n, const _Hashtable* __tab) + : _M_cur(__n), _M_ht(__tab) {} + _Hashtable_const_iterator() {} + _Hashtable_const_iterator(const iterator& __it) + : _M_cur(__it._M_cur), _M_ht(__it._M_ht) {} + reference operator*() const { return _M_cur->_M_val; } +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return &(operator*()); } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + const_iterator& operator++(); + const_iterator operator++(int); + bool operator==(const const_iterator& __it) const + { return _M_cur == __it._M_cur; } + bool operator!=(const const_iterator& __it) const + { return _M_cur != __it._M_cur; } +}; + +// Note: assumes long is at least 32 bits. +enum { __stl_num_primes = 28 }; + +static const unsigned long __stl_prime_list[__stl_num_primes] = +{ + 53ul, 97ul, 193ul, 389ul, 769ul, + 1543ul, 3079ul, 6151ul, 12289ul, 24593ul, + 49157ul, 98317ul, 196613ul, 393241ul, 786433ul, + 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul, + 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul, + 1610612741ul, 3221225473ul, 4294967291ul +}; + +inline unsigned long __stl_next_prime(unsigned long __n) +{ + const unsigned long* __first = __stl_prime_list; + const unsigned long* __last = __stl_prime_list + (int)__stl_num_primes; + const unsigned long* pos = lower_bound(__first, __last, __n); + return pos == __last ? *(__last - 1) : *pos; +} + +// Forward declaration of operator==. + +template +class hashtable; + +template +bool operator==(const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht1, + const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht2); + + +// Hashtables handle allocators a bit differently than other containers +// do. If we're using standard-conforming allocators, then a hashtable +// unconditionally has a member variable to hold its allocator, even if +// it so happens that all instances of the allocator type are identical. +// This is because, for hashtables, this extra storage is negligible. +// Additionally, a base class wouldn't serve any other purposes; it +// wouldn't, for example, simplify the exception-handling code. + +template +class hashtable { +public: + typedef _Key key_type; + typedef _Val value_type; + typedef _HashFcn hasher; + typedef _EqualKey key_equal; + + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + + hasher hash_funct() const { return _M_hash; } + key_equal key_eq() const { return _M_equals; } + +private: + typedef _Hashtable_node<_Val> _Node; + +#ifdef __STL_USE_STD_ALLOCATORS +public: + typedef typename _Alloc_traits<_Val,_Alloc>::allocator_type allocator_type; + allocator_type get_allocator() const { return _M_node_allocator; } +private: + typename _Alloc_traits<_Node, _Alloc>::allocator_type _M_node_allocator; + _Node* _M_get_node() { return _M_node_allocator.allocate(1); } + void _M_put_node(_Node* __p) { _M_node_allocator.deallocate(__p, 1); } +# define __HASH_ALLOC_INIT(__a) _M_node_allocator(__a), +#else /* __STL_USE_STD_ALLOCATORS */ +public: + typedef _Alloc allocator_type; + allocator_type get_allocator() const { return allocator_type(); } +private: + typedef simple_alloc<_Node, _Alloc> _M_node_allocator_type; + _Node* _M_get_node() { return _M_node_allocator_type::allocate(1); } + void _M_put_node(_Node* __p) { _M_node_allocator_type::deallocate(__p, 1); } +# define __HASH_ALLOC_INIT(__a) +#endif /* __STL_USE_STD_ALLOCATORS */ + +private: + hasher _M_hash; + key_equal _M_equals; + _ExtractKey _M_get_key; + vector<_Node*,_Alloc> _M_buckets; + size_type _M_num_elements; + +public: + typedef _Hashtable_iterator<_Val,_Key,_HashFcn,_ExtractKey,_EqualKey,_Alloc> + iterator; + typedef _Hashtable_const_iterator<_Val,_Key,_HashFcn,_ExtractKey,_EqualKey, + _Alloc> + const_iterator; + + friend struct + _Hashtable_iterator<_Val,_Key,_HashFcn,_ExtractKey,_EqualKey,_Alloc>; + friend struct + _Hashtable_const_iterator<_Val,_Key,_HashFcn,_ExtractKey,_EqualKey,_Alloc>; + +public: + hashtable(size_type __n, + const _HashFcn& __hf, + const _EqualKey& __eql, + const _ExtractKey& __ext, + const allocator_type& __a = allocator_type()) + : __HASH_ALLOC_INIT(__a) + _M_hash(__hf), + _M_equals(__eql), + _M_get_key(__ext), + _M_buckets(__a), + _M_num_elements(0) + { + _M_initialize_buckets(__n); + } + + hashtable(size_type __n, + const _HashFcn& __hf, + const _EqualKey& __eql, + const allocator_type& __a = allocator_type()) + : __HASH_ALLOC_INIT(__a) + _M_hash(__hf), + _M_equals(__eql), + _M_get_key(_ExtractKey()), + _M_buckets(__a), + _M_num_elements(0) + { + _M_initialize_buckets(__n); + } + + hashtable(const hashtable& __ht) + : __HASH_ALLOC_INIT(__ht.get_allocator()) + _M_hash(__ht._M_hash), + _M_equals(__ht._M_equals), + _M_get_key(__ht._M_get_key), + _M_buckets(__ht.get_allocator()), + _M_num_elements(0) + { + _M_copy_from(__ht); + } + +#undef __HASH_ALLOC_INIT + + hashtable& operator= (const hashtable& __ht) + { + if (&__ht != this) { + clear(); + _M_hash = __ht._M_hash; + _M_equals = __ht._M_equals; + _M_get_key = __ht._M_get_key; + _M_copy_from(__ht); + } + return *this; + } + + ~hashtable() { clear(); } + + size_type size() const { return _M_num_elements; } + size_type max_size() const { return size_type(-1); } + bool empty() const { return size() == 0; } + + void swap(hashtable& __ht) + { + __STD::swap(_M_hash, __ht._M_hash); + __STD::swap(_M_equals, __ht._M_equals); + __STD::swap(_M_get_key, __ht._M_get_key); + _M_buckets.swap(__ht._M_buckets); + __STD::swap(_M_num_elements, __ht._M_num_elements); + } + + iterator begin() + { + for (size_type __n = 0; __n < _M_buckets.size(); ++__n) + if (_M_buckets[__n]) + return iterator(_M_buckets[__n], this); + return end(); + } + + iterator end() { return iterator(0, this); } + + const_iterator begin() const + { + for (size_type __n = 0; __n < _M_buckets.size(); ++__n) + if (_M_buckets[__n]) + return const_iterator(_M_buckets[__n], this); + return end(); + } + + const_iterator end() const { return const_iterator(0, this); } + +#ifdef __STL_MEMBER_TEMPLATES + template + friend bool operator== (const hashtable<_Vl, _Ky, _HF, _Ex, _Eq, _Al>&, + const hashtable<_Vl, _Ky, _HF, _Ex, _Eq, _Al>&); +#else /* __STL_MEMBER_TEMPLATES */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const hashtable&, const hashtable&); +#endif /* __STL_MEMBER_TEMPLATES */ + +public: + + size_type bucket_count() const { return _M_buckets.size(); } + + size_type max_bucket_count() const + { return __stl_prime_list[(int)__stl_num_primes - 1]; } + + size_type elems_in_bucket(size_type __bucket) const + { + size_type __result = 0; + for (_Node* __cur = _M_buckets[__bucket]; __cur; __cur = __cur->_M_next) + __result += 1; + return __result; + } + + pair insert_unique(const value_type& __obj) + { + resize(_M_num_elements + 1); + return insert_unique_noresize(__obj); + } + + iterator insert_equal(const value_type& __obj) + { + resize(_M_num_elements + 1); + return insert_equal_noresize(__obj); + } + + pair insert_unique_noresize(const value_type& __obj); + iterator insert_equal_noresize(const value_type& __obj); + +#ifdef __STL_MEMBER_TEMPLATES + template + void insert_unique(_InputIterator __f, _InputIterator __l) + { + insert_unique(__f, __l, __ITERATOR_CATEGORY(__f)); + } + + template + void insert_equal(_InputIterator __f, _InputIterator __l) + { + insert_equal(__f, __l, __ITERATOR_CATEGORY(__f)); + } + + template + void insert_unique(_InputIterator __f, _InputIterator __l, + input_iterator_tag) + { + for ( ; __f != __l; ++__f) + insert_unique(*__f); + } + + template + void insert_equal(_InputIterator __f, _InputIterator __l, + input_iterator_tag) + { + for ( ; __f != __l; ++__f) + insert_equal(*__f); + } + + template + void insert_unique(_ForwardIterator __f, _ForwardIterator __l, + forward_iterator_tag) + { + size_type __n = 0; + distance(__f, __l, __n); + resize(_M_num_elements + __n); + for ( ; __n > 0; --__n, ++__f) + insert_unique_noresize(*__f); + } + + template + void insert_equal(_ForwardIterator __f, _ForwardIterator __l, + forward_iterator_tag) + { + size_type __n = 0; + distance(__f, __l, __n); + resize(_M_num_elements + __n); + for ( ; __n > 0; --__n, ++__f) + insert_equal_noresize(*__f); + } + +#else /* __STL_MEMBER_TEMPLATES */ + void insert_unique(const value_type* __f, const value_type* __l) + { + size_type __n = __l - __f; + resize(_M_num_elements + __n); + for ( ; __n > 0; --__n, ++__f) + insert_unique_noresize(*__f); + } + + void insert_equal(const value_type* __f, const value_type* __l) + { + size_type __n = __l - __f; + resize(_M_num_elements + __n); + for ( ; __n > 0; --__n, ++__f) + insert_equal_noresize(*__f); + } + + void insert_unique(const_iterator __f, const_iterator __l) + { + size_type __n = 0; + distance(__f, __l, __n); + resize(_M_num_elements + __n); + for ( ; __n > 0; --__n, ++__f) + insert_unique_noresize(*__f); + } + + void insert_equal(const_iterator __f, const_iterator __l) + { + size_type __n = 0; + distance(__f, __l, __n); + resize(_M_num_elements + __n); + for ( ; __n > 0; --__n, ++__f) + insert_equal_noresize(*__f); + } +#endif /*__STL_MEMBER_TEMPLATES */ + + reference find_or_insert(const value_type& __obj); + + iterator find(const key_type& __key) + { + size_type __n = _M_bkt_num_key(__key); + _Node* __first; + for ( __first = _M_buckets[__n]; + __first && !_M_equals(_M_get_key(__first->_M_val), __key); + __first = __first->_M_next) + {} + return iterator(__first, this); + } + + const_iterator find(const key_type& __key) const + { + size_type __n = _M_bkt_num_key(__key); + const _Node* __first; + for ( __first = _M_buckets[__n]; + __first && !_M_equals(_M_get_key(__first->_M_val), __key); + __first = __first->_M_next) + {} + return const_iterator(__first, this); + } + + size_type count(const key_type& __key) const + { + const size_type __n = _M_bkt_num_key(__key); + size_type __result = 0; + + for (const _Node* __cur = _M_buckets[__n]; __cur; __cur = __cur->_M_next) + if (_M_equals(_M_get_key(__cur->_M_val), __key)) + ++__result; + return __result; + } + + pair + equal_range(const key_type& __key); + + pair + equal_range(const key_type& __key) const; + + size_type erase(const key_type& __key); + void erase(const iterator& __it); + void erase(iterator __first, iterator __last); + + void erase(const const_iterator& __it); + void erase(const_iterator __first, const_iterator __last); + + void resize(size_type __num_elements_hint); + void clear(); + +private: + size_type _M_next_size(size_type __n) const + { return __stl_next_prime(__n); } + + void _M_initialize_buckets(size_type __n) + { + const size_type __n_buckets = _M_next_size(__n); + _M_buckets.reserve(__n_buckets); + _M_buckets.insert(_M_buckets.end(), __n_buckets, (_Node*) 0); + _M_num_elements = 0; + } + + size_type _M_bkt_num_key(const key_type& __key) const + { + return _M_bkt_num_key(__key, _M_buckets.size()); + } + + size_type _M_bkt_num(const value_type& __obj) const + { + return _M_bkt_num_key(_M_get_key(__obj)); + } + + size_type _M_bkt_num_key(const key_type& __key, size_t __n) const + { + return _M_hash(__key) % __n; + } + + size_type _M_bkt_num(const value_type& __obj, size_t __n) const + { + return _M_bkt_num_key(_M_get_key(__obj), __n); + } + + _Node* _M_new_node(const value_type& __obj) + { + _Node* __n = _M_get_node(); + __n->_M_next = 0; + __STL_TRY { + construct(&__n->_M_val, __obj); + return __n; + } + __STL_UNWIND(_M_put_node(__n)); + } + + void _M_delete_node(_Node* __n) + { + destroy(&__n->_M_val); + _M_put_node(__n); + } + + void _M_erase_bucket(const size_type __n, _Node* __first, _Node* __last); + void _M_erase_bucket(const size_type __n, _Node* __last); + + void _M_copy_from(const hashtable& __ht); + +}; + +template +_Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& +_Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::operator++() +{ + const _Node* __old = _M_cur; + _M_cur = _M_cur->_M_next; + if (!_M_cur) { + size_type __bucket = _M_ht->_M_bkt_num(__old->_M_val); + while (!_M_cur && ++__bucket < _M_ht->_M_buckets.size()) + _M_cur = _M_ht->_M_buckets[__bucket]; + } + return *this; +} + +template +inline _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All> +_Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::operator++(int) +{ + iterator __tmp = *this; + ++*this; + return __tmp; +} + +template +_Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& +_Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::operator++() +{ + const _Node* __old = _M_cur; + _M_cur = _M_cur->_M_next; + if (!_M_cur) { + size_type __bucket = _M_ht->_M_bkt_num(__old->_M_val); + while (!_M_cur && ++__bucket < _M_ht->_M_buckets.size()) + _M_cur = _M_ht->_M_buckets[__bucket]; + } + return *this; +} + +template +inline _Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All> +_Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::operator++(int) +{ + const_iterator __tmp = *this; + ++*this; + return __tmp; +} + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline forward_iterator_tag +iterator_category(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&) +{ + return forward_iterator_tag(); +} + +template +inline _Val* +value_type(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&) +{ + return (_Val*) 0; +} + +template +inline hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::difference_type* +distance_type(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&) +{ + return (hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::difference_type*) 0; +} + +template +inline forward_iterator_tag +iterator_category(const _Hashtable_const_iterator<_Val,_Key,_HF, + _ExK,_EqK,_All>&) +{ + return forward_iterator_tag(); +} + +template +inline _Val* +value_type(const _Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&) +{ + return (_Val*) 0; +} + +template +inline hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::difference_type* +distance_type(const _Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&) +{ + return (hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::difference_type*) 0; +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +bool operator==(const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht1, + const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht2) +{ + typedef typename hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::_Node _Node; + if (__ht1._M_buckets.size() != __ht2._M_buckets.size()) + return false; + for (int __n = 0; __n < __ht1._M_buckets.size(); ++__n) { + _Node* __cur1 = __ht1._M_buckets[__n]; + _Node* __cur2 = __ht2._M_buckets[__n]; + for ( ; __cur1 && __cur2 && __cur1->_M_val == __cur2->_M_val; + __cur1 = __cur1->_M_next, __cur2 = __cur2->_M_next) + {} + if (__cur1 || __cur2) + return false; + } + return true; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht1, + const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht2) { + return !(__ht1 == __ht2); +} + +template +inline void swap(hashtable<_Val, _Key, _HF, _Extract, _EqKey, _All>& __ht1, + hashtable<_Val, _Key, _HF, _Extract, _EqKey, _All>& __ht2) { + __ht1.swap(__ht2); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + + +template +pair::iterator, bool> +hashtable<_Val,_Key,_HF,_Ex,_Eq,_All> + ::insert_unique_noresize(const value_type& __obj) +{ + const size_type __n = _M_bkt_num(__obj); + _Node* __first = _M_buckets[__n]; + + for (_Node* __cur = __first; __cur; __cur = __cur->_M_next) + if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj))) + return pair(iterator(__cur, this), false); + + _Node* __tmp = _M_new_node(__obj); + __tmp->_M_next = __first; + _M_buckets[__n] = __tmp; + ++_M_num_elements; + return pair(iterator(__tmp, this), true); +} + +template +typename hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::iterator +hashtable<_Val,_Key,_HF,_Ex,_Eq,_All> + ::insert_equal_noresize(const value_type& __obj) +{ + const size_type __n = _M_bkt_num(__obj); + _Node* __first = _M_buckets[__n]; + + for (_Node* __cur = __first; __cur; __cur = __cur->_M_next) + if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj))) { + _Node* __tmp = _M_new_node(__obj); + __tmp->_M_next = __cur->_M_next; + __cur->_M_next = __tmp; + ++_M_num_elements; + return iterator(__tmp, this); + } + + _Node* __tmp = _M_new_node(__obj); + __tmp->_M_next = __first; + _M_buckets[__n] = __tmp; + ++_M_num_elements; + return iterator(__tmp, this); +} + +template +typename hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::reference +hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::find_or_insert(const value_type& __obj) +{ + resize(_M_num_elements + 1); + + size_type __n = _M_bkt_num(__obj); + _Node* __first = _M_buckets[__n]; + + for (_Node* __cur = __first; __cur; __cur = __cur->_M_next) + if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj))) + return __cur->_M_val; + + _Node* __tmp = _M_new_node(__obj); + __tmp->_M_next = __first; + _M_buckets[__n] = __tmp; + ++_M_num_elements; + return __tmp->_M_val; +} + +template +pair::iterator, + typename hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::iterator> +hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::equal_range(const key_type& __key) +{ + typedef pair _Pii; + const size_type __n = _M_bkt_num_key(__key); + + for (_Node* __first = _M_buckets[__n]; __first; __first = __first->_M_next) + if (_M_equals(_M_get_key(__first->_M_val), __key)) { + for (_Node* __cur = __first->_M_next; __cur; __cur = __cur->_M_next) + if (!_M_equals(_M_get_key(__cur->_M_val), __key)) + return _Pii(iterator(__first, this), iterator(__cur, this)); + for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m) + if (_M_buckets[__m]) + return _Pii(iterator(__first, this), + iterator(_M_buckets[__m], this)); + return _Pii(iterator(__first, this), end()); + } + return _Pii(end(), end()); +} + +template +pair::const_iterator, + typename hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::const_iterator> +hashtable<_Val,_Key,_HF,_Ex,_Eq,_All> + ::equal_range(const key_type& __key) const +{ + typedef pair _Pii; + const size_type __n = _M_bkt_num_key(__key); + + for (const _Node* __first = _M_buckets[__n] ; + __first; + __first = __first->_M_next) { + if (_M_equals(_M_get_key(__first->_M_val), __key)) { + for (const _Node* __cur = __first->_M_next; + __cur; + __cur = __cur->_M_next) + if (!_M_equals(_M_get_key(__cur->_M_val), __key)) + return _Pii(const_iterator(__first, this), + const_iterator(__cur, this)); + for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m) + if (_M_buckets[__m]) + return _Pii(const_iterator(__first, this), + const_iterator(_M_buckets[__m], this)); + return _Pii(const_iterator(__first, this), end()); + } + } + return _Pii(end(), end()); +} + +template +typename hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::size_type +hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::erase(const key_type& __key) +{ + const size_type __n = _M_bkt_num_key(__key); + _Node* __first = _M_buckets[__n]; + size_type __erased = 0; + + if (__first) { + _Node* __cur = __first; + _Node* __next = __cur->_M_next; + while (__next) { + if (_M_equals(_M_get_key(__next->_M_val), __key)) { + __cur->_M_next = __next->_M_next; + _M_delete_node(__next); + __next = __cur->_M_next; + ++__erased; + --_M_num_elements; + } + else { + __cur = __next; + __next = __cur->_M_next; + } + } + if (_M_equals(_M_get_key(__first->_M_val), __key)) { + _M_buckets[__n] = __first->_M_next; + _M_delete_node(__first); + ++__erased; + --_M_num_elements; + } + } + return __erased; +} + +template +void hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::erase(const iterator& __it) +{ + _Node* __p = __it._M_cur; + if (__p) { + const size_type __n = _M_bkt_num(__p->_M_val); + _Node* __cur = _M_buckets[__n]; + + if (__cur == __p) { + _M_buckets[__n] = __cur->_M_next; + _M_delete_node(__cur); + --_M_num_elements; + } + else { + _Node* __next = __cur->_M_next; + while (__next) { + if (__next == __p) { + __cur->_M_next = __next->_M_next; + _M_delete_node(__next); + --_M_num_elements; + break; + } + else { + __cur = __next; + __next = __cur->_M_next; + } + } + } + } +} + +template +void hashtable<_Val,_Key,_HF,_Ex,_Eq,_All> + ::erase(iterator __first, iterator __last) +{ + size_type __f_bucket = __first._M_cur ? + _M_bkt_num(__first._M_cur->_M_val) : _M_buckets.size(); + size_type __l_bucket = __last._M_cur ? + _M_bkt_num(__last._M_cur->_M_val) : _M_buckets.size(); + + if (__first._M_cur == __last._M_cur) + return; + else if (__f_bucket == __l_bucket) + _M_erase_bucket(__f_bucket, __first._M_cur, __last._M_cur); + else { + _M_erase_bucket(__f_bucket, __first._M_cur, 0); + for (size_type __n = __f_bucket + 1; __n < __l_bucket; ++__n) + _M_erase_bucket(__n, 0); + if (__l_bucket != _M_buckets.size()) + _M_erase_bucket(__l_bucket, __last._M_cur); + } +} + +template +inline void +hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::erase(const_iterator __first, + const_iterator __last) +{ + erase(iterator(const_cast<_Node*>(__first._M_cur), + const_cast(__first._M_ht)), + iterator(const_cast<_Node*>(__last._M_cur), + const_cast(__last._M_ht))); +} + +template +inline void +hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::erase(const const_iterator& __it) +{ + erase(iterator(const_cast<_Node*>(__it._M_cur), + const_cast(__it._M_ht))); +} + +template +void hashtable<_Val,_Key,_HF,_Ex,_Eq,_All> + ::resize(size_type __num_elements_hint) +{ + const size_type __old_n = _M_buckets.size(); + if (__num_elements_hint > __old_n) { + const size_type __n = _M_next_size(__num_elements_hint); + if (__n > __old_n) { + vector<_Node*, _All> __tmp(__n, (_Node*)(0), + _M_buckets.get_allocator()); + __STL_TRY { + for (size_type __bucket = 0; __bucket < __old_n; ++__bucket) { + _Node* __first = _M_buckets[__bucket]; + while (__first) { + size_type __new_bucket = _M_bkt_num(__first->_M_val, __n); + _M_buckets[__bucket] = __first->_M_next; + __first->_M_next = __tmp[__new_bucket]; + __tmp[__new_bucket] = __first; + __first = _M_buckets[__bucket]; + } + } + _M_buckets.swap(__tmp); + } +# ifdef __STL_USE_EXCEPTIONS + catch(...) { + for (size_type __bucket = 0; __bucket < __tmp.size(); ++__bucket) { + while (__tmp[__bucket]) { + _Node* __next = __tmp[__bucket]->_M_next; + _M_delete_node(__tmp[__bucket]); + __tmp[__bucket] = __next; + } + } + throw; + } +# endif /* __STL_USE_EXCEPTIONS */ + } + } +} + +template +void hashtable<_Val,_Key,_HF,_Ex,_Eq,_All> + ::_M_erase_bucket(const size_type __n, _Node* __first, _Node* __last) +{ + _Node* __cur = _M_buckets[__n]; + if (__cur == __first) + _M_erase_bucket(__n, __last); + else { + _Node* __next; + for (__next = __cur->_M_next; + __next != __first; + __cur = __next, __next = __cur->_M_next) + ; + while (__next != __last) { + __cur->_M_next = __next->_M_next; + _M_delete_node(__next); + __next = __cur->_M_next; + --_M_num_elements; + } + } +} + +template +void hashtable<_Val,_Key,_HF,_Ex,_Eq,_All> + ::_M_erase_bucket(const size_type __n, _Node* __last) +{ + _Node* __cur = _M_buckets[__n]; + while (__cur != __last) { + _Node* __next = __cur->_M_next; + _M_delete_node(__cur); + __cur = __next; + _M_buckets[__n] = __cur; + --_M_num_elements; + } +} + +template +void hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::clear() +{ + for (size_type __i = 0; __i < _M_buckets.size(); ++__i) { + _Node* __cur = _M_buckets[__i]; + while (__cur != 0) { + _Node* __next = __cur->_M_next; + _M_delete_node(__cur); + __cur = __next; + } + _M_buckets[__i] = 0; + } + _M_num_elements = 0; +} + + +template +void hashtable<_Val,_Key,_HF,_Ex,_Eq,_All> + ::_M_copy_from(const hashtable& __ht) +{ + _M_buckets.clear(); + _M_buckets.reserve(__ht._M_buckets.size()); + _M_buckets.insert(_M_buckets.end(), __ht._M_buckets.size(), (_Node*) 0); + __STL_TRY { + for (size_type __i = 0; __i < __ht._M_buckets.size(); ++__i) { + const _Node* __cur = __ht._M_buckets[__i]; + if (__cur) { + _Node* __copy = _M_new_node(__cur->_M_val); + _M_buckets[__i] = __copy; + + for (_Node* __next = __cur->_M_next; + __next; + __cur = __next, __next = __cur->_M_next) { + __copy->_M_next = _M_new_node(__next->_M_val); + __copy = __copy->_M_next; + } + } + } + _M_num_elements = __ht._M_num_elements; + } + __STL_UNWIND(clear()); +} + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_HASHTABLE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_heap.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_heap.h new file mode 100644 index 0000000..651d21a --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_heap.h @@ -0,0 +1,297 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_HEAP_H +#define __SGI_STL_INTERNAL_HEAP_H + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1209 +#endif + +// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap. + +template +void +__push_heap(_RandomAccessIterator __first, + _Distance __holeIndex, _Distance __topIndex, _Tp __value) +{ + _Distance __parent = (__holeIndex - 1) / 2; + while (__holeIndex > __topIndex && *(__first + __parent) < __value) { + *(__first + __holeIndex) = *(__first + __parent); + __holeIndex = __parent; + __parent = (__holeIndex - 1) / 2; + } + *(__first + __holeIndex) = __value; +} + +template +inline void +__push_heap_aux(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Distance*, _Tp*) +{ + __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), + _Tp(*(__last - 1))); +} + +template +inline void +push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIterator>::value_type, + _LessThanComparable); + __push_heap_aux(__first, __last, + __DISTANCE_TYPE(__first), __VALUE_TYPE(__first)); +} + +template +void +__push_heap(_RandomAccessIterator __first, _Distance __holeIndex, + _Distance __topIndex, _Tp __value, _Compare __comp) +{ + _Distance __parent = (__holeIndex - 1) / 2; + while (__holeIndex > __topIndex && __comp(*(__first + __parent), __value)) { + *(__first + __holeIndex) = *(__first + __parent); + __holeIndex = __parent; + __parent = (__holeIndex - 1) / 2; + } + *(__first + __holeIndex) = __value; +} + +template +inline void +__push_heap_aux(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp, + _Distance*, _Tp*) +{ + __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), + _Tp(*(__last - 1)), __comp); +} + +template +inline void +push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) +{ + __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator); + __push_heap_aux(__first, __last, __comp, + __DISTANCE_TYPE(__first), __VALUE_TYPE(__first)); +} + +template +void +__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex, + _Distance __len, _Tp __value) +{ + _Distance __topIndex = __holeIndex; + _Distance __secondChild = 2 * __holeIndex + 2; + while (__secondChild < __len) { + if (*(__first + __secondChild) < *(__first + (__secondChild - 1))) + __secondChild--; + *(__first + __holeIndex) = *(__first + __secondChild); + __holeIndex = __secondChild; + __secondChild = 2 * (__secondChild + 1); + } + if (__secondChild == __len) { + *(__first + __holeIndex) = *(__first + (__secondChild - 1)); + __holeIndex = __secondChild - 1; + } + __push_heap(__first, __holeIndex, __topIndex, __value); +} + +template +inline void +__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _RandomAccessIterator __result, _Tp __value, _Distance*) +{ + *__result = *__first; + __adjust_heap(__first, _Distance(0), _Distance(__last - __first), __value); +} + +template +inline void +__pop_heap_aux(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Tp*) +{ + __pop_heap(__first, __last - 1, __last - 1, + _Tp(*(__last - 1)), __DISTANCE_TYPE(__first)); +} + +template +inline void pop_heap(_RandomAccessIterator __first, + _RandomAccessIterator __last) +{ + __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIterator>::value_type, + _LessThanComparable); + __pop_heap_aux(__first, __last, __VALUE_TYPE(__first)); +} + +template +void +__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex, + _Distance __len, _Tp __value, _Compare __comp) +{ + _Distance __topIndex = __holeIndex; + _Distance __secondChild = 2 * __holeIndex + 2; + while (__secondChild < __len) { + if (__comp(*(__first + __secondChild), *(__first + (__secondChild - 1)))) + __secondChild--; + *(__first + __holeIndex) = *(__first + __secondChild); + __holeIndex = __secondChild; + __secondChild = 2 * (__secondChild + 1); + } + if (__secondChild == __len) { + *(__first + __holeIndex) = *(__first + (__secondChild - 1)); + __holeIndex = __secondChild - 1; + } + __push_heap(__first, __holeIndex, __topIndex, __value, __comp); +} + +template +inline void +__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _RandomAccessIterator __result, _Tp __value, _Compare __comp, + _Distance*) +{ + *__result = *__first; + __adjust_heap(__first, _Distance(0), _Distance(__last - __first), + __value, __comp); +} + +template +inline void +__pop_heap_aux(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Tp*, _Compare __comp) +{ + __pop_heap(__first, __last - 1, __last - 1, _Tp(*(__last - 1)), __comp, + __DISTANCE_TYPE(__first)); +} + +template +inline void +pop_heap(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp) +{ + __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator); + __pop_heap_aux(__first, __last, __VALUE_TYPE(__first), __comp); +} + +template +void +__make_heap(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Tp*, _Distance*) +{ + if (__last - __first < 2) return; + _Distance __len = __last - __first; + _Distance __parent = (__len - 2)/2; + + while (true) { + __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent))); + if (__parent == 0) return; + __parent--; + } +} + +template +inline void +make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIterator>::value_type, + _LessThanComparable); + __make_heap(__first, __last, + __VALUE_TYPE(__first), __DISTANCE_TYPE(__first)); +} + +template +void +__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp, _Tp*, _Distance*) +{ + if (__last - __first < 2) return; + _Distance __len = __last - __first; + _Distance __parent = (__len - 2)/2; + + while (true) { + __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent)), + __comp); + if (__parent == 0) return; + __parent--; + } +} + +template +inline void +make_heap(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp) +{ + __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator); + __make_heap(__first, __last, __comp, + __VALUE_TYPE(__first), __DISTANCE_TYPE(__first)); +} + +template +void sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator); + __STL_REQUIRES(typename iterator_traits<_RandomAccessIterator>::value_type, + _LessThanComparable); + while (__last - __first > 1) + pop_heap(__first, __last--); +} + +template +void +sort_heap(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp) +{ + __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator); + while (__last - __first > 1) + pop_heap(__first, __last--, __comp); +} + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1209 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_HEAP_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_iterator.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_iterator.h new file mode 100644 index 0000000..807871e --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_iterator.h @@ -0,0 +1,964 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996-1998 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_ITERATOR_H +#define __SGI_STL_INTERNAL_ITERATOR_H + +__STL_BEGIN_NAMESPACE + + +template +class back_insert_iterator { +protected: + _Container* container; +public: + typedef _Container container_type; + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + explicit back_insert_iterator(_Container& __x) : container(&__x) {} + back_insert_iterator<_Container>& + operator=(const typename _Container::value_type& __value) { + container->push_back(__value); + return *this; + } + back_insert_iterator<_Container>& operator*() { return *this; } + back_insert_iterator<_Container>& operator++() { return *this; } + back_insert_iterator<_Container>& operator++(int) { return *this; } +}; + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline output_iterator_tag +iterator_category(const back_insert_iterator<_Container>&) +{ + return output_iterator_tag(); +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline back_insert_iterator<_Container> back_inserter(_Container& __x) { + return back_insert_iterator<_Container>(__x); +} + +template +class front_insert_iterator { +protected: + _Container* container; +public: + typedef _Container container_type; + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + explicit front_insert_iterator(_Container& __x) : container(&__x) {} + front_insert_iterator<_Container>& + operator=(const typename _Container::value_type& __value) { + container->push_front(__value); + return *this; + } + front_insert_iterator<_Container>& operator*() { return *this; } + front_insert_iterator<_Container>& operator++() { return *this; } + front_insert_iterator<_Container>& operator++(int) { return *this; } +}; + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline output_iterator_tag +iterator_category(const front_insert_iterator<_Container>&) +{ + return output_iterator_tag(); +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline front_insert_iterator<_Container> front_inserter(_Container& __x) { + return front_insert_iterator<_Container>(__x); +} + +template +class insert_iterator { +protected: + _Container* container; + typename _Container::iterator iter; +public: + typedef _Container container_type; + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + insert_iterator(_Container& __x, typename _Container::iterator __i) + : container(&__x), iter(__i) {} + insert_iterator<_Container>& + operator=(const typename _Container::value_type& __value) { + iter = container->insert(iter, __value); + ++iter; + return *this; + } + insert_iterator<_Container>& operator*() { return *this; } + insert_iterator<_Container>& operator++() { return *this; } + insert_iterator<_Container>& operator++(int) { return *this; } +}; + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline output_iterator_tag +iterator_category(const insert_iterator<_Container>&) +{ + return output_iterator_tag(); +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline +insert_iterator<_Container> inserter(_Container& __x, _Iterator __i) +{ + typedef typename _Container::iterator __iter; + return insert_iterator<_Container>(__x, __iter(__i)); +} + +#ifndef __STL_LIMITED_DEFAULT_TEMPLATES +template +#else +template +#endif +class reverse_bidirectional_iterator { + typedef reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, + _Reference, _Distance> _Self; +protected: + _BidirectionalIterator current; +public: + typedef bidirectional_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Tp* pointer; + typedef _Reference reference; + + reverse_bidirectional_iterator() {} + explicit reverse_bidirectional_iterator(_BidirectionalIterator __x) + : current(__x) {} + _BidirectionalIterator base() const { return current; } + _Reference operator*() const { + _BidirectionalIterator __tmp = current; + return *--__tmp; + } +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return &(operator*()); } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + _Self& operator++() { + --current; + return *this; + } + _Self operator++(int) { + _Self __tmp = *this; + --current; + return __tmp; + } + _Self& operator--() { + ++current; + return *this; + } + _Self operator--(int) { + _Self __tmp = *this; + ++current; + return __tmp; + } +}; + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline bidirectional_iterator_tag +iterator_category(const reverse_bidirectional_iterator<_BidirectionalIterator, + _Tp, _Reference, + _Distance>&) +{ + return bidirectional_iterator_tag(); +} + +template +inline _Tp* +value_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, + _Reference, _Distance>&) +{ + return (_Tp*) 0; +} + +template +inline _Distance* +distance_type(const reverse_bidirectional_iterator<_BidirectionalIterator, + _Tp, + _Reference, _Distance>&) +{ + return (_Distance*) 0; +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline bool operator==( + const reverse_bidirectional_iterator<_BiIter, _Tp, _Ref, _Distance>& __x, + const reverse_bidirectional_iterator<_BiIter, _Tp, _Ref, _Distance>& __y) +{ + return __x.base() == __y.base(); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=( + const reverse_bidirectional_iterator<_BiIter, _Tp, _Ref, _Distance>& __x, + const reverse_bidirectional_iterator<_BiIter, _Tp, _Ref, _Distance>& __y) +{ + return !(__x == __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +// This is the new version of reverse_iterator, as defined in the +// draft C++ standard. It relies on the iterator_traits template, +// which in turn relies on partial specialization. The class +// reverse_bidirectional_iterator is no longer part of the draft +// standard, but it is retained for backward compatibility. + +template +class reverse_iterator +{ +protected: + _Iterator current; +public: + typedef typename iterator_traits<_Iterator>::iterator_category + iterator_category; + typedef typename iterator_traits<_Iterator>::value_type + value_type; + typedef typename iterator_traits<_Iterator>::difference_type + difference_type; + typedef typename iterator_traits<_Iterator>::pointer + pointer; + typedef typename iterator_traits<_Iterator>::reference + reference; + + typedef _Iterator iterator_type; + typedef reverse_iterator<_Iterator> _Self; + +public: + reverse_iterator() {} + explicit reverse_iterator(iterator_type __x) : current(__x) {} + + reverse_iterator(const _Self& __x) : current(__x.current) {} +#ifdef __STL_MEMBER_TEMPLATES + template + reverse_iterator(const reverse_iterator<_Iter>& __x) + : current(__x.base()) {} +#endif /* __STL_MEMBER_TEMPLATES */ + + iterator_type base() const { return current; } + reference operator*() const { + _Iterator __tmp = current; + return *--__tmp; + } +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return &(operator*()); } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + + _Self& operator++() { + --current; + return *this; + } + _Self operator++(int) { + _Self __tmp = *this; + --current; + return __tmp; + } + _Self& operator--() { + ++current; + return *this; + } + _Self operator--(int) { + _Self __tmp = *this; + ++current; + return __tmp; + } + + _Self operator+(difference_type __n) const { + return _Self(current - __n); + } + _Self& operator+=(difference_type __n) { + current -= __n; + return *this; + } + _Self operator-(difference_type __n) const { + return _Self(current + __n); + } + _Self& operator-=(difference_type __n) { + current += __n; + return *this; + } + reference operator[](difference_type __n) const { return *(*this + __n); } +}; + +template +inline bool operator==(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) { + return __x.base() == __y.base(); +} + +template +inline bool operator<(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) { + return __y.base() < __x.base(); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) { + return !(__x == __y); +} + +template +inline bool operator>(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) { + return __y < __x; +} + +template +inline bool operator<=(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) { + return !(__y < __x); +} + +template +inline bool operator>=(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) { + return !(__x < __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template +inline typename reverse_iterator<_Iterator>::difference_type +operator-(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) { + return __y.base() - __x.base(); +} + +template +inline reverse_iterator<_Iterator> +operator+(typename reverse_iterator<_Iterator>::difference_type __n, + const reverse_iterator<_Iterator>& __x) { + return reverse_iterator<_Iterator>(__x.base() - __n); +} + +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +// This is the old version of reverse_iterator, as found in the original +// HP STL. It does not use partial specialization. + +#ifndef __STL_LIMITED_DEFAULT_TEMPLATES +template +#else +template +#endif +class reverse_iterator { + typedef reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance> + _Self; +protected: + _RandomAccessIterator current; +public: + typedef random_access_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Tp* pointer; + typedef _Reference reference; + + reverse_iterator() {} + explicit reverse_iterator(_RandomAccessIterator __x) : current(__x) {} + _RandomAccessIterator base() const { return current; } + _Reference operator*() const { return *(current - 1); } +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return &(operator*()); } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + _Self& operator++() { + --current; + return *this; + } + _Self operator++(int) { + _Self __tmp = *this; + --current; + return __tmp; + } + _Self& operator--() { + ++current; + return *this; + } + _Self operator--(int) { + _Self __tmp = *this; + ++current; + return __tmp; + } + _Self operator+(_Distance __n) const { + return _Self(current - __n); + } + _Self& operator+=(_Distance __n) { + current -= __n; + return *this; + } + _Self operator-(_Distance __n) const { + return _Self(current + __n); + } + _Self& operator-=(_Distance __n) { + current += __n; + return *this; + } + _Reference operator[](_Distance __n) const { return *(*this + __n); } +}; + +template +inline random_access_iterator_tag +iterator_category(const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>&) +{ + return random_access_iterator_tag(); +} + +template +inline _Tp* value_type(const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>&) +{ + return (_Tp*) 0; +} + +template +inline _Distance* +distance_type(const reverse_iterator<_RandomAccessIterator, + _Tp, _Reference, _Distance>&) +{ + return (_Distance*) 0; +} + + +template +inline bool +operator==(const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __x, + const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __y) +{ + return __x.base() == __y.base(); +} + +template +inline bool +operator<(const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __x, + const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __y) +{ + return __y.base() < __x.base(); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!=(const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __x, + const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __y) { + return !(__x == __y); +} + +template +inline bool +operator>(const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __x, + const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __y) { + return __y < __x; +} + +template +inline bool +operator<=(const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __x, + const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __y) { + return !(__y < __x); +} + +template +inline bool +operator>=(const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __x, + const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __y) { + return !(__x < __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template +inline _Distance +operator-(const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __x, + const reverse_iterator<_RandomAccessIterator, _Tp, + _Reference, _Distance>& __y) +{ + return __y.base() - __x.base(); +} + +template +inline reverse_iterator<_RandAccIter, _Tp, _Ref, _Dist> +operator+(_Dist __n, + const reverse_iterator<_RandAccIter, _Tp, _Ref, _Dist>& __x) +{ + return reverse_iterator<_RandAccIter, _Tp, _Ref, _Dist>(__x.base() - __n); +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +// istream_iterator and ostream_iterator look very different if we're +// using new, templatized iostreams than if we're using the old cfront +// version. + +#ifdef __STL_USE_NEW_IOSTREAMS + +template , + class _Dist = ptrdiff_t> +class istream_iterator { +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_istream<_CharT, _Traits> istream_type; + + typedef input_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Dist difference_type; + typedef const _Tp* pointer; + typedef const _Tp& reference; + + istream_iterator() : _M_stream(0), _M_ok(false) {} + istream_iterator(istream_type& __s) : _M_stream(&__s) { _M_read(); } + + reference operator*() const { return _M_value; } + pointer operator->() const { return &(operator*()); } + + istream_iterator& operator++() { + _M_read(); + return *this; + } + istream_iterator operator++(int) { + istream_iterator __tmp = *this; + _M_read(); + return __tmp; + } + + bool _M_equal(const istream_iterator& __x) const + { return (_M_ok == __x._M_ok) && (!_M_ok || _M_stream == __x._M_stream); } + +private: + istream_type* _M_stream; + _Tp _M_value; + bool _M_ok; + + void _M_read() { + _M_ok = (_M_stream && *_M_stream) ? true : false; + if (_M_ok) { + *_M_stream >> _M_value; + _M_ok = *_M_stream ? true : false; + } + } +}; + +template +inline bool +operator==(const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x, + const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y) { + return __x._M_equal(__y); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x, + const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y) { + return !__x._M_equal(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template > +class ostream_iterator { +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_ostream<_CharT, _Traits> ostream_type; + + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + ostream_iterator(ostream_type& __s) : _M_stream(&__s), _M_string(0) {} + ostream_iterator(ostream_type& __s, const _CharT* __c) + : _M_stream(&__s), _M_string(__c) {} + ostream_iterator<_Tp>& operator=(const _Tp& __value) { + *_M_stream << __value; + if (_M_string) *_M_stream << _M_string; + return *this; + } + ostream_iterator<_Tp>& operator*() { return *this; } + ostream_iterator<_Tp>& operator++() { return *this; } + ostream_iterator<_Tp>& operator++(int) { return *this; } +private: + ostream_type* _M_stream; + const _CharT* _M_string; +}; + +// The default template argument is declared in iosfwd + +// We do not read any characters until operator* is called. The first +// time operator* is called, it calls getc. Subsequent calls to getc +// return a cached character, and calls to operator++ use snextc. Before +// operator* or operator++ has been called, _M_is_initialized is false. +template +class istreambuf_iterator + : public iterator +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename _Traits::int_type int_type; + typedef basic_streambuf<_CharT, _Traits> streambuf_type; + typedef basic_istream<_CharT, _Traits> istream_type; + +public: + istreambuf_iterator(streambuf_type* __p = 0) { this->_M_init(__p); } + istreambuf_iterator(istream_type& __is) { this->_M_init(__is.rdbuf()); } + + char_type operator*() const + { return _M_is_initialized ? _M_c : _M_dereference_aux(); } + + istreambuf_iterator& operator++() { this->_M_nextc(); return *this; } + istreambuf_iterator operator++(int) { + if (!_M_is_initialized) + _M_postincr_aux(); + istreambuf_iterator __tmp = *this; + this->_M_nextc(); + return __tmp; + } + + bool equal(const istreambuf_iterator& __i) const { + return this->_M_is_initialized && __i._M_is_initialized + ? this->_M_eof == __i._M_eof + : this->_M_equal_aux(__i); + } + +private: + void _M_init(streambuf_type* __p) { + _M_buf = __p; + _M_eof = !__p; + _M_is_initialized = _M_eof; + } + + char_type _M_dereference_aux() const; + bool _M_equal_aux(const istreambuf_iterator&) const; + void _M_postincr_aux(); + + void _M_nextc() { + int_type __c = _M_buf->snextc(); + _M_c = traits_type::to_char_type(__c); + _M_eof = traits_type::eq_int_type(__c, traits_type::eof()); + _M_is_initialized = true; + } + + void _M_getc() const { + int_type __c = _M_buf->sgetc(); + _M_c = traits_type::to_char_type(__c); + _M_eof = traits_type::eq_int_type(__c, traits_type::eof()); + _M_is_initialized = true; + } + +private: + streambuf_type* _M_buf; + mutable _CharT _M_c; + mutable bool _M_eof : 1; + mutable bool _M_is_initialized : 1; +}; + +template +_CharT istreambuf_iterator<_CharT, _Traits>::_M_dereference_aux() const +{ + this->_M_getc(); + return _M_c; +} + +template +bool istreambuf_iterator<_CharT, _Traits> + ::_M_equal_aux(const istreambuf_iterator& __i) const +{ + if (!this->_M_is_initialized) + this->_M_getc(); + if (!__i._M_is_initialized) + __i._M_getc(); + + return this->_M_eof == __i._M_eof; +} + +template +void istreambuf_iterator<_CharT, _Traits>::_M_postincr_aux() +{ + this->_M_getc(); +} + +template +inline bool operator==(const istreambuf_iterator<_CharT, _Traits>& __x, + const istreambuf_iterator<_CharT, _Traits>& __y) { + return __x.equal(__y); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const istreambuf_iterator<_CharT, _Traits>& __x, + const istreambuf_iterator<_CharT, _Traits>& __y) { + return !__x.equal(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// The default template argument is declared in iosfwd +template +class ostreambuf_iterator + : public iterator +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename _Traits::int_type int_type; + typedef basic_streambuf<_CharT, _Traits> streambuf_type; + typedef basic_ostream<_CharT, _Traits> ostream_type; + +public: + ostreambuf_iterator(streambuf_type* __buf) : _M_buf(__buf), _M_ok(__buf) {} + ostreambuf_iterator(ostream_type& __o) + : _M_buf(__o.rdbuf()), _M_ok(__o.rdbuf() != 0) {} + + ostreambuf_iterator& operator=(char_type __c) { + _M_ok = _M_ok && !traits_type::eq_int_type(_M_buf->sputc(__c), + traits_type::eof()); + return *this; + } + + ostreambuf_iterator& operator*() { return *this; } + ostreambuf_iterator& operator++() { return *this; } + ostreambuf_iterator& operator++(int) { return *this; } + + bool failed() const { return !_M_ok; } + +private: + streambuf_type* _M_buf; + bool _M_ok; +}; + +#else /* __STL_USE_NEW_IOSTREAMS */ + +template class istream_iterator; + +template +inline bool operator==(const istream_iterator<_Tp, _Dist>&, + const istream_iterator<_Tp, _Dist>&); + +template +class istream_iterator { +#ifdef __STL_TEMPLATE_FRIENDS + template + friend bool operator==(const istream_iterator<_T1, _D1>&, + const istream_iterator<_T1, _D1>&); +#else /* __STL_TEMPLATE_FRIENDS */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const istream_iterator&, + const istream_iterator&); +#endif /* __STL_TEMPLATE_FRIENDS */ + +protected: + istream* _M_stream; + _Tp _M_value; + bool _M_end_marker; + void _M_read() { + _M_end_marker = (*_M_stream) ? true : false; + if (_M_end_marker) *_M_stream >> _M_value; + _M_end_marker = (*_M_stream) ? true : false; + } +public: + typedef input_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Dist difference_type; + typedef const _Tp* pointer; + typedef const _Tp& reference; + + istream_iterator() : _M_stream(&cin), _M_end_marker(false) {} + istream_iterator(istream& __s) : _M_stream(&__s) { _M_read(); } + reference operator*() const { return _M_value; } +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return &(operator*()); } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + istream_iterator<_Tp, _Dist>& operator++() { + _M_read(); + return *this; + } + istream_iterator<_Tp, _Dist> operator++(int) { + istream_iterator<_Tp, _Dist> __tmp = *this; + _M_read(); + return __tmp; + } +}; + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline input_iterator_tag +iterator_category(const istream_iterator<_Tp, _Dist>&) +{ + return input_iterator_tag(); +} + +template +inline _Tp* +value_type(const istream_iterator<_Tp, _Dist>&) { return (_Tp*) 0; } + +template +inline _Dist* +distance_type(const istream_iterator<_Tp, _Dist>&) { return (_Dist*)0; } + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline bool operator==(const istream_iterator<_Tp, _Distance>& __x, + const istream_iterator<_Tp, _Distance>& __y) { + return (__x._M_stream == __y._M_stream && + __x._M_end_marker == __y._M_end_marker) || + __x._M_end_marker == false && __y._M_end_marker == false; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const istream_iterator<_Tp, _Distance>& __x, + const istream_iterator<_Tp, _Distance>& __y) { + return !(__x == __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template +class ostream_iterator { +protected: + ostream* _M_stream; + const char* _M_string; +public: + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + ostream_iterator(ostream& __s) : _M_stream(&__s), _M_string(0) {} + ostream_iterator(ostream& __s, const char* __c) + : _M_stream(&__s), _M_string(__c) {} + ostream_iterator<_Tp>& operator=(const _Tp& __value) { + *_M_stream << __value; + if (_M_string) *_M_stream << _M_string; + return *this; + } + ostream_iterator<_Tp>& operator*() { return *this; } + ostream_iterator<_Tp>& operator++() { return *this; } + ostream_iterator<_Tp>& operator++(int) { return *this; } +}; + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline output_iterator_tag +iterator_category(const ostream_iterator<_Tp>&) { + return output_iterator_tag(); +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +#endif /* __STL_USE_NEW_IOSTREAMS */ + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_ITERATOR_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_iterator_base.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_iterator_base.h new file mode 100644 index 0000000..9c54225 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_iterator_base.h @@ -0,0 +1,367 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996-1998 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_ITERATOR_BASE_H +#define __SGI_STL_INTERNAL_ITERATOR_BASE_H + +// This file contains all of the general iterator-related utilities. +// The internal file stl_iterator.h contains predefined iterators, +// such as front_insert_iterator and istream_iterator. + +#include + +__STL_BEGIN_NAMESPACE + +struct input_iterator_tag {}; +struct output_iterator_tag {}; +struct forward_iterator_tag : public input_iterator_tag {}; +struct bidirectional_iterator_tag : public forward_iterator_tag {}; +struct random_access_iterator_tag : public bidirectional_iterator_tag {}; + +// The base classes input_iterator, output_iterator, forward_iterator, +// bidirectional_iterator, and random_access_iterator are not part of +// the C++ standard. (They have been replaced by struct iterator.) +// They are included for backward compatibility with the HP STL. + +template struct input_iterator { + typedef input_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Tp* pointer; + typedef _Tp& reference; +}; + +struct output_iterator { + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; +}; + +template struct forward_iterator { + typedef forward_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Tp* pointer; + typedef _Tp& reference; +}; + + +template struct bidirectional_iterator { + typedef bidirectional_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Tp* pointer; + typedef _Tp& reference; +}; + +template struct random_access_iterator { + typedef random_access_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Tp* pointer; + typedef _Tp& reference; +}; + +#ifdef __STL_USE_NAMESPACES +template +struct iterator { + typedef _Category iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Pointer pointer; + typedef _Reference reference; +}; +#endif /* __STL_USE_NAMESPACES */ + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +struct iterator_traits { + typedef typename _Iterator::iterator_category iterator_category; + typedef typename _Iterator::value_type value_type; + typedef typename _Iterator::difference_type difference_type; + typedef typename _Iterator::pointer pointer; + typedef typename _Iterator::reference reference; +}; + +template +struct iterator_traits<_Tp*> { + typedef random_access_iterator_tag iterator_category; + typedef _Tp value_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef _Tp& reference; +}; + +template +struct iterator_traits { + typedef random_access_iterator_tag iterator_category; + typedef _Tp value_type; + typedef ptrdiff_t difference_type; + typedef const _Tp* pointer; + typedef const _Tp& reference; +}; + +// The overloaded functions iterator_category, distance_type, and +// value_type are not part of the C++ standard. (They have been +// replaced by struct iterator_traits.) They are included for +// backward compatibility with the HP STL. + +// We introduce internal names for these functions. + +template +inline typename iterator_traits<_Iter>::iterator_category +__iterator_category(const _Iter&) +{ + typedef typename iterator_traits<_Iter>::iterator_category _Category; + return _Category(); +} + +template +inline typename iterator_traits<_Iter>::difference_type* +__distance_type(const _Iter&) +{ + return static_cast::difference_type*>(0); +} + +template +inline typename iterator_traits<_Iter>::value_type* +__value_type(const _Iter&) +{ + return static_cast::value_type*>(0); +} + +template +inline typename iterator_traits<_Iter>::iterator_category +iterator_category(const _Iter& __i) { return __iterator_category(__i); } + + +template +inline typename iterator_traits<_Iter>::difference_type* +distance_type(const _Iter& __i) { return __distance_type(__i); } + +template +inline typename iterator_traits<_Iter>::value_type* +value_type(const _Iter& __i) { return __value_type(__i); } + +#define __ITERATOR_CATEGORY(__i) __iterator_category(__i) +#define __DISTANCE_TYPE(__i) __distance_type(__i) +#define __VALUE_TYPE(__i) __value_type(__i) + +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline input_iterator_tag +iterator_category(const input_iterator<_Tp, _Distance>&) + { return input_iterator_tag(); } + +inline output_iterator_tag iterator_category(const output_iterator&) + { return output_iterator_tag(); } + +template +inline forward_iterator_tag +iterator_category(const forward_iterator<_Tp, _Distance>&) + { return forward_iterator_tag(); } + +template +inline bidirectional_iterator_tag +iterator_category(const bidirectional_iterator<_Tp, _Distance>&) + { return bidirectional_iterator_tag(); } + +template +inline random_access_iterator_tag +iterator_category(const random_access_iterator<_Tp, _Distance>&) + { return random_access_iterator_tag(); } + +template +inline random_access_iterator_tag iterator_category(const _Tp*) + { return random_access_iterator_tag(); } + +template +inline _Tp* value_type(const input_iterator<_Tp, _Distance>&) + { return (_Tp*)(0); } + +template +inline _Tp* value_type(const forward_iterator<_Tp, _Distance>&) + { return (_Tp*)(0); } + +template +inline _Tp* value_type(const bidirectional_iterator<_Tp, _Distance>&) + { return (_Tp*)(0); } + +template +inline _Tp* value_type(const random_access_iterator<_Tp, _Distance>&) + { return (_Tp*)(0); } + +template +inline _Tp* value_type(const _Tp*) { return (_Tp*)(0); } + +template +inline _Distance* distance_type(const input_iterator<_Tp, _Distance>&) +{ + return (_Distance*)(0); +} + +template +inline _Distance* distance_type(const forward_iterator<_Tp, _Distance>&) +{ + return (_Distance*)(0); +} + +template +inline _Distance* +distance_type(const bidirectional_iterator<_Tp, _Distance>&) +{ + return (_Distance*)(0); +} + +template +inline _Distance* +distance_type(const random_access_iterator<_Tp, _Distance>&) +{ + return (_Distance*)(0); +} + +template +inline ptrdiff_t* distance_type(const _Tp*) { return (ptrdiff_t*)(0); } + +// Without partial specialization we can't use iterator_traits, so +// we must keep the old iterator query functions around. + +#define __ITERATOR_CATEGORY(__i) iterator_category(__i) +#define __DISTANCE_TYPE(__i) distance_type(__i) +#define __VALUE_TYPE(__i) value_type(__i) + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline void __distance(_InputIterator __first, _InputIterator __last, + _Distance& __n, input_iterator_tag) +{ + while (__first != __last) { ++__first; ++__n; } +} + +template +inline void __distance(_RandomAccessIterator __first, + _RandomAccessIterator __last, + _Distance& __n, random_access_iterator_tag) +{ + __STL_REQUIRES(_RandomAccessIterator, _RandomAccessIterator); + __n += __last - __first; +} + +template +inline void distance(_InputIterator __first, + _InputIterator __last, _Distance& __n) +{ + __STL_REQUIRES(_InputIterator, _InputIterator); + __distance(__first, __last, __n, iterator_category(__first)); +} + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline typename iterator_traits<_InputIterator>::difference_type +__distance(_InputIterator __first, _InputIterator __last, input_iterator_tag) +{ + typename iterator_traits<_InputIterator>::difference_type __n = 0; + while (__first != __last) { + ++__first; ++__n; + } + return __n; +} + +template +inline typename iterator_traits<_RandomAccessIterator>::difference_type +__distance(_RandomAccessIterator __first, _RandomAccessIterator __last, + random_access_iterator_tag) { + __STL_REQUIRES(_RandomAccessIterator, _RandomAccessIterator); + return __last - __first; +} + +template +inline typename iterator_traits<_InputIterator>::difference_type +distance(_InputIterator __first, _InputIterator __last) { + typedef typename iterator_traits<_InputIterator>::iterator_category + _Category; + __STL_REQUIRES(_InputIterator, _InputIterator); + return __distance(__first, __last, _Category()); +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +template +inline void __advance(_InputIter& __i, _Distance __n, input_iterator_tag) { + while (__n--) ++__i; +} + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1183 +#endif + +template +inline void __advance(_BidirectionalIterator& __i, _Distance __n, + bidirectional_iterator_tag) { + __STL_REQUIRES(_BidirectionalIterator, _BidirectionalIterator); + if (__n >= 0) + while (__n--) ++__i; + else + while (__n++) --__i; +} + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1183 +#endif + +template +inline void __advance(_RandomAccessIterator& __i, _Distance __n, + random_access_iterator_tag) { + __STL_REQUIRES(_RandomAccessIterator, _RandomAccessIterator); + __i += __n; +} + +template +inline void advance(_InputIterator& __i, _Distance __n) { + __STL_REQUIRES(_InputIterator, _InputIterator); + __advance(__i, __n, iterator_category(__i)); +} + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_ITERATOR_BASE_H */ + + + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_list.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_list.h new file mode 100644 index 0000000..1aa603a --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_list.h @@ -0,0 +1,885 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_LIST_H +#define __SGI_STL_INTERNAL_LIST_H + +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +struct _List_node_base { + _List_node_base* _M_next; + _List_node_base* _M_prev; +}; + +template +struct _List_node : public _List_node_base { + _Tp _M_data; +}; + +struct _List_iterator_base { + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef bidirectional_iterator_tag iterator_category; + + _List_node_base* _M_node; + + _List_iterator_base(_List_node_base* __x) : _M_node(__x) {} + _List_iterator_base() {} + + void _M_incr() { _M_node = _M_node->_M_next; } + void _M_decr() { _M_node = _M_node->_M_prev; } + + bool operator==(const _List_iterator_base& __x) const { + return _M_node == __x._M_node; + } + bool operator!=(const _List_iterator_base& __x) const { + return _M_node != __x._M_node; + } +}; + +template +struct _List_iterator : public _List_iterator_base { + typedef _List_iterator<_Tp,_Tp&,_Tp*> iterator; + typedef _List_iterator<_Tp,const _Tp&,const _Tp*> const_iterator; + typedef _List_iterator<_Tp,_Ref,_Ptr> _Self; + + typedef _Tp value_type; + typedef _Ptr pointer; + typedef _Ref reference; + typedef _List_node<_Tp> _Node; + + _List_iterator(_Node* __x) : _List_iterator_base(__x) {} + _List_iterator() {} + _List_iterator(const iterator& __x) : _List_iterator_base(__x._M_node) {} + + reference operator*() const { return ((_Node*) _M_node)->_M_data; } + +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return &(operator*()); } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + + _Self& operator++() { + this->_M_incr(); + return *this; + } + _Self operator++(int) { + _Self __tmp = *this; + this->_M_incr(); + return __tmp; + } + _Self& operator--() { + this->_M_decr(); + return *this; + } + _Self operator--(int) { + _Self __tmp = *this; + this->_M_decr(); + return __tmp; + } +}; + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +inline bidirectional_iterator_tag +iterator_category(const _List_iterator_base&) +{ + return bidirectional_iterator_tag(); +} + +template +inline _Tp* +value_type(const _List_iterator<_Tp, _Ref, _Ptr>&) +{ + return 0; +} + +inline ptrdiff_t* +distance_type(const _List_iterator_base&) +{ + return 0; +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + + +// Base class that encapsulates details of allocators. Three cases: +// an ordinary standard-conforming allocator, a standard-conforming +// allocator with no non-static data, and an SGI-style allocator. +// This complexity is necessary only because we're worrying about backward +// compatibility and because we want to avoid wasting storage on an +// allocator instance if it isn't necessary. + +#ifdef __STL_USE_STD_ALLOCATORS + +// Base for general standard-conforming allocators. +template +class _List_alloc_base { +public: + typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return _Node_allocator; } + + _List_alloc_base(const allocator_type& __a) : _Node_allocator(__a) {} + +protected: + _List_node<_Tp>* _M_get_node() + { return _Node_allocator.allocate(1); } + void _M_put_node(_List_node<_Tp>* __p) + { _Node_allocator.deallocate(__p, 1); } + +protected: + typename _Alloc_traits<_List_node<_Tp>, _Allocator>::allocator_type + _Node_allocator; + _List_node<_Tp>* _M_node; +}; + +// Specialization for instanceless allocators. + +template +class _List_alloc_base<_Tp, _Allocator, true> { +public: + typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _List_alloc_base(const allocator_type&) {} + +protected: + typedef typename _Alloc_traits<_List_node<_Tp>, _Allocator>::_Alloc_type + _Alloc_type; + _List_node<_Tp>* _M_get_node() { return _Alloc_type::allocate(1); } + void _M_put_node(_List_node<_Tp>* __p) { _Alloc_type::deallocate(__p, 1); } + +protected: + _List_node<_Tp>* _M_node; +}; + +template +class _List_base + : public _List_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> +{ +public: + typedef _List_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> + _Base; + typedef typename _Base::allocator_type allocator_type; + + _List_base(const allocator_type& __a) : _Base(__a) { + _M_node = _M_get_node(); + _M_node->_M_next = _M_node; + _M_node->_M_prev = _M_node; + } + ~_List_base() { + clear(); + _M_put_node(_M_node); + } + + void clear(); +}; + +#else /* __STL_USE_STD_ALLOCATORS */ + +template +class _List_base +{ +public: + typedef _Alloc allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _List_base(const allocator_type&) { + _M_node = _M_get_node(); + _M_node->_M_next = _M_node; + _M_node->_M_prev = _M_node; + } + ~_List_base() { + clear(); + _M_put_node(_M_node); + } + + void clear(); + +protected: + typedef simple_alloc<_List_node<_Tp>, _Alloc> _Alloc_type; + _List_node<_Tp>* _M_get_node() { return _Alloc_type::allocate(1); } + void _M_put_node(_List_node<_Tp>* __p) { _Alloc_type::deallocate(__p, 1); } + +protected: + _List_node<_Tp>* _M_node; +}; + +#endif /* __STL_USE_STD_ALLOCATORS */ + +template +void +_List_base<_Tp,_Alloc>::clear() +{ + _List_node<_Tp>* __cur = (_List_node<_Tp>*) _M_node->_M_next; + while (__cur != _M_node) { + _List_node<_Tp>* __tmp = __cur; + __cur = (_List_node<_Tp>*) __cur->_M_next; + _Destroy(&__tmp->_M_data); + _M_put_node(__tmp); + } + _M_node->_M_next = _M_node; + _M_node->_M_prev = _M_node; +} + +template +class list : protected _List_base<_Tp, _Alloc> { + // requirements: + + __STL_CLASS_REQUIRES(_Tp, _Assignable); + + typedef _List_base<_Tp, _Alloc> _Base; +protected: + typedef void* _Void_pointer; + +public: + typedef _Tp value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef _List_node<_Tp> _Node; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + typedef typename _Base::allocator_type allocator_type; + allocator_type get_allocator() const { return _Base::get_allocator(); } + +public: + typedef _List_iterator<_Tp,_Tp&,_Tp*> iterator; + typedef _List_iterator<_Tp,const _Tp&,const _Tp*> const_iterator; + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + typedef reverse_iterator const_reverse_iterator; + typedef reverse_iterator reverse_iterator; +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + typedef reverse_bidirectional_iterator + const_reverse_iterator; + typedef reverse_bidirectional_iterator + reverse_iterator; +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +protected: +#ifdef __STL_HAS_NAMESPACES + using _Base::_M_node; + using _Base::_M_put_node; + using _Base::_M_get_node; +#endif /* __STL_HAS_NAMESPACES */ + +protected: + _Node* _M_create_node(const _Tp& __x) + { + _Node* __p = _M_get_node(); + __STL_TRY { + _Construct(&__p->_M_data, __x); + } + __STL_UNWIND(_M_put_node(__p)); + return __p; + } + + _Node* _M_create_node() + { + _Node* __p = _M_get_node(); + __STL_TRY { + _Construct(&__p->_M_data); + } + __STL_UNWIND(_M_put_node(__p)); + return __p; + } + +public: + explicit list(const allocator_type& __a = allocator_type()) : _Base(__a) {} + + iterator begin() { return (_Node*)(_M_node->_M_next); } + const_iterator begin() const { return (_Node*)(_M_node->_M_next); } + + iterator end() { return _M_node; } + const_iterator end() const { return _M_node; } + + reverse_iterator rbegin() + { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const + { return const_reverse_iterator(end()); } + + reverse_iterator rend() + { return reverse_iterator(begin()); } + const_reverse_iterator rend() const + { return const_reverse_iterator(begin()); } + + bool empty() const { return _M_node->_M_next == _M_node; } + size_type size() const { + size_type __result = 0; + distance(begin(), end(), __result); + return __result; + } + size_type max_size() const { return size_type(-1); } + + reference front() { return *begin(); } + const_reference front() const { return *begin(); } + reference back() { return *(--end()); } + const_reference back() const { return *(--end()); } + + void swap(list<_Tp, _Alloc>& __x) { __STD::swap(_M_node, __x._M_node); } + + iterator insert(iterator __position, const _Tp& __x) { + _Node* __tmp = _M_create_node(__x); + __tmp->_M_next = __position._M_node; + __tmp->_M_prev = __position._M_node->_M_prev; + __position._M_node->_M_prev->_M_next = __tmp; + __position._M_node->_M_prev = __tmp; + return __tmp; + } + iterator insert(iterator __position) { return insert(__position, _Tp()); } +#ifdef __STL_MEMBER_TEMPLATES + // Check whether it's an integral type. If so, it's not an iterator. + + template + void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x, + __true_type) { + _M_fill_insert(__pos, (size_type) __n, (_Tp) __x); + } + + template + void _M_insert_dispatch(iterator __pos, + _InputIterator __first, _InputIterator __last, + __false_type); + + template + void insert(iterator __pos, _InputIterator __first, _InputIterator __last) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_insert_dispatch(__pos, __first, __last, _Integral()); + } + +#else /* __STL_MEMBER_TEMPLATES */ + void insert(iterator __position, const _Tp* __first, const _Tp* __last); + void insert(iterator __position, + const_iterator __first, const_iterator __last); +#endif /* __STL_MEMBER_TEMPLATES */ + void insert(iterator __pos, size_type __n, const _Tp& __x) + { _M_fill_insert(__pos, __n, __x); } + void _M_fill_insert(iterator __pos, size_type __n, const _Tp& __x); + + void push_front(const _Tp& __x) { insert(begin(), __x); } + void push_front() {insert(begin());} + void push_back(const _Tp& __x) { insert(end(), __x); } + void push_back() {insert(end());} + + iterator erase(iterator __position) { + _List_node_base* __next_node = __position._M_node->_M_next; + _List_node_base* __prev_node = __position._M_node->_M_prev; + _Node* __n = (_Node*) __position._M_node; + __prev_node->_M_next = __next_node; + __next_node->_M_prev = __prev_node; + _Destroy(&__n->_M_data); + _M_put_node(__n); + return iterator((_Node*) __next_node); + } + iterator erase(iterator __first, iterator __last); + void clear() { _Base::clear(); } + + void resize(size_type __new_size, const _Tp& __x); + void resize(size_type __new_size) { this->resize(__new_size, _Tp()); } + + void pop_front() { erase(begin()); } + void pop_back() { + iterator __tmp = end(); + erase(--__tmp); + } + list(size_type __n, const _Tp& __value, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { insert(begin(), __n, __value); } + explicit list(size_type __n) + : _Base(allocator_type()) + { insert(begin(), __n, _Tp()); } + +#ifdef __STL_MEMBER_TEMPLATES + + // We don't need any dispatching tricks here, because insert does all of + // that anyway. + template + list(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { insert(begin(), __first, __last); } + +#else /* __STL_MEMBER_TEMPLATES */ + + list(const _Tp* __first, const _Tp* __last, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { this->insert(begin(), __first, __last); } + list(const_iterator __first, const_iterator __last, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { this->insert(begin(), __first, __last); } + +#endif /* __STL_MEMBER_TEMPLATES */ + list(const list<_Tp, _Alloc>& __x) : _Base(__x.get_allocator()) + { insert(begin(), __x.begin(), __x.end()); } + + ~list() { } + + list<_Tp, _Alloc>& operator=(const list<_Tp, _Alloc>& __x); + +public: + // assign(), a generalized assignment member function. Two + // versions: one that takes a count, and one that takes a range. + // The range version is a member template, so we dispatch on whether + // or not the type is an integer. + + void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); } + + void _M_fill_assign(size_type __n, const _Tp& __val); + +#ifdef __STL_MEMBER_TEMPLATES + + template + void assign(_InputIterator __first, _InputIterator __last) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_assign_dispatch(__first, __last, _Integral()); + } + + template + void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type) + { _M_fill_assign((size_type) __n, (_Tp) __val); } + + template + void _M_assign_dispatch(_InputIterator __first, _InputIterator __last, + __false_type); + +#endif /* __STL_MEMBER_TEMPLATES */ + +protected: + void transfer(iterator __position, iterator __first, iterator __last) { + if (__position != __last) { + // Remove [first, last) from its old position. + __last._M_node->_M_prev->_M_next = __position._M_node; + __first._M_node->_M_prev->_M_next = __last._M_node; + __position._M_node->_M_prev->_M_next = __first._M_node; + + // Splice [first, last) into its new position. + _List_node_base* __tmp = __position._M_node->_M_prev; + __position._M_node->_M_prev = __last._M_node->_M_prev; + __last._M_node->_M_prev = __first._M_node->_M_prev; + __first._M_node->_M_prev = __tmp; + } + } + +public: + void splice(iterator __position, list& __x) { + if (!__x.empty()) + this->transfer(__position, __x.begin(), __x.end()); + } + void splice(iterator __position, list&, iterator __i) { + iterator __j = __i; + ++__j; + if (__position == __i || __position == __j) return; + this->transfer(__position, __i, __j); + } + void splice(iterator __position, list&, iterator __first, iterator __last) { + if (__first != __last) + this->transfer(__position, __first, __last); + } + void remove(const _Tp& __value); + void unique(); + void merge(list& __x); + void reverse(); + void sort(); + +#ifdef __STL_MEMBER_TEMPLATES + template void remove_if(_Predicate); + template void unique(_BinaryPredicate); + template void merge(list&, _StrictWeakOrdering); + template void sort(_StrictWeakOrdering); +#endif /* __STL_MEMBER_TEMPLATES */ +}; + +template +inline bool +operator==(const list<_Tp,_Alloc>& __x, const list<_Tp,_Alloc>& __y) +{ + typedef typename list<_Tp,_Alloc>::const_iterator const_iterator; + const_iterator __end1 = __x.end(); + const_iterator __end2 = __y.end(); + + const_iterator __i1 = __x.begin(); + const_iterator __i2 = __y.begin(); + while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) { + ++__i1; + ++__i2; + } + return __i1 == __end1 && __i2 == __end2; +} + +template +inline bool operator<(const list<_Tp,_Alloc>& __x, + const list<_Tp,_Alloc>& __y) +{ + return lexicographical_compare(__x.begin(), __x.end(), + __y.begin(), __y.end()); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const list<_Tp,_Alloc>& __x, + const list<_Tp,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool operator>(const list<_Tp,_Alloc>& __x, + const list<_Tp,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool operator<=(const list<_Tp,_Alloc>& __x, + const list<_Tp,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool operator>=(const list<_Tp,_Alloc>& __x, + const list<_Tp,_Alloc>& __y) { + return !(__x < __y); +} + +template +inline void +swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y) +{ + __x.swap(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +#ifdef __STL_MEMBER_TEMPLATES + +template template +void +list<_Tp, _Alloc>::_M_insert_dispatch(iterator __position, + _InputIter __first, _InputIter __last, + __false_type) +{ + for ( ; __first != __last; ++__first) + insert(__position, *__first); +} + +#else /* __STL_MEMBER_TEMPLATES */ + +template +void +list<_Tp, _Alloc>::insert(iterator __position, + const _Tp* __first, const _Tp* __last) +{ + for ( ; __first != __last; ++__first) + insert(__position, *__first); +} + +template +void +list<_Tp, _Alloc>::insert(iterator __position, + const_iterator __first, const_iterator __last) +{ + for ( ; __first != __last; ++__first) + insert(__position, *__first); +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +void +list<_Tp, _Alloc>::_M_fill_insert(iterator __position, + size_type __n, const _Tp& __x) +{ + for ( ; __n > 0; --__n) + insert(__position, __x); +} + +template +typename list<_Tp,_Alloc>::iterator list<_Tp, _Alloc>::erase(iterator __first, + iterator __last) +{ + while (__first != __last) + erase(__first++); + return __last; +} + +template +void list<_Tp, _Alloc>::resize(size_type __new_size, const _Tp& __x) +{ + iterator __i = begin(); + size_type __len = 0; + for ( ; __i != end() && __len < __new_size; ++__i, ++__len) + ; + if (__len == __new_size) + erase(__i, end()); + else // __i == end() + insert(end(), __new_size - __len, __x); +} + +template +list<_Tp, _Alloc>& list<_Tp, _Alloc>::operator=(const list<_Tp, _Alloc>& __x) +{ + if (this != &__x) { + iterator __first1 = begin(); + iterator __last1 = end(); + const_iterator __first2 = __x.begin(); + const_iterator __last2 = __x.end(); + while (__first1 != __last1 && __first2 != __last2) + *__first1++ = *__first2++; + if (__first2 == __last2) + erase(__first1, __last1); + else + insert(__last1, __first2, __last2); + } + return *this; +} + +template +void list<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) { + iterator __i = begin(); + for ( ; __i != end() && __n > 0; ++__i, --__n) + *__i = __val; + if (__n > 0) + insert(end(), __n, __val); + else + erase(__i, end()); +} + +#ifdef __STL_MEMBER_TEMPLATES + +template template +void +list<_Tp, _Alloc>::_M_assign_dispatch(_InputIter __first2, _InputIter __last2, + __false_type) +{ + iterator __first1 = begin(); + iterator __last1 = end(); + for ( ; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2) + *__first1 = *__first2; + if (__first2 == __last2) + erase(__first1, __last1); + else + insert(__last1, __first2, __last2); +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +void list<_Tp, _Alloc>::remove(const _Tp& __value) +{ + iterator __first = begin(); + iterator __last = end(); + while (__first != __last) { + iterator __next = __first; + ++__next; + if (*__first == __value) erase(__first); + __first = __next; + } +} + +template +void list<_Tp, _Alloc>::unique() +{ + iterator __first = begin(); + iterator __last = end(); + if (__first == __last) return; + iterator __next = __first; + while (++__next != __last) { + if (*__first == *__next) + erase(__next); + else + __first = __next; + __next = __first; + } +} + +template +void list<_Tp, _Alloc>::merge(list<_Tp, _Alloc>& __x) +{ + iterator __first1 = begin(); + iterator __last1 = end(); + iterator __first2 = __x.begin(); + iterator __last2 = __x.end(); + while (__first1 != __last1 && __first2 != __last2) + if (*__first2 < *__first1) { + iterator __next = __first2; + transfer(__first1, __first2, ++__next); + __first2 = __next; + } + else + ++__first1; + if (__first2 != __last2) transfer(__last1, __first2, __last2); +} + +inline void __List_base_reverse(_List_node_base* __p) +{ + _List_node_base* __tmp = __p; + do { + __STD::swap(__tmp->_M_next, __tmp->_M_prev); + __tmp = __tmp->_M_prev; // Old next node is now prev. + } while (__tmp != __p); +} + +template +inline void list<_Tp, _Alloc>::reverse() +{ + __List_base_reverse(this->_M_node); +} + +template +void list<_Tp, _Alloc>::sort() +{ + // Do nothing if the list has length 0 or 1. + if (_M_node->_M_next != _M_node && _M_node->_M_next->_M_next != _M_node) { + list<_Tp, _Alloc> __carry; + list<_Tp, _Alloc> __counter[64]; + int __fill = 0; + while (!empty()) { + __carry.splice(__carry.begin(), *this, begin()); + int __i = 0; + while(__i < __fill && !__counter[__i].empty()) { + __counter[__i].merge(__carry); + __carry.swap(__counter[__i++]); + } + __carry.swap(__counter[__i]); + if (__i == __fill) ++__fill; + } + + for (int __i = 1; __i < __fill; ++__i) + __counter[__i].merge(__counter[__i-1]); + swap(__counter[__fill-1]); + } +} + +#ifdef __STL_MEMBER_TEMPLATES + +template template +void list<_Tp, _Alloc>::remove_if(_Predicate __pred) +{ + iterator __first = begin(); + iterator __last = end(); + while (__first != __last) { + iterator __next = __first; + ++__next; + if (__pred(*__first)) erase(__first); + __first = __next; + } +} + +template template +void list<_Tp, _Alloc>::unique(_BinaryPredicate __binary_pred) +{ + iterator __first = begin(); + iterator __last = end(); + if (__first == __last) return; + iterator __next = __first; + while (++__next != __last) { + if (__binary_pred(*__first, *__next)) + erase(__next); + else + __first = __next; + __next = __first; + } +} + +template template +void list<_Tp, _Alloc>::merge(list<_Tp, _Alloc>& __x, + _StrictWeakOrdering __comp) +{ + iterator __first1 = begin(); + iterator __last1 = end(); + iterator __first2 = __x.begin(); + iterator __last2 = __x.end(); + while (__first1 != __last1 && __first2 != __last2) + if (__comp(*__first2, *__first1)) { + iterator __next = __first2; + transfer(__first1, __first2, ++__next); + __first2 = __next; + } + else + ++__first1; + if (__first2 != __last2) transfer(__last1, __first2, __last2); +} + +template template +void list<_Tp, _Alloc>::sort(_StrictWeakOrdering __comp) +{ + // Do nothing if the list has length 0 or 1. + if (_M_node->_M_next != _M_node && _M_node->_M_next->_M_next != _M_node) { + list<_Tp, _Alloc> __carry; + list<_Tp, _Alloc> __counter[64]; + int __fill = 0; + while (!empty()) { + __carry.splice(__carry.begin(), *this, begin()); + int __i = 0; + while(__i < __fill && !__counter[__i].empty()) { + __counter[__i].merge(__carry, __comp); + __carry.swap(__counter[__i++]); + } + __carry.swap(__counter[__i]); + if (__i == __fill) ++__fill; + } + + for (int __i = 1; __i < __fill; ++__i) + __counter[__i].merge(__counter[__i-1], __comp); + swap(__counter[__fill-1]); + } +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_LIST_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_map.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_map.h new file mode 100644 index 0000000..a2ea66c --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_map.h @@ -0,0 +1,295 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_MAP_H +#define __SGI_STL_INTERNAL_MAP_H + +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +// Forward declarations of operators == and <, needed for friend declarations. +template ), + class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) > +class map; + +template +inline bool operator==(const map<_Key,_Tp,_Compare,_Alloc>& __x, + const map<_Key,_Tp,_Compare,_Alloc>& __y); + +template +inline bool operator<(const map<_Key,_Tp,_Compare,_Alloc>& __x, + const map<_Key,_Tp,_Compare,_Alloc>& __y); + +template +class map { +public: + +// requirements: + + __STL_CLASS_REQUIRES(_Tp, _Assignable); + __STL_CLASS_BINARY_FUNCTION_CHECK(_Compare, bool, _Key, _Key); + +// typedefs: + + typedef _Key key_type; + typedef _Tp data_type; + typedef _Tp mapped_type; + typedef pair value_type; + typedef _Compare key_compare; + + class value_compare + : public binary_function { + friend class map<_Key,_Tp,_Compare,_Alloc>; + protected : + _Compare comp; + value_compare(_Compare __c) : comp(__c) {} + public: + bool operator()(const value_type& __x, const value_type& __y) const { + return comp(__x.first, __y.first); + } + }; + +private: + typedef _Rb_tree, key_compare, _Alloc> _Rep_type; + _Rep_type _M_t; // red-black tree representing map +public: + typedef typename _Rep_type::pointer pointer; + typedef typename _Rep_type::const_pointer const_pointer; + typedef typename _Rep_type::reference reference; + typedef typename _Rep_type::const_reference const_reference; + typedef typename _Rep_type::iterator iterator; + typedef typename _Rep_type::const_iterator const_iterator; + typedef typename _Rep_type::reverse_iterator reverse_iterator; + typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; + typedef typename _Rep_type::size_type size_type; + typedef typename _Rep_type::difference_type difference_type; + typedef typename _Rep_type::allocator_type allocator_type; + + // allocation/deallocation + + map() : _M_t(_Compare(), allocator_type()) {} + explicit map(const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) {} + +#ifdef __STL_MEMBER_TEMPLATES + template + map(_InputIterator __first, _InputIterator __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_unique(__first, __last); } + + template + map(_InputIterator __first, _InputIterator __last, const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); } +#else + map(const value_type* __first, const value_type* __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_unique(__first, __last); } + + map(const value_type* __first, + const value_type* __last, const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); } + + map(const_iterator __first, const_iterator __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_unique(__first, __last); } + + map(const_iterator __first, const_iterator __last, const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); } + +#endif /* __STL_MEMBER_TEMPLATES */ + + map(const map<_Key,_Tp,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {} + map<_Key,_Tp,_Compare,_Alloc>& + operator=(const map<_Key, _Tp, _Compare, _Alloc>& __x) + { + _M_t = __x._M_t; + return *this; + } + + // accessors: + + key_compare key_comp() const { return _M_t.key_comp(); } + value_compare value_comp() const { return value_compare(_M_t.key_comp()); } + allocator_type get_allocator() const { return _M_t.get_allocator(); } + + iterator begin() { return _M_t.begin(); } + const_iterator begin() const { return _M_t.begin(); } + iterator end() { return _M_t.end(); } + const_iterator end() const { return _M_t.end(); } + reverse_iterator rbegin() { return _M_t.rbegin(); } + const_reverse_iterator rbegin() const { return _M_t.rbegin(); } + reverse_iterator rend() { return _M_t.rend(); } + const_reverse_iterator rend() const { return _M_t.rend(); } + bool empty() const { return _M_t.empty(); } + size_type size() const { return _M_t.size(); } + size_type max_size() const { return _M_t.max_size(); } + _Tp& operator[](const key_type& __k) { + iterator __i = lower_bound(__k); + // __i->first is greater than or equivalent to __k. + if (__i == end() || key_comp()(__k, (*__i).first)) + __i = insert(__i, value_type(__k, _Tp())); + return (*__i).second; + } + void swap(map<_Key,_Tp,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); } + + // insert/erase + + pair insert(const value_type& __x) + { return _M_t.insert_unique(__x); } + iterator insert(iterator position, const value_type& __x) + { return _M_t.insert_unique(position, __x); } +#ifdef __STL_MEMBER_TEMPLATES + template + void insert(_InputIterator __first, _InputIterator __last) { + _M_t.insert_unique(__first, __last); + } +#else + void insert(const value_type* __first, const value_type* __last) { + _M_t.insert_unique(__first, __last); + } + void insert(const_iterator __first, const_iterator __last) { + _M_t.insert_unique(__first, __last); + } +#endif /* __STL_MEMBER_TEMPLATES */ + + void erase(iterator __position) { _M_t.erase(__position); } + size_type erase(const key_type& __x) { return _M_t.erase(__x); } + void erase(iterator __first, iterator __last) + { _M_t.erase(__first, __last); } + void clear() { _M_t.clear(); } + + // map operations: + + iterator find(const key_type& __x) { return _M_t.find(__x); } + const_iterator find(const key_type& __x) const { return _M_t.find(__x); } + size_type count(const key_type& __x) const { + return _M_t.find(__x) == _M_t.end() ? 0 : 1; + } + iterator lower_bound(const key_type& __x) {return _M_t.lower_bound(__x); } + const_iterator lower_bound(const key_type& __x) const { + return _M_t.lower_bound(__x); + } + iterator upper_bound(const key_type& __x) {return _M_t.upper_bound(__x); } + const_iterator upper_bound(const key_type& __x) const { + return _M_t.upper_bound(__x); + } + + pair equal_range(const key_type& __x) { + return _M_t.equal_range(__x); + } + pair equal_range(const key_type& __x) const { + return _M_t.equal_range(__x); + } + +#ifdef __STL_TEMPLATE_FRIENDS + template + friend bool operator== (const map<_K1, _T1, _C1, _A1>&, + const map<_K1, _T1, _C1, _A1>&); + template + friend bool operator< (const map<_K1, _T1, _C1, _A1>&, + const map<_K1, _T1, _C1, _A1>&); +#else /* __STL_TEMPLATE_FRIENDS */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const map&, const map&); + friend bool __STD_QUALIFIER + operator< __STL_NULL_TMPL_ARGS (const map&, const map&); +#endif /* __STL_TEMPLATE_FRIENDS */ +}; + +template +inline bool operator==(const map<_Key,_Tp,_Compare,_Alloc>& __x, + const map<_Key,_Tp,_Compare,_Alloc>& __y) { + return __x._M_t == __y._M_t; +} + +template +inline bool operator<(const map<_Key,_Tp,_Compare,_Alloc>& __x, + const map<_Key,_Tp,_Compare,_Alloc>& __y) { + return __x._M_t < __y._M_t; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const map<_Key,_Tp,_Compare,_Alloc>& __x, + const map<_Key,_Tp,_Compare,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool operator>(const map<_Key,_Tp,_Compare,_Alloc>& __x, + const map<_Key,_Tp,_Compare,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool operator<=(const map<_Key,_Tp,_Compare,_Alloc>& __x, + const map<_Key,_Tp,_Compare,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool operator>=(const map<_Key,_Tp,_Compare,_Alloc>& __x, + const map<_Key,_Tp,_Compare,_Alloc>& __y) { + return !(__x < __y); +} + +template +inline void swap(map<_Key,_Tp,_Compare,_Alloc>& __x, + map<_Key,_Tp,_Compare,_Alloc>& __y) { + __x.swap(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_MAP_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_multimap.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_multimap.h new file mode 100644 index 0000000..ecd959c --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_multimap.h @@ -0,0 +1,282 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_MULTIMAP_H +#define __SGI_STL_INTERNAL_MULTIMAP_H + +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +// Forward declaration of operators < and ==, needed for friend declaration. + +template ), + class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) > +class multimap; + +template +inline bool operator==(const multimap<_Key,_Tp,_Compare,_Alloc>& __x, + const multimap<_Key,_Tp,_Compare,_Alloc>& __y); + +template +inline bool operator<(const multimap<_Key,_Tp,_Compare,_Alloc>& __x, + const multimap<_Key,_Tp,_Compare,_Alloc>& __y); + +template +class multimap { + // requirements: + + __STL_CLASS_REQUIRES(_Tp, _Assignable); + __STL_CLASS_BINARY_FUNCTION_CHECK(_Compare, bool, _Key, _Key); + +public: + +// typedefs: + + typedef _Key key_type; + typedef _Tp data_type; + typedef _Tp mapped_type; + typedef pair value_type; + typedef _Compare key_compare; + + class value_compare : public binary_function { + friend class multimap<_Key,_Tp,_Compare,_Alloc>; + protected: + _Compare comp; + value_compare(_Compare __c) : comp(__c) {} + public: + bool operator()(const value_type& __x, const value_type& __y) const { + return comp(__x.first, __y.first); + } + }; + +private: + typedef _Rb_tree, key_compare, _Alloc> _Rep_type; + _Rep_type _M_t; // red-black tree representing multimap +public: + typedef typename _Rep_type::pointer pointer; + typedef typename _Rep_type::const_pointer const_pointer; + typedef typename _Rep_type::reference reference; + typedef typename _Rep_type::const_reference const_reference; + typedef typename _Rep_type::iterator iterator; + typedef typename _Rep_type::const_iterator const_iterator; + typedef typename _Rep_type::reverse_iterator reverse_iterator; + typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; + typedef typename _Rep_type::size_type size_type; + typedef typename _Rep_type::difference_type difference_type; + typedef typename _Rep_type::allocator_type allocator_type; + +// allocation/deallocation + + multimap() : _M_t(_Compare(), allocator_type()) { } + explicit multimap(const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { } + +#ifdef __STL_MEMBER_TEMPLATES + template + multimap(_InputIterator __first, _InputIterator __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_equal(__first, __last); } + + template + multimap(_InputIterator __first, _InputIterator __last, + const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); } +#else + multimap(const value_type* __first, const value_type* __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_equal(__first, __last); } + multimap(const value_type* __first, const value_type* __last, + const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); } + + multimap(const_iterator __first, const_iterator __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_equal(__first, __last); } + multimap(const_iterator __first, const_iterator __last, + const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); } +#endif /* __STL_MEMBER_TEMPLATES */ + + multimap(const multimap<_Key,_Tp,_Compare,_Alloc>& __x) : _M_t(__x._M_t) { } + multimap<_Key,_Tp,_Compare,_Alloc>& + operator=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x) { + _M_t = __x._M_t; + return *this; + } + + // accessors: + + key_compare key_comp() const { return _M_t.key_comp(); } + value_compare value_comp() const { return value_compare(_M_t.key_comp()); } + allocator_type get_allocator() const { return _M_t.get_allocator(); } + + iterator begin() { return _M_t.begin(); } + const_iterator begin() const { return _M_t.begin(); } + iterator end() { return _M_t.end(); } + const_iterator end() const { return _M_t.end(); } + reverse_iterator rbegin() { return _M_t.rbegin(); } + const_reverse_iterator rbegin() const { return _M_t.rbegin(); } + reverse_iterator rend() { return _M_t.rend(); } + const_reverse_iterator rend() const { return _M_t.rend(); } + bool empty() const { return _M_t.empty(); } + size_type size() const { return _M_t.size(); } + size_type max_size() const { return _M_t.max_size(); } + void swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); } + + // insert/erase + + iterator insert(const value_type& __x) { return _M_t.insert_equal(__x); } + iterator insert(iterator __position, const value_type& __x) { + return _M_t.insert_equal(__position, __x); + } +#ifdef __STL_MEMBER_TEMPLATES + template + void insert(_InputIterator __first, _InputIterator __last) { + _M_t.insert_equal(__first, __last); + } +#else + void insert(const value_type* __first, const value_type* __last) { + _M_t.insert_equal(__first, __last); + } + void insert(const_iterator __first, const_iterator __last) { + _M_t.insert_equal(__first, __last); + } +#endif /* __STL_MEMBER_TEMPLATES */ + void erase(iterator __position) { _M_t.erase(__position); } + size_type erase(const key_type& __x) { return _M_t.erase(__x); } + void erase(iterator __first, iterator __last) + { _M_t.erase(__first, __last); } + void clear() { _M_t.clear(); } + + // multimap operations: + + iterator find(const key_type& __x) { return _M_t.find(__x); } + const_iterator find(const key_type& __x) const { return _M_t.find(__x); } + size_type count(const key_type& __x) const { return _M_t.count(__x); } + iterator lower_bound(const key_type& __x) {return _M_t.lower_bound(__x); } + const_iterator lower_bound(const key_type& __x) const { + return _M_t.lower_bound(__x); + } + iterator upper_bound(const key_type& __x) {return _M_t.upper_bound(__x); } + const_iterator upper_bound(const key_type& __x) const { + return _M_t.upper_bound(__x); + } + pair equal_range(const key_type& __x) { + return _M_t.equal_range(__x); + } + pair equal_range(const key_type& __x) const { + return _M_t.equal_range(__x); + } + +#ifdef __STL_TEMPLATE_FRIENDS + template + friend bool operator== (const multimap<_K1, _T1, _C1, _A1>&, + const multimap<_K1, _T1, _C1, _A1>&); + template + friend bool operator< (const multimap<_K1, _T1, _C1, _A1>&, + const multimap<_K1, _T1, _C1, _A1>&); +#else /* __STL_TEMPLATE_FRIENDS */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const multimap&, const multimap&); + friend bool __STD_QUALIFIER + operator< __STL_NULL_TMPL_ARGS (const multimap&, const multimap&); +#endif /* __STL_TEMPLATE_FRIENDS */ +}; + +template +inline bool operator==(const multimap<_Key,_Tp,_Compare,_Alloc>& __x, + const multimap<_Key,_Tp,_Compare,_Alloc>& __y) { + return __x._M_t == __y._M_t; +} + +template +inline bool operator<(const multimap<_Key,_Tp,_Compare,_Alloc>& __x, + const multimap<_Key,_Tp,_Compare,_Alloc>& __y) { + return __x._M_t < __y._M_t; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x, + const multimap<_Key,_Tp,_Compare,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool operator>(const multimap<_Key,_Tp,_Compare,_Alloc>& __x, + const multimap<_Key,_Tp,_Compare,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool operator<=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x, + const multimap<_Key,_Tp,_Compare,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool operator>=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x, + const multimap<_Key,_Tp,_Compare,_Alloc>& __y) { + return !(__x < __y); +} + +template +inline void swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x, + multimap<_Key,_Tp,_Compare,_Alloc>& __y) { + __x.swap(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_MULTIMAP_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_multiset.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_multiset.h new file mode 100644 index 0000000..5365ffb --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_multiset.h @@ -0,0 +1,274 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_MULTISET_H +#define __SGI_STL_INTERNAL_MULTISET_H + +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +// Forward declaration of operators < and ==, needed for friend declaration. + +template ), + class _Alloc = __STL_DEFAULT_ALLOCATOR(_Key) > +class multiset; + +template +inline bool operator==(const multiset<_Key,_Compare,_Alloc>& __x, + const multiset<_Key,_Compare,_Alloc>& __y); + +template +inline bool operator<(const multiset<_Key,_Compare,_Alloc>& __x, + const multiset<_Key,_Compare,_Alloc>& __y); + +template +class multiset { + // requirements: + + __STL_CLASS_REQUIRES(_Key, _Assignable); + __STL_CLASS_BINARY_FUNCTION_CHECK(_Compare, bool, _Key, _Key); + +public: + + // typedefs: + + typedef _Key key_type; + typedef _Key value_type; + typedef _Compare key_compare; + typedef _Compare value_compare; +private: + typedef _Rb_tree, key_compare, _Alloc> _Rep_type; + _Rep_type _M_t; // red-black tree representing multiset +public: + typedef typename _Rep_type::const_pointer pointer; + typedef typename _Rep_type::const_pointer const_pointer; + typedef typename _Rep_type::const_reference reference; + typedef typename _Rep_type::const_reference const_reference; + typedef typename _Rep_type::const_iterator iterator; + typedef typename _Rep_type::const_iterator const_iterator; + typedef typename _Rep_type::const_reverse_iterator reverse_iterator; + typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; + typedef typename _Rep_type::size_type size_type; + typedef typename _Rep_type::difference_type difference_type; + typedef typename _Rep_type::allocator_type allocator_type; + + // allocation/deallocation + + multiset() : _M_t(_Compare(), allocator_type()) {} + explicit multiset(const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) {} + +#ifdef __STL_MEMBER_TEMPLATES + + template + multiset(_InputIterator __first, _InputIterator __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_equal(__first, __last); } + + template + multiset(_InputIterator __first, _InputIterator __last, + const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); } + +#else + + multiset(const value_type* __first, const value_type* __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_equal(__first, __last); } + + multiset(const value_type* __first, const value_type* __last, + const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); } + + multiset(const_iterator __first, const_iterator __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_equal(__first, __last); } + + multiset(const_iterator __first, const_iterator __last, + const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); } + +#endif /* __STL_MEMBER_TEMPLATES */ + + multiset(const multiset<_Key,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {} + multiset<_Key,_Compare,_Alloc>& + operator=(const multiset<_Key,_Compare,_Alloc>& __x) { + _M_t = __x._M_t; + return *this; + } + + // accessors: + + key_compare key_comp() const { return _M_t.key_comp(); } + value_compare value_comp() const { return _M_t.key_comp(); } + allocator_type get_allocator() const { return _M_t.get_allocator(); } + + iterator begin() const { return _M_t.begin(); } + iterator end() const { return _M_t.end(); } + reverse_iterator rbegin() const { return _M_t.rbegin(); } + reverse_iterator rend() const { return _M_t.rend(); } + bool empty() const { return _M_t.empty(); } + size_type size() const { return _M_t.size(); } + size_type max_size() const { return _M_t.max_size(); } + void swap(multiset<_Key,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); } + + // insert/erase + iterator insert(const value_type& __x) { + return _M_t.insert_equal(__x); + } + iterator insert(iterator __position, const value_type& __x) { + typedef typename _Rep_type::iterator _Rep_iterator; + return _M_t.insert_equal((_Rep_iterator&)__position, __x); + } + +#ifdef __STL_MEMBER_TEMPLATES + template + void insert(_InputIterator __first, _InputIterator __last) { + _M_t.insert_equal(__first, __last); + } +#else + void insert(const value_type* __first, const value_type* __last) { + _M_t.insert_equal(__first, __last); + } + void insert(const_iterator __first, const_iterator __last) { + _M_t.insert_equal(__first, __last); + } +#endif /* __STL_MEMBER_TEMPLATES */ + void erase(iterator __position) { + typedef typename _Rep_type::iterator _Rep_iterator; + _M_t.erase((_Rep_iterator&)__position); + } + size_type erase(const key_type& __x) { + return _M_t.erase(__x); + } + void erase(iterator __first, iterator __last) { + typedef typename _Rep_type::iterator _Rep_iterator; + _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last); + } + void clear() { _M_t.clear(); } + + // multiset operations: + + iterator find(const key_type& __x) const { return _M_t.find(__x); } + size_type count(const key_type& __x) const { return _M_t.count(__x); } + iterator lower_bound(const key_type& __x) const { + return _M_t.lower_bound(__x); + } + iterator upper_bound(const key_type& __x) const { + return _M_t.upper_bound(__x); + } + pair equal_range(const key_type& __x) const { + return _M_t.equal_range(__x); + } + +#ifdef __STL_TEMPLATE_FRIENDS + template + friend bool operator== (const multiset<_K1,_C1,_A1>&, + const multiset<_K1,_C1,_A1>&); + template + friend bool operator< (const multiset<_K1,_C1,_A1>&, + const multiset<_K1,_C1,_A1>&); +#else /* __STL_TEMPLATE_FRIENDS */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const multiset&, const multiset&); + friend bool __STD_QUALIFIER + operator< __STL_NULL_TMPL_ARGS (const multiset&, const multiset&); +#endif /* __STL_TEMPLATE_FRIENDS */ +}; + +template +inline bool operator==(const multiset<_Key,_Compare,_Alloc>& __x, + const multiset<_Key,_Compare,_Alloc>& __y) { + return __x._M_t == __y._M_t; +} + +template +inline bool operator<(const multiset<_Key,_Compare,_Alloc>& __x, + const multiset<_Key,_Compare,_Alloc>& __y) { + return __x._M_t < __y._M_t; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const multiset<_Key,_Compare,_Alloc>& __x, + const multiset<_Key,_Compare,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool operator>(const multiset<_Key,_Compare,_Alloc>& __x, + const multiset<_Key,_Compare,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool operator<=(const multiset<_Key,_Compare,_Alloc>& __x, + const multiset<_Key,_Compare,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool operator>=(const multiset<_Key,_Compare,_Alloc>& __x, + const multiset<_Key,_Compare,_Alloc>& __y) { + return !(__x < __y); +} + +template +inline void swap(multiset<_Key,_Compare,_Alloc>& __x, + multiset<_Key,_Compare,_Alloc>& __y) { + __x.swap(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_MULTISET_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_numeric.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_numeric.h new file mode 100644 index 0000000..f8e9594 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_numeric.h @@ -0,0 +1,255 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + + +#ifndef __SGI_STL_INTERNAL_NUMERIC_H +#define __SGI_STL_INTERNAL_NUMERIC_H + +__STL_BEGIN_NAMESPACE + +template +_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init) +{ + __STL_REQUIRES(_InputIterator, _InputIterator); + for ( ; __first != __last; ++__first) + __init = __init + *__first; + return __init; +} + +template +_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, + _BinaryOperation __binary_op) +{ + __STL_REQUIRES(_InputIterator, _InputIterator); + for ( ; __first != __last; ++__first) + __init = __binary_op(__init, *__first); + return __init; +} + +template +_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _Tp __init) +{ + __STL_REQUIRES(_InputIterator2, _InputIterator); + __STL_REQUIRES(_InputIterator2, _InputIterator); + for ( ; __first1 != __last1; ++__first1, ++__first2) + __init = __init + (*__first1 * *__first2); + return __init; +} + +template +_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _Tp __init, + _BinaryOperation1 __binary_op1, + _BinaryOperation2 __binary_op2) +{ + __STL_REQUIRES(_InputIterator2, _InputIterator); + __STL_REQUIRES(_InputIterator2, _InputIterator); + for ( ; __first1 != __last1; ++__first1, ++__first2) + __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); + return __init; +} + +template +_OutputIterator +__partial_sum(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _Tp*) +{ + _Tp __value = *__first; + while (++__first != __last) { + __value = __value + *__first; + *++__result = __value; + } + return ++__result; +} + +template +_OutputIterator +partial_sum(_InputIterator __first, _InputIterator __last, + _OutputIterator __result) +{ + __STL_REQUIRES(_InputIterator, _InputIterator); + __STL_REQUIRES(_OutputIterator, _OutputIterator); + if (__first == __last) return __result; + *__result = *__first; + return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first)); +} + +template +_OutputIterator +__partial_sum(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _Tp*, _BinaryOperation __binary_op) +{ + _Tp __value = *__first; + while (++__first != __last) { + __value = __binary_op(__value, *__first); + *++__result = __value; + } + return ++__result; +} + +template +_OutputIterator +partial_sum(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _BinaryOperation __binary_op) +{ + __STL_REQUIRES(_InputIterator, _InputIterator); + __STL_REQUIRES(_OutputIterator, _OutputIterator); + if (__first == __last) return __result; + *__result = *__first; + return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first), + __binary_op); +} + +template +_OutputIterator +__adjacent_difference(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _Tp*) +{ + _Tp __value = *__first; + while (++__first != __last) { + _Tp __tmp = *__first; + *++__result = __tmp - __value; + __value = __tmp; + } + return ++__result; +} + +template +_OutputIterator +adjacent_difference(_InputIterator __first, + _InputIterator __last, _OutputIterator __result) +{ + __STL_REQUIRES(_InputIterator, _InputIterator); + __STL_REQUIRES(_OutputIterator, _OutputIterator); + if (__first == __last) return __result; + *__result = *__first; + return __adjacent_difference(__first, __last, __result, + __VALUE_TYPE(__first)); +} + +template +_OutputIterator +__adjacent_difference(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _Tp*, + _BinaryOperation __binary_op) { + _Tp __value = *__first; + while (++__first != __last) { + _Tp __tmp = *__first; + *++__result = __binary_op(__tmp, __value); + __value = __tmp; + } + return ++__result; +} + +template +_OutputIterator +adjacent_difference(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _BinaryOperation __binary_op) +{ + __STL_REQUIRES(_InputIterator, _InputIterator); + __STL_REQUIRES(_OutputIterator, _OutputIterator); + if (__first == __last) return __result; + *__result = *__first; + return __adjacent_difference(__first, __last, __result, + __VALUE_TYPE(__first), + __binary_op); +} + +// Returns __x ** __n, where __n >= 0. _Note that "multiplication" +// is required to be associative, but not necessarily commutative. + + +template +_Tp __power(_Tp __x, _Integer __n, _MonoidOperation __opr) +{ + if (__n == 0) + return identity_element(__opr); + else { + while ((__n & 1) == 0) { + __n >>= 1; + __x = __opr(__x, __x); + } + + _Tp __result = __x; + __n >>= 1; + while (__n != 0) { + __x = __opr(__x, __x); + if ((__n & 1) != 0) + __result = __opr(__result, __x); + __n >>= 1; + } + return __result; + } +} + +template +inline _Tp __power(_Tp __x, _Integer __n) +{ + return __power(__x, __n, multiplies<_Tp>()); +} + +// Alias for the internal name __power. Note that power is an extension, +// not part of the C++ standard. + +template +inline _Tp power(_Tp __x, _Integer __n, _MonoidOperation __opr) +{ + return __power(__x, __n, __opr); +} + +template +inline _Tp power(_Tp __x, _Integer __n) +{ + return __power(__x, __n); +} + +// iota is not part of the C++ standard. It is an extension. + +template +void +iota(_ForwardIter __first, _ForwardIter __last, _Tp __value) +{ + __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); + __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type); + while (__first != __last) + *__first++ = __value++; +} + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_NUMERIC_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_pair.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_pair.h new file mode 100644 index 0000000..a6155a6 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_pair.h @@ -0,0 +1,101 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_PAIR_H +#define __SGI_STL_INTERNAL_PAIR_H + +__STL_BEGIN_NAMESPACE + +template +struct pair { + typedef _T1 first_type; + typedef _T2 second_type; + + _T1 first; + _T2 second; + pair() : first(_T1()), second(_T2()) {} + pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {} + +#ifdef __STL_MEMBER_TEMPLATES + template + pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {} +#endif +}; + +template +inline bool operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) +{ + return __x.first == __y.first && __x.second == __y.second; +} + +template +inline bool operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) +{ + return __x.first < __y.first || + (!(__y.first < __x.first) && __x.second < __y.second); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { + return !(__x == __y); +} + +template +inline bool operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { + return __y < __x; +} + +template +inline bool operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { + return !(__y < __x); +} + +template +inline bool operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { + return !(__x < __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template +inline pair<_T1, _T2> make_pair(const _T1& __x, const _T2& __y) +{ + return pair<_T1, _T2>(__x, __y); +} + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_PAIR_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_queue.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_queue.h new file mode 100644 index 0000000..833e45f --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_queue.h @@ -0,0 +1,243 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_QUEUE_H +#define __SGI_STL_INTERNAL_QUEUE_H + +#include + +__STL_BEGIN_NAMESPACE + +// Forward declarations of operators < and ==, needed for friend declaration. + +template ) > +class queue; + +template +inline bool operator==(const queue<_Tp, _Seq>&, const queue<_Tp, _Seq>&); + +template +inline bool operator<(const queue<_Tp, _Seq>&, const queue<_Tp, _Seq>&); + + +template +class queue { + + // requirements: + + __STL_CLASS_REQUIRES(_Tp, _Assignable); + __STL_CLASS_REQUIRES(_Sequence, _FrontInsertionSequence); + __STL_CLASS_REQUIRES(_Sequence, _BackInsertionSequence); + typedef typename _Sequence::value_type _Sequence_value_type; + __STL_CLASS_REQUIRES_SAME_TYPE(_Tp, _Sequence_value_type); + + +#ifdef __STL_MEMBER_TEMPLATES + template + friend bool operator== (const queue<_Tp1, _Seq1>&, + const queue<_Tp1, _Seq1>&); + template + friend bool operator< (const queue<_Tp1, _Seq1>&, + const queue<_Tp1, _Seq1>&); +#else /* __STL_MEMBER_TEMPLATES */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const queue&, const queue&); + friend bool __STD_QUALIFIER + operator< __STL_NULL_TMPL_ARGS (const queue&, const queue&); +#endif /* __STL_MEMBER_TEMPLATES */ + +public: + typedef typename _Sequence::value_type value_type; + typedef typename _Sequence::size_type size_type; + typedef _Sequence container_type; + + typedef typename _Sequence::reference reference; + typedef typename _Sequence::const_reference const_reference; +protected: + _Sequence c; +public: + queue() : c() {} + explicit queue(const _Sequence& __c) : c(__c) {} + + bool empty() const { return c.empty(); } + size_type size() const { return c.size(); } + reference front() { return c.front(); } + const_reference front() const { return c.front(); } + reference back() { return c.back(); } + const_reference back() const { return c.back(); } + void push(const value_type& __x) { c.push_back(__x); } + void pop() { c.pop_front(); } +}; + +template +bool +operator==(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y) +{ + return __x.c == __y.c; +} + +template +bool +operator<(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y) +{ + return __x.c < __y.c; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +bool +operator!=(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y) +{ + return !(__x == __y); +} + +template +bool +operator>(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y) +{ + return __y < __x; +} + +template +bool +operator<=(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y) +{ + return !(__y < __x); +} + +template +bool +operator>=(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y) +{ + return !(__x < __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template ), + class _Compare + __STL_DEPENDENT_DEFAULT_TMPL(less) > +class priority_queue { + + // requirements: + + __STL_CLASS_REQUIRES(_Tp, _Assignable); + __STL_CLASS_REQUIRES(_Sequence, _Sequence); + __STL_CLASS_REQUIRES(_Sequence, _RandomAccessContainer); + typedef typename _Sequence::value_type _Sequence_value_type; + __STL_CLASS_REQUIRES_SAME_TYPE(_Tp, _Sequence_value_type); + __STL_CLASS_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp); + +public: + typedef typename _Sequence::value_type value_type; + typedef typename _Sequence::size_type size_type; + typedef _Sequence container_type; + + typedef typename _Sequence::reference reference; + typedef typename _Sequence::const_reference const_reference; +protected: + _Sequence c; + _Compare comp; +public: + priority_queue() : c() {} + explicit priority_queue(const _Compare& __x) : c(), comp(__x) {} + priority_queue(const _Compare& __x, const _Sequence& __s) + : c(__s), comp(__x) + { make_heap(c.begin(), c.end(), comp); } + +#ifdef __STL_MEMBER_TEMPLATES + template + priority_queue(_InputIterator __first, _InputIterator __last) + : c(__first, __last) { make_heap(c.begin(), c.end(), comp); } + + template + priority_queue(_InputIterator __first, + _InputIterator __last, const _Compare& __x) + : c(__first, __last), comp(__x) + { make_heap(c.begin(), c.end(), comp); } + + template + priority_queue(_InputIterator __first, _InputIterator __last, + const _Compare& __x, const _Sequence& __s) + : c(__s), comp(__x) + { + c.insert(c.end(), __first, __last); + make_heap(c.begin(), c.end(), comp); + } + +#else /* __STL_MEMBER_TEMPLATES */ + priority_queue(const value_type* __first, const value_type* __last) + : c(__first, __last) { make_heap(c.begin(), c.end(), comp); } + + priority_queue(const value_type* __first, const value_type* __last, + const _Compare& __x) + : c(__first, __last), comp(__x) + { make_heap(c.begin(), c.end(), comp); } + + priority_queue(const value_type* __first, const value_type* __last, + const _Compare& __x, const _Sequence& __c) + : c(__c), comp(__x) + { + c.insert(c.end(), __first, __last); + make_heap(c.begin(), c.end(), comp); + } +#endif /* __STL_MEMBER_TEMPLATES */ + + bool empty() const { return c.empty(); } + size_type size() const { return c.size(); } + const_reference top() const { return c.front(); } + void push(const value_type& __x) { + __STL_TRY { + c.push_back(__x); + push_heap(c.begin(), c.end(), comp); + } + __STL_UNWIND(c.clear()); + } + void pop() { + __STL_TRY { + pop_heap(c.begin(), c.end(), comp); + c.pop_back(); + } + __STL_UNWIND(c.clear()); + } +}; + +// no equality is provided + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_QUEUE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_range_errors.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_range_errors.h new file mode 100644 index 0000000..3ddde6d --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_range_errors.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1999 + * Silicon Graphics + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef __STL_RANGE_ERRORS_H +#define __STL_RANGE_ERRORS_H + +// A few places in the STL throw range errors, using standard exception +// classes defined in . This header file provides functions +// to throw those exception objects. + +// __STL_DONT_THROW_RANGE_ERRORS is a hook so that users can disable +// this exception throwing. + +#include + +#if defined(__STL_CAN_THROW_RANGE_ERRORS) && \ + defined(__STL_USE_EXCEPTIONS) && \ + !defined(__STL_DONT_THROW_RANGE_ERRORS) +# define __STL_THROW_RANGE_ERRORS +#endif + +// For the SGI 7.3 compiler, declare these functions here and define them +// elsewhere. +#if defined(__STL_THROW_RANGE_ERRORS) && \ + defined(__sgi) && !defined(__GNUC__) && \ + _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS) + +__STL_BEGIN_NAMESPACE +void __stl_throw_range_error(const char* __msg); +void __stl_throw_length_error(const char* __msg); +__STL_END_NAMESPACE + +// For other compilers where we're throwing range errors, include the +// stdexcept header and throw the appropriate exceptions directly. +#elif defined(__STL_THROW_RANGE_ERRORS) + +#include + +__STL_BEGIN_NAMESPACE +inline void __stl_throw_range_error(const char* __msg) + { throw range_error(__msg); } +inline void __stl_throw_length_error(const char* __msg) + { throw length_error(__msg); } +__STL_END_NAMESPACE + +// Otherwise, define inline functions that do nothing. +#else + +__STL_BEGIN_NAMESPACE +inline void __stl_throw_range_error(const char*) {} +inline void __stl_throw_length_error(const char*) {} +__STL_END_NAMESPACE + +#endif + +#endif /* __STL_RANGE_ERRORS_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_raw_storage_iter.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_raw_storage_iter.h new file mode 100644 index 0000000..6f3951c --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_raw_storage_iter.h @@ -0,0 +1,81 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_RAW_STORAGE_ITERATOR_H +#define __SGI_STL_INTERNAL_RAW_STORAGE_ITERATOR_H + +__STL_BEGIN_NAMESPACE + +template +class raw_storage_iterator { +protected: + _ForwardIterator _M_iter; +public: + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + explicit raw_storage_iterator(_ForwardIterator __x) : _M_iter(__x) {} + raw_storage_iterator& operator*() { return *this; } + raw_storage_iterator& operator=(const _Tp& __element) { + construct(&*_M_iter, __element); + return *this; + } + raw_storage_iterator<_ForwardIterator, _Tp>& operator++() { + ++_M_iter; + return *this; + } + raw_storage_iterator<_ForwardIterator, _Tp> operator++(int) { + raw_storage_iterator<_ForwardIterator, _Tp> __tmp = *this; + ++_M_iter; + return __tmp; + } +}; + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +inline output_iterator_tag +iterator_category(const raw_storage_iterator<_ForwardIterator, _Tp>&) +{ + return output_iterator_tag(); +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_RAW_STORAGE_ITERATOR_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_relops.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_relops.h new file mode 100644 index 0000000..16cad1b --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_relops.h @@ -0,0 +1,62 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * Copyright (c) 1996,1997 + * Silicon Graphics + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_RELOPS +#define __SGI_STL_INTERNAL_RELOPS + +__STL_BEGIN_RELOPS_NAMESPACE + +template +inline bool operator!=(const _Tp& __x, const _Tp& __y) { + return !(__x == __y); +} + +template +inline bool operator>(const _Tp& __x, const _Tp& __y) { + return __y < __x; +} + +template +inline bool operator<=(const _Tp& __x, const _Tp& __y) { + return !(__y < __x); +} + +template +inline bool operator>=(const _Tp& __x, const _Tp& __y) { + return !(__x < __y); +} + +__STL_END_RELOPS_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_RELOPS */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_rope.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_rope.h new file mode 100644 index 0000000..54ddb70 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_rope.h @@ -0,0 +1,2714 @@ +/* + * Copyright (c) 1997-1998 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +// rope<_CharT,_Alloc> is a sequence of _CharT. +// Ropes appear to be mutable, but update operations +// really copy enough of the data structure to leave the original +// valid. Thus ropes can be logically copied by just copying +// a pointer value. + +#ifndef __SGI_STL_INTERNAL_ROPE_H +# define __SGI_STL_INTERNAL_ROPE_H + +# ifdef __GC +# define __GC_CONST const +# else +# include +# define __GC_CONST // constant except for deallocation +# endif +# ifdef __STL_SGI_THREADS +# include +# endif + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#endif + +// The _S_eos function is used for those functions that +// convert to/from C-like strings to detect the end of the string. + +// The end-of-C-string character. +// This is what the draft standard says it should be. +template +inline _CharT _S_eos(_CharT*) { return _CharT(); } + +// Test for basic character types. +// For basic character types leaves having a trailing eos. +template +inline bool _S_is_basic_char_type(_CharT*) { return false; } +template +inline bool _S_is_one_byte_char_type(_CharT*) { return false; } + +inline bool _S_is_basic_char_type(char*) { return true; } +inline bool _S_is_one_byte_char_type(char*) { return true; } +inline bool _S_is_basic_char_type(wchar_t*) { return true; } + +// Store an eos iff _CharT is a basic character type. +// Do not reference _S_eos if it isn't. +template +inline void _S_cond_store_eos(_CharT&) {} + +inline void _S_cond_store_eos(char& __c) { __c = 0; } +inline void _S_cond_store_eos(wchar_t& __c) { __c = 0; } + +// char_producers are logically functions that generate a section of +// a string. These can be convereted to ropes. The resulting rope +// invokes the char_producer on demand. This allows, for example, +// files to be viewed as ropes without reading the entire file. +template +class char_producer { + public: + virtual ~char_producer() {}; + virtual void operator()(size_t __start_pos, size_t __len, + _CharT* __buffer) = 0; + // Buffer should really be an arbitrary output iterator. + // That way we could flatten directly into an ostream, etc. + // This is thoroughly impossible, since iterator types don't + // have runtime descriptions. +}; + +// Sequence buffers: +// +// Sequence must provide an append operation that appends an +// array to the sequence. Sequence buffers are useful only if +// appending an entire array is cheaper than appending element by element. +// This is true for many string representations. +// This should perhaps inherit from ostream +// and be implemented correspondingly, so that they can be used +// for formatted. For the sake of portability, we don't do this yet. +// +// For now, sequence buffers behave as output iterators. But they also +// behave a little like basic_ostringstream and a +// little like containers. + +template +// The 3rd parameter works around a common compiler bug. +class sequence_buffer : public output_iterator { + public: +# ifndef __TYPEDEF_WORKAROUND + typedef typename _Sequence::value_type value_type; +# else + typedef _V value_type; +# endif + protected: + _Sequence* _M_prefix; + value_type _M_buffer[_Buf_sz]; + size_t _M_buf_count; + public: + void flush() { + _M_prefix->append(_M_buffer, _M_buffer + _M_buf_count); + _M_buf_count = 0; + } + ~sequence_buffer() { flush(); } + sequence_buffer() : _M_prefix(0), _M_buf_count(0) {} + sequence_buffer(const sequence_buffer& __x) { + _M_prefix = __x._M_prefix; + _M_buf_count = __x._M_buf_count; + copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer); + } + sequence_buffer(sequence_buffer& __x) { + __x.flush(); + _M_prefix = __x._M_prefix; + _M_buf_count = 0; + } + sequence_buffer(_Sequence& __s) : _M_prefix(&__s), _M_buf_count(0) {} + sequence_buffer& operator= (sequence_buffer& __x) { + __x.flush(); + _M_prefix = __x._M_prefix; + _M_buf_count = 0; + return *this; + } + sequence_buffer& operator= (const sequence_buffer& __x) { + _M_prefix = __x._M_prefix; + _M_buf_count = __x._M_buf_count; + copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer); + return *this; + } + void push_back(value_type __x) + { + if (_M_buf_count < _Buf_sz) { + _M_buffer[_M_buf_count] = __x; + ++_M_buf_count; + } else { + flush(); + _M_buffer[0] = __x; + _M_buf_count = 1; + } + } + void append(value_type* __s, size_t __len) + { + if (__len + _M_buf_count <= _Buf_sz) { + size_t __i = _M_buf_count; + size_t __j = 0; + for (; __j < __len; __i++, __j++) { + _M_buffer[__i] = __s[__j]; + } + _M_buf_count += __len; + } else if (0 == _M_buf_count) { + _M_prefix->append(__s, __s + __len); + } else { + flush(); + append(__s, __len); + } + } + sequence_buffer& write(value_type* __s, size_t __len) + { + append(__s, __len); + return *this; + } + sequence_buffer& put(value_type __x) + { + push_back(__x); + return *this; + } + sequence_buffer& operator=(const value_type& __rhs) + { + push_back(__rhs); + return *this; + } + sequence_buffer& operator*() { return *this; } + sequence_buffer& operator++() { return *this; } + sequence_buffer& operator++(int) { return *this; } +}; + +// The following should be treated as private, at least for now. +template +class _Rope_char_consumer { + public: + // If we had member templates, these should not be virtual. + // For now we need to use run-time parametrization where + // compile-time would do. Hence this should all be private + // for now. + // The symmetry with char_producer is accidental and temporary. + virtual ~_Rope_char_consumer() {}; + virtual bool operator()(const _CharT* __buffer, size_t __len) = 0; +}; + +// First a lot of forward declarations. The standard seems to require +// much stricter "declaration before use" than many of the implementations +// that preceded it. +template class rope; +template struct _Rope_RopeConcatenation; +template struct _Rope_RopeLeaf; +template struct _Rope_RopeFunction; +template struct _Rope_RopeSubstring; +template class _Rope_iterator; +template class _Rope_const_iterator; +template class _Rope_char_ref_proxy; +template class _Rope_char_ptr_proxy; + +template +bool operator== (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x, + const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y); + +template +_Rope_const_iterator<_CharT,_Alloc> operator- + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n); + +template +_Rope_const_iterator<_CharT,_Alloc> operator+ + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n); + +template +_Rope_const_iterator<_CharT,_Alloc> operator+ + (ptrdiff_t __n, + const _Rope_const_iterator<_CharT,_Alloc>& __x); + +template +bool operator== + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y); + +template +bool operator< + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y); + +template +ptrdiff_t operator- + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y); + +template +_Rope_iterator<_CharT,_Alloc> operator- + (const _Rope_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n); + +template +_Rope_iterator<_CharT,_Alloc> operator+ + (const _Rope_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n); + +template +_Rope_iterator<_CharT,_Alloc> operator+ + (ptrdiff_t __n, + const _Rope_iterator<_CharT,_Alloc>& __x); + +template +bool operator== + (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y); + +template +bool operator< + (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y); + +template +ptrdiff_t operator- + (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y); + +template +rope<_CharT,_Alloc> operator+ (const rope<_CharT,_Alloc>& __left, + const rope<_CharT,_Alloc>& __right); + +template +rope<_CharT,_Alloc> operator+ (const rope<_CharT,_Alloc>& __left, + const _CharT* __right); + +template +rope<_CharT,_Alloc> operator+ (const rope<_CharT,_Alloc>& __left, + _CharT __right); + +// Some helpers, so we can use power on ropes. +// See below for why this isn't local to the implementation. + +// This uses a nonstandard refcount convention. +// The result has refcount 0. +template +struct _Rope_Concat_fn + : public binary_function, rope<_CharT,_Alloc>, + rope<_CharT,_Alloc> > { + rope<_CharT,_Alloc> operator() (const rope<_CharT,_Alloc>& __x, + const rope<_CharT,_Alloc>& __y) { + return __x + __y; + } +}; + +template +inline +rope<_CharT,_Alloc> +identity_element(_Rope_Concat_fn<_CharT, _Alloc>) +{ + return rope<_CharT,_Alloc>(); +} + + +// +// What follows should really be local to rope. Unfortunately, +// that doesn't work, since it makes it impossible to define generic +// equality on rope iterators. According to the draft standard, the +// template parameters for such an equality operator cannot be inferred +// from the occurence of a member class as a parameter. +// (SGI compilers in fact allow this, but the __result wouldn't be +// portable.) +// Similarly, some of the static member functions are member functions +// only to avoid polluting the global namespace, and to circumvent +// restrictions on type inference for template functions. +// + +// +// The internal data structure for representing a rope. This is +// private to the implementation. A rope is really just a pointer +// to one of these. +// +// A few basic functions for manipulating this data structure +// are members of _RopeRep. Most of the more complex algorithms +// are implemented as rope members. +// +// Some of the static member functions of _RopeRep have identically +// named functions in rope that simply invoke the _RopeRep versions. +// +// A macro to introduce various allocation and deallocation functions +// These need to be defined differently depending on whether or not +// we are using standard conforming allocators, and whether the allocator +// instances have real state. Thus this macro is invoked repeatedly +// with different definitions of __ROPE_DEFINE_ALLOC. +// __ROPE_DEFINE_ALLOC(type,name) defines +// type * name_allocate(size_t) and +// void name_deallocate(tipe *, size_t) +// Both functions may or may not be static. + +#define __ROPE_DEFINE_ALLOCS(__a) \ + __ROPE_DEFINE_ALLOC(_CharT,_Data) /* character data */ \ + typedef _Rope_RopeConcatenation<_CharT,__a> __C; \ + __ROPE_DEFINE_ALLOC(__C,_C) \ + typedef _Rope_RopeLeaf<_CharT,__a> __L; \ + __ROPE_DEFINE_ALLOC(__L,_L) \ + typedef _Rope_RopeFunction<_CharT,__a> __F; \ + __ROPE_DEFINE_ALLOC(__F,_F) \ + typedef _Rope_RopeSubstring<_CharT,__a> __S; \ + __ROPE_DEFINE_ALLOC(__S,_S) + +// Internal rope nodes potentially store a copy of the allocator +// instance used to allocate them. This is mostly redundant. +// But the alternative would be to pass allocator instances around +// in some form to nearly all internal functions, since any pointer +// assignment may result in a zero reference count and thus require +// deallocation. +// The _Rope_rep_base class encapsulates +// the differences between SGI-style allocators and standard-conforming +// allocators. + +#ifdef __STL_USE_STD_ALLOCATORS + +#define __STATIC_IF_SGI_ALLOC /* not static */ + +// Base class for ordinary allocators. +template +class _Rope_rep_alloc_base { +public: + typedef typename _Alloc_traits<_CharT,_Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return _M_data_allocator; } + _Rope_rep_alloc_base(size_t __size, const allocator_type& __a) + : _M_size(__size), _M_data_allocator(__a) {} + size_t _M_size; // This is here only to avoid wasting space + // for an otherwise empty base class. + + +protected: + allocator_type _M_data_allocator; + +# define __ROPE_DEFINE_ALLOC(_Tp, __name) \ + typedef typename \ + _Alloc_traits<_Tp,_Allocator>::allocator_type __name##Allocator; \ + /*static*/ _Tp * __name##_allocate(size_t __n) \ + { return __name##Allocator(_M_data_allocator).allocate(__n); } \ + void __name##_deallocate(_Tp* __p, size_t __n) \ + { __name##Allocator(_M_data_allocator).deallocate(__p, __n); } + __ROPE_DEFINE_ALLOCS(_Allocator); +# undef __ROPE_DEFINE_ALLOC +}; + +// Specialization for allocators that have the property that we don't +// actually have to store an allocator object. +template +class _Rope_rep_alloc_base<_CharT,_Allocator,true> { +public: + typedef typename _Alloc_traits<_CharT,_Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + _Rope_rep_alloc_base(size_t __size, const allocator_type&) + : _M_size(__size) {} + size_t _M_size; + +protected: + +# define __ROPE_DEFINE_ALLOC(_Tp, __name) \ + typedef typename \ + _Alloc_traits<_Tp,_Allocator>::_Alloc_type __name##Alloc; \ + typedef typename \ + _Alloc_traits<_Tp,_Allocator>::allocator_type __name##Allocator; \ + static _Tp* __name##_allocate(size_t __n) \ + { return __name##Alloc::allocate(__n); } \ + void __name##_deallocate(_Tp *__p, size_t __n) \ + { __name##Alloc::deallocate(__p, __n); } + __ROPE_DEFINE_ALLOCS(_Allocator); +# undef __ROPE_DEFINE_ALLOC +}; + +template +struct _Rope_rep_base + : public _Rope_rep_alloc_base<_CharT,_Alloc, + _Alloc_traits<_CharT,_Alloc>::_S_instanceless> +{ + typedef _Rope_rep_alloc_base<_CharT,_Alloc, + _Alloc_traits<_CharT,_Alloc>::_S_instanceless> + _Base; + typedef typename _Base::allocator_type allocator_type; + _Rope_rep_base(size_t __size, const allocator_type& __a) + : _Base(__size, __a) {} +}; + +#else /* !__STL_USE_STD_ALLOCATORS */ + +#define __STATIC_IF_SGI_ALLOC static + +template +class _Rope_rep_base { +public: + typedef _Alloc allocator_type; + static allocator_type get_allocator() { return allocator_type(); } + _Rope_rep_base(size_t __size, const allocator_type&) : _M_size(__size) {} + size_t _M_size; + +protected: + +# define __ROPE_DEFINE_ALLOC(_Tp, __name) \ + typedef simple_alloc<_Tp, _Alloc> __name##Alloc; \ + static _Tp* __name##_allocate(size_t __n) \ + { return __name##Alloc::allocate(__n); } \ + static void __name##_deallocate(_Tp* __p, size_t __n) \ + { __name##Alloc::deallocate(__p, __n); } + __ROPE_DEFINE_ALLOCS(_Alloc); +# undef __ROPE_DEFINE_ALLOC +}; + +#endif /* __STL_USE_STD_ALLOCATORS */ + + +template +struct _Rope_RopeRep : public _Rope_rep_base<_CharT,_Alloc> +# ifndef __GC + , _Refcount_Base +# endif +{ + public: + enum { _S_max_rope_depth = 45 }; + enum _Tag {_S_leaf, _S_concat, _S_substringfn, _S_function}; + _Tag _M_tag:8; + bool _M_is_balanced:8; + unsigned char _M_depth; + __GC_CONST _CharT* _M_c_string; + /* Flattened version of string, if needed. */ + /* typically 0. */ + /* If it's not 0, then the memory is owned */ + /* by this node. */ + /* In the case of a leaf, this may point to */ + /* the same memory as the data field. */ + typedef typename _Rope_rep_base<_CharT,_Alloc>::allocator_type + allocator_type; + _Rope_RopeRep(_Tag __t, int __d, bool __b, size_t __size, + allocator_type __a) + : _Rope_rep_base<_CharT,_Alloc>(__size, __a), +# ifndef __GC + _Refcount_Base(1), +# endif + _M_tag(__t), _M_is_balanced(__b), _M_depth(__d), _M_c_string(0) + { } +# ifdef __GC + void _M_incr () {} +# endif +# ifdef __STL_USE_STD_ALLOCATORS + static void _S_free_string(__GC_CONST _CharT*, size_t __len, + allocator_type __a); +# define __STL_FREE_STRING(__s, __l, __a) _S_free_string(__s, __l, __a); +# else + static void _S_free_string(__GC_CONST _CharT*, size_t __len); +# define __STL_FREE_STRING(__s, __l, __a) _S_free_string(__s, __l); +# endif + // Deallocate data section of a leaf. + // This shouldn't be a member function. + // But its hard to do anything else at the + // moment, because it's templatized w.r.t. + // an allocator. + // Does nothing if __GC is defined. +# ifndef __GC + void _M_free_c_string(); + void _M_free_tree(); + // Deallocate t. Assumes t is not 0. + void _M_unref_nonnil() + { + if (0 == _M_decr()) _M_free_tree(); + } + void _M_ref_nonnil() + { + _M_incr(); + } + static void _S_unref(_Rope_RopeRep* __t) + { + if (0 != __t) { + __t->_M_unref_nonnil(); + } + } + static void _S_ref(_Rope_RopeRep* __t) + { + if (0 != __t) __t->_M_incr(); + } + static void _S_free_if_unref(_Rope_RopeRep* __t) + { + if (0 != __t && 0 == __t->_M_ref_count) __t->_M_free_tree(); + } +# else /* __GC */ + void _M_unref_nonnil() {} + void _M_ref_nonnil() {} + static void _S_unref(_Rope_RopeRep*) {} + static void _S_ref(_Rope_RopeRep*) {} + static void _S_free_if_unref(_Rope_RopeRep*) {} +# endif + +}; + +template +struct _Rope_RopeLeaf : public _Rope_RopeRep<_CharT,_Alloc> { + public: + // Apparently needed by VC++ + // The data fields of leaves are allocated with some + // extra space, to accomodate future growth and for basic + // character types, to hold a trailing eos character. + enum { _S_alloc_granularity = 8 }; + static size_t _S_rounded_up_size(size_t __n) { + size_t __size_with_eos; + + if (_S_is_basic_char_type((_CharT*)0)) { + __size_with_eos = __n + 1; + } else { + __size_with_eos = __n; + } +# ifdef __GC + return __size_with_eos; +# else + // Allow slop for in-place expansion. + return (__size_with_eos + _S_alloc_granularity-1) + &~ (_S_alloc_granularity-1); +# endif + } + __GC_CONST _CharT* _M_data; /* Not necessarily 0 terminated. */ + /* The allocated size is */ + /* _S_rounded_up_size(size), except */ + /* in the GC case, in which it */ + /* doesn't matter. */ + typedef typename _Rope_rep_base<_CharT,_Alloc>::allocator_type + allocator_type; + _Rope_RopeLeaf(__GC_CONST _CharT* __d, size_t __size, allocator_type __a) + : _Rope_RopeRep<_CharT,_Alloc>(_S_leaf, 0, true, __size, __a), + _M_data(__d) + { + __stl_assert(__size > 0); + if (_S_is_basic_char_type((_CharT *)0)) { + // already eos terminated. + _M_c_string = __d; + } + } + // The constructor assumes that d has been allocated with + // the proper allocator and the properly padded size. + // In contrast, the destructor deallocates the data: +# ifndef __GC + ~_Rope_RopeLeaf() { + if (_M_data != _M_c_string) { + _M_free_c_string(); + } + __STL_FREE_STRING(_M_data, _M_size, get_allocator()); + } +# endif +}; + +template +struct _Rope_RopeConcatenation : public _Rope_RopeRep<_CharT,_Alloc> { + public: + _Rope_RopeRep<_CharT,_Alloc>* _M_left; + _Rope_RopeRep<_CharT,_Alloc>* _M_right; + typedef typename _Rope_rep_base<_CharT,_Alloc>::allocator_type + allocator_type; + _Rope_RopeConcatenation(_Rope_RopeRep<_CharT,_Alloc>* __l, + _Rope_RopeRep<_CharT,_Alloc>* __r, + allocator_type __a) + + : _Rope_RopeRep<_CharT,_Alloc>(_S_concat, + max(__l->_M_depth, __r->_M_depth) + 1, + false, + __l->_M_size + __r->_M_size, __a), + _M_left(__l), _M_right(__r) + {} +# ifndef __GC + ~_Rope_RopeConcatenation() { + _M_free_c_string(); + _M_left->_M_unref_nonnil(); + _M_right->_M_unref_nonnil(); + } +# endif +}; + +template +struct _Rope_RopeFunction : public _Rope_RopeRep<_CharT,_Alloc> { + public: + char_producer<_CharT>* _M_fn; +# ifndef __GC + bool _M_delete_when_done; // Char_producer is owned by the + // rope and should be explicitly + // deleted when the rope becomes + // inaccessible. +# else + // In the GC case, we either register the rope for + // finalization, or not. Thus the field is unnecessary; + // the information is stored in the collector data structures. + // We do need a finalization procedure to be invoked by the + // collector. + static void _S_fn_finalization_proc(void * __tree, void *) { + delete ((_Rope_RopeFunction *)__tree) -> _M_fn; + } +# endif + typedef typename _Rope_rep_base<_CharT,_Alloc>::allocator_type + allocator_type; + _Rope_RopeFunction(char_producer<_CharT>* __f, size_t __size, + bool __d, allocator_type __a) + : _Rope_RopeRep<_CharT,_Alloc>(_S_function, 0, true, __size, __a) + , _M_fn(__f) +# ifndef __GC + , _M_delete_when_done(__d) +# endif + { + __stl_assert(__size > 0); +# ifdef __GC + if (__d) { + GC_REGISTER_FINALIZER( + this, _Rope_RopeFunction::_S_fn_finalization_proc, 0, 0, 0); + } +# endif + } +# ifndef __GC + ~_Rope_RopeFunction() { + _M_free_c_string(); + if (_M_delete_when_done) { + delete _M_fn; + } + } +# endif +}; +// Substring results are usually represented using just +// concatenation nodes. But in the case of very long flat ropes +// or ropes with a functional representation that isn't practical. +// In that case, we represent the __result as a special case of +// RopeFunction, whose char_producer points back to the rope itself. +// In all cases except repeated substring operations and +// deallocation, we treat the __result as a RopeFunction. +template +struct _Rope_RopeSubstring : public _Rope_RopeFunction<_CharT,_Alloc>, + public char_producer<_CharT> { + public: + // XXX this whole class should be rewritten. + _Rope_RopeRep<_CharT,_Alloc>* _M_base; // not 0 + size_t _M_start; + virtual void operator()(size_t __start_pos, size_t __req_len, + _CharT* __buffer) { + switch(_M_base->_M_tag) { + case _S_function: + case _S_substringfn: + { + char_producer<_CharT>* __fn = + ((_Rope_RopeFunction<_CharT,_Alloc>*)_M_base)->_M_fn; + __stl_assert(__start_pos + __req_len <= _M_size); + __stl_assert(_M_start + _M_size <= _M_base->_M_size); + (*__fn)(__start_pos + _M_start, __req_len, __buffer); + } + break; + case _S_leaf: + { + __GC_CONST _CharT* __s = + ((_Rope_RopeLeaf<_CharT,_Alloc>*)_M_base)->_M_data; + uninitialized_copy_n(__s + __start_pos + _M_start, __req_len, + __buffer); + } + break; + default: + __stl_assert(false); + } + } + typedef typename _Rope_rep_base<_CharT,_Alloc>::allocator_type + allocator_type; + _Rope_RopeSubstring(_Rope_RopeRep<_CharT,_Alloc>* __b, size_t __s, + size_t __l, allocator_type __a) + : _Rope_RopeFunction<_CharT,_Alloc>(this, __l, false, __a), + char_producer<_CharT>(), + _M_base(__b), + _M_start(__s) + { + __stl_assert(__l > 0); + __stl_assert(__s + __l <= __b->_M_size); +# ifndef __GC + _M_base->_M_ref_nonnil(); +# endif + _M_tag = _S_substringfn; + } + virtual ~_Rope_RopeSubstring() + { +# ifndef __GC + _M_base->_M_unref_nonnil(); + // _M_free_c_string(); -- done by parent class +# endif + } +}; + + +// Self-destructing pointers to Rope_rep. +// These are not conventional smart pointers. Their +// only purpose in life is to ensure that unref is called +// on the pointer either at normal exit or if an exception +// is raised. It is the caller's responsibility to +// adjust reference counts when these pointers are initialized +// or assigned to. (This convention significantly reduces +// the number of potentially expensive reference count +// updates.) +#ifndef __GC + template + struct _Rope_self_destruct_ptr { + _Rope_RopeRep<_CharT,_Alloc>* _M_ptr; + ~_Rope_self_destruct_ptr() + { _Rope_RopeRep<_CharT,_Alloc>::_S_unref(_M_ptr); } +# ifdef __STL_USE_EXCEPTIONS + _Rope_self_destruct_ptr() : _M_ptr(0) {}; +# else + _Rope_self_destruct_ptr() {}; +# endif + _Rope_self_destruct_ptr(_Rope_RopeRep<_CharT,_Alloc>* __p) : _M_ptr(__p) {} + _Rope_RopeRep<_CharT,_Alloc>& operator*() { return *_M_ptr; } + _Rope_RopeRep<_CharT,_Alloc>* operator->() { return _M_ptr; } + operator _Rope_RopeRep<_CharT,_Alloc>*() { return _M_ptr; } + _Rope_self_destruct_ptr& operator= (_Rope_RopeRep<_CharT,_Alloc>* __x) + { _M_ptr = __x; return *this; } + }; +#endif + +// Dereferencing a nonconst iterator has to return something +// that behaves almost like a reference. It's not possible to +// return an actual reference since assignment requires extra +// work. And we would get into the same problems as with the +// CD2 version of basic_string. +template +class _Rope_char_ref_proxy { + friend class rope<_CharT,_Alloc>; + friend class _Rope_iterator<_CharT,_Alloc>; + friend class _Rope_char_ptr_proxy<_CharT,_Alloc>; +# ifdef __GC + typedef _Rope_RopeRep<_CharT,_Alloc>* _Self_destruct_ptr; +# else + typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr; +# endif + typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; + typedef rope<_CharT,_Alloc> _My_rope; + size_t _M_pos; + _CharT _M_current; + bool _M_current_valid; + _My_rope* _M_root; // The whole rope. + public: + _Rope_char_ref_proxy(_My_rope* __r, size_t __p) + : _M_pos(__p), _M_current_valid(false), _M_root(__r) {} + _Rope_char_ref_proxy(const _Rope_char_ref_proxy& __x) + : _M_pos(__x._M_pos), _M_current_valid(false), _M_root(__x._M_root) {} + // Don't preserve cache if the reference can outlive the + // expression. We claim that's not possible without calling + // a copy constructor or generating reference to a proxy + // reference. We declare the latter to have undefined semantics. + _Rope_char_ref_proxy(_My_rope* __r, size_t __p, _CharT __c) + : _M_pos(__p), _M_current(__c), _M_current_valid(true), _M_root(__r) {} + inline operator _CharT () const; + _Rope_char_ref_proxy& operator= (_CharT __c); + _Rope_char_ptr_proxy<_CharT,_Alloc> operator& () const; + _Rope_char_ref_proxy& operator= (const _Rope_char_ref_proxy& __c) { + return operator=((_CharT)__c); + } +}; + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + template + inline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a, + _Rope_char_ref_proxy <_CharT, __Alloc > __b) { + _CharT __tmp = __a; + __a = __b; + __b = __tmp; + } +#else +// There is no really acceptable way to handle this. The default +// definition of swap doesn't work for proxy references. +// It can't really be made to work, even with ugly hacks, since +// the only unusual operation it uses is the copy constructor, which +// is needed for other purposes. We provide a macro for +// full specializations, and instantiate the most common case. +# define _ROPE_SWAP_SPECIALIZATION(_CharT, __Alloc) \ + inline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a, \ + _Rope_char_ref_proxy <_CharT, __Alloc > __b) { \ + _CharT __tmp = __a; \ + __a = __b; \ + __b = __tmp; \ + } + +_ROPE_SWAP_SPECIALIZATION(char,__STL_DEFAULT_ALLOCATOR(char)) + +#endif /* !__STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template +class _Rope_char_ptr_proxy { + // XXX this class should be rewritten. + friend class _Rope_char_ref_proxy<_CharT,_Alloc>; + size_t _M_pos; + rope<_CharT,_Alloc>* _M_root; // The whole rope. + public: + _Rope_char_ptr_proxy(const _Rope_char_ref_proxy<_CharT,_Alloc>& __x) + : _M_pos(__x._M_pos), _M_root(__x._M_root) {} + _Rope_char_ptr_proxy(const _Rope_char_ptr_proxy& __x) + : _M_pos(__x._M_pos), _M_root(__x._M_root) {} + _Rope_char_ptr_proxy() {} + _Rope_char_ptr_proxy(_CharT* __x) : _M_root(0), _M_pos(0) { + __stl_assert(0 == __x); + } + _Rope_char_ptr_proxy& + operator= (const _Rope_char_ptr_proxy& __x) { + _M_pos = __x._M_pos; + _M_root = __x._M_root; + return *this; + } +#ifdef __STL_MEMBER_TEMPLATES + template + friend bool operator== (const _Rope_char_ptr_proxy<_CharT2,_Alloc2>& __x, + const _Rope_char_ptr_proxy<_CharT2,_Alloc2>& __y); +#else + friend bool operator== __STL_NULL_TMPL_ARGS + (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x, + const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y); +#endif + _Rope_char_ref_proxy<_CharT,_Alloc> operator*() const { + return _Rope_char_ref_proxy<_CharT,_Alloc>(_M_root, _M_pos); + } +}; + + +// Rope iterators: +// Unlike in the C version, we cache only part of the stack +// for rope iterators, since they must be efficiently copyable. +// When we run out of cache, we have to reconstruct the iterator +// value. +// Pointers from iterators are not included in reference counts. +// Iterators are assumed to be thread private. Ropes can +// be shared. + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1375 +#endif + +template +class _Rope_iterator_base + : public random_access_iterator<_CharT, ptrdiff_t> { + friend class rope<_CharT,_Alloc>; + public: + typedef _Alloc _allocator_type; // used in _Rope_rotate, VC++ workaround + typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; + // Borland doesnt want this to be protected. + protected: + enum { _S_path_cache_len = 4 }; // Must be <= 9. + enum { _S_iterator_buf_len = 15 }; + size_t _M_current_pos; + _RopeRep* _M_root; // The whole rope. + size_t _M_leaf_pos; // Starting position for current leaf + __GC_CONST _CharT* _M_buf_start; + // Buffer possibly + // containing current char. + __GC_CONST _CharT* _M_buf_ptr; + // Pointer to current char in buffer. + // != 0 ==> buffer valid. + __GC_CONST _CharT* _M_buf_end; + // One past __last valid char in buffer. + // What follows is the path cache. We go out of our + // way to make this compact. + // Path_end contains the bottom section of the path from + // the root to the current leaf. + const _RopeRep* _M_path_end[_S_path_cache_len]; + int _M_leaf_index; // Last valid __pos in path_end; + // _M_path_end[0] ... _M_path_end[leaf_index-1] + // point to concatenation nodes. + unsigned char _M_path_directions; + // (path_directions >> __i) & 1 is 1 + // iff we got from _M_path_end[leaf_index - __i - 1] + // to _M_path_end[leaf_index - __i] by going to the + // __right. Assumes path_cache_len <= 9. + _CharT _M_tmp_buf[_S_iterator_buf_len]; + // Short buffer for surrounding chars. + // This is useful primarily for + // RopeFunctions. We put the buffer + // here to avoid locking in the + // multithreaded case. + // The cached path is generally assumed to be valid + // only if the buffer is valid. + static void _S_setbuf(_Rope_iterator_base& __x); + // Set buffer contents given + // path cache. + static void _S_setcache(_Rope_iterator_base& __x); + // Set buffer contents and + // path cache. + static void _S_setcache_for_incr(_Rope_iterator_base& __x); + // As above, but assumes path + // cache is valid for previous posn. + _Rope_iterator_base() {} + _Rope_iterator_base(_RopeRep* __root, size_t __pos) + : _M_current_pos(__pos), _M_root(__root), _M_buf_ptr(0) {} + void _M_incr(size_t __n); + void _M_decr(size_t __n); + public: + size_t index() const { return _M_current_pos; } + _Rope_iterator_base(const _Rope_iterator_base& __x) { + if (0 != __x._M_buf_ptr) { + *this = __x; + } else { + _M_current_pos = __x._M_current_pos; + _M_root = __x._M_root; + _M_buf_ptr = 0; + } + } +}; + +template class _Rope_iterator; + +template +class _Rope_const_iterator : public _Rope_iterator_base<_CharT,_Alloc> { + friend class rope<_CharT,_Alloc>; + protected: +# ifdef __STL_HAS_NAMESPACES + typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; + // The one from the base class may not be directly visible. +# endif + _Rope_const_iterator(const _RopeRep* __root, size_t __pos): + _Rope_iterator_base<_CharT,_Alloc>( + const_cast<_RopeRep*>(__root), __pos) + // Only nonconst iterators modify root ref count + {} + public: + typedef _CharT reference; // Really a value. Returning a reference + // Would be a mess, since it would have + // to be included in refcount. + typedef const _CharT* pointer; + + public: + _Rope_const_iterator() {}; + _Rope_const_iterator(const _Rope_const_iterator& __x) : + _Rope_iterator_base<_CharT,_Alloc>(__x) { } + _Rope_const_iterator(const _Rope_iterator<_CharT,_Alloc>& __x); + _Rope_const_iterator(const rope<_CharT,_Alloc>& __r, size_t __pos) : + _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr, __pos) {} + _Rope_const_iterator& operator= (const _Rope_const_iterator& __x) { + if (0 != __x._M_buf_ptr) { + *(static_cast<_Rope_iterator_base<_CharT,_Alloc>*>(this)) = __x; + } else { + _M_current_pos = __x._M_current_pos; + _M_root = __x._M_root; + _M_buf_ptr = 0; + } + return(*this); + } + reference operator*() { + if (0 == _M_buf_ptr) _S_setcache(*this); + return *_M_buf_ptr; + } + _Rope_const_iterator& operator++() { + __GC_CONST _CharT* __next; + if (0 != _M_buf_ptr && (__next = _M_buf_ptr + 1) < _M_buf_end) { + _M_buf_ptr = __next; + ++_M_current_pos; + } else { + _M_incr(1); + } + return *this; + } + _Rope_const_iterator& operator+=(ptrdiff_t __n) { + if (__n >= 0) { + _M_incr(__n); + } else { + _M_decr(-__n); + } + return *this; + } + _Rope_const_iterator& operator--() { + _M_decr(1); + return *this; + } + _Rope_const_iterator& operator-=(ptrdiff_t __n) { + if (__n >= 0) { + _M_decr(__n); + } else { + _M_incr(-__n); + } + return *this; + } + _Rope_const_iterator operator++(int) { + size_t __old_pos = _M_current_pos; + _M_incr(1); + return _Rope_const_iterator<_CharT,_Alloc>(_M_root, __old_pos); + // This makes a subsequent dereference expensive. + // Perhaps we should instead copy the iterator + // if it has a valid cache? + } + _Rope_const_iterator operator--(int) { + size_t __old_pos = _M_current_pos; + _M_decr(1); + return _Rope_const_iterator<_CharT,_Alloc>(_M_root, __old_pos); + } +#if defined(__STL_MEMBER_TEMPLATES) && defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) + template + friend _Rope_const_iterator<_CharT2,_Alloc2> operator- + (const _Rope_const_iterator<_CharT2,_Alloc2>& __x, + ptrdiff_t __n); + template + friend _Rope_const_iterator<_CharT2,_Alloc2> operator+ + (const _Rope_const_iterator<_CharT2,_Alloc2>& __x, + ptrdiff_t __n); + template + friend _Rope_const_iterator<_CharT2,_Alloc2> operator+ + (ptrdiff_t __n, + const _Rope_const_iterator<_CharT2,_Alloc2>& __x); +#else + friend _Rope_const_iterator<_CharT,_Alloc> operator- __STL_NULL_TMPL_ARGS + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n); + friend _Rope_const_iterator<_CharT,_Alloc> operator+ __STL_NULL_TMPL_ARGS + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n); + friend _Rope_const_iterator<_CharT,_Alloc> operator+ __STL_NULL_TMPL_ARGS + (ptrdiff_t __n, + const _Rope_const_iterator<_CharT,_Alloc>& __x); +#endif + + reference operator[](size_t __n) { + return rope<_CharT,_Alloc>::_S_fetch(_M_root, _M_current_pos + __n); + } + +#if defined(__STL_MEMBER_TEMPLATES) && defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) + template + friend bool operator== + (const _Rope_const_iterator<_CharT2,_Alloc2>& __x, + const _Rope_const_iterator<_CharT2,_Alloc2>& __y); + template + friend bool operator< + (const _Rope_const_iterator<_CharT2,_Alloc2>& __x, + const _Rope_const_iterator<_CharT2,_Alloc2>& __y); + template + friend ptrdiff_t operator- + (const _Rope_const_iterator<_CharT2,_Alloc2>& __x, + const _Rope_const_iterator<_CharT2,_Alloc2>& __y); +#else + friend bool operator== __STL_NULL_TMPL_ARGS + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y); + friend bool operator< __STL_NULL_TMPL_ARGS + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y); + friend ptrdiff_t operator- __STL_NULL_TMPL_ARGS + (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y); +#endif +}; + +template +class _Rope_iterator : public _Rope_iterator_base<_CharT,_Alloc> { + friend class rope<_CharT,_Alloc>; + protected: + rope<_CharT,_Alloc>* _M_root_rope; + // root is treated as a cached version of this, + // and is used to detect changes to the underlying + // rope. + // Root is included in the reference count. + // This is necessary so that we can detect changes reliably. + // Unfortunately, it requires careful bookkeeping for the + // nonGC case. + _Rope_iterator(rope<_CharT,_Alloc>* __r, size_t __pos) + : _Rope_iterator_base<_CharT,_Alloc>(__r->_M_tree_ptr, __pos), + _M_root_rope(__r) + { _RopeRep::_S_ref(_M_root); if (!(__r -> empty()))_S_setcache(*this); } + + void _M_check(); + public: + typedef _Rope_char_ref_proxy<_CharT,_Alloc> reference; + typedef _Rope_char_ref_proxy<_CharT,_Alloc>* pointer; + + public: + rope<_CharT,_Alloc>& container() { return *_M_root_rope; } + _Rope_iterator() { + _M_root = 0; // Needed for reference counting. + }; + _Rope_iterator(const _Rope_iterator& __x) : + _Rope_iterator_base<_CharT,_Alloc>(__x) { + _M_root_rope = __x._M_root_rope; + _RopeRep::_S_ref(_M_root); + } + _Rope_iterator(rope<_CharT,_Alloc>& __r, size_t __pos); + ~_Rope_iterator() { + _RopeRep::_S_unref(_M_root); + } + _Rope_iterator& operator= (const _Rope_iterator& __x) { + _RopeRep* __old = _M_root; + + _RopeRep::_S_ref(__x._M_root); + if (0 != __x._M_buf_ptr) { + _M_root_rope = __x._M_root_rope; + *(static_cast<_Rope_iterator_base<_CharT,_Alloc>*>(this)) = __x; + } else { + _M_current_pos = __x._M_current_pos; + _M_root = __x._M_root; + _M_root_rope = __x._M_root_rope; + _M_buf_ptr = 0; + } + _RopeRep::_S_unref(__old); + return(*this); + } + reference operator*() { + _M_check(); + if (0 == _M_buf_ptr) { + return _Rope_char_ref_proxy<_CharT,_Alloc>( + _M_root_rope, _M_current_pos); + } else { + return _Rope_char_ref_proxy<_CharT,_Alloc>( + _M_root_rope, _M_current_pos, *_M_buf_ptr); + } + } + _Rope_iterator& operator++() { + _M_incr(1); + return *this; + } + _Rope_iterator& operator+=(ptrdiff_t __n) { + if (__n >= 0) { + _M_incr(__n); + } else { + _M_decr(-__n); + } + return *this; + } + _Rope_iterator& operator--() { + _M_decr(1); + return *this; + } + _Rope_iterator& operator-=(ptrdiff_t __n) { + if (__n >= 0) { + _M_decr(__n); + } else { + _M_incr(-__n); + } + return *this; + } + _Rope_iterator operator++(int) { + size_t __old_pos = _M_current_pos; + _M_incr(1); + return _Rope_iterator<_CharT,_Alloc>(_M_root_rope, __old_pos); + } + _Rope_iterator operator--(int) { + size_t __old_pos = _M_current_pos; + _M_decr(1); + return _Rope_iterator<_CharT,_Alloc>(_M_root_rope, __old_pos); + } + reference operator[](ptrdiff_t __n) { + return _Rope_char_ref_proxy<_CharT,_Alloc>( + _M_root_rope, _M_current_pos + __n); + } + +#if defined(__STL_MEMBER_TEMPLATES) && defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) + template + friend bool operator== + (const _Rope_iterator<_CharT2,_Alloc2>& __x, + const _Rope_iterator<_CharT2,_Alloc2>& __y); + template + friend bool operator< + (const _Rope_iterator<_CharT2,_Alloc2>& __x, + const _Rope_iterator<_CharT2,_Alloc2>& __y); + template + friend ptrdiff_t operator- + (const _Rope_iterator<_CharT2,_Alloc2>& __x, + const _Rope_iterator<_CharT2,_Alloc2>& __y); + template + friend _Rope_iterator<_CharT2,_Alloc2> operator- + (const _Rope_iterator<_CharT2,_Alloc2>& __x, + ptrdiff_t __n); + template + friend _Rope_iterator<_CharT2,_Alloc2> operator+ + (const _Rope_iterator<_CharT2,_Alloc2>& __x, + ptrdiff_t __n); + template + friend _Rope_iterator<_CharT2,_Alloc2> operator+ + (ptrdiff_t __n, + const _Rope_iterator<_CharT2,_Alloc2>& __x); +#else + friend bool operator== __STL_NULL_TMPL_ARGS + (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y); + friend bool operator< __STL_NULL_TMPL_ARGS + (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y); + friend ptrdiff_t operator- __STL_NULL_TMPL_ARGS + (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y); + friend _Rope_iterator<_CharT,_Alloc> operator- __STL_NULL_TMPL_ARGS + (const _Rope_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n); + friend _Rope_iterator<_CharT,_Alloc> operator+ __STL_NULL_TMPL_ARGS + (const _Rope_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n); + friend _Rope_iterator<_CharT,_Alloc> operator+ __STL_NULL_TMPL_ARGS + (ptrdiff_t __n, + const _Rope_iterator<_CharT,_Alloc>& __x); +#endif +}; + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1375 +#endif + +// The rope base class encapsulates +// the differences between SGI-style allocators and standard-conforming +// allocators. + +#ifdef __STL_USE_STD_ALLOCATORS + +// Base class for ordinary allocators. +template +class _Rope_alloc_base { +public: + typedef _Rope_RopeRep<_CharT,_Allocator> _RopeRep; + typedef typename _Alloc_traits<_CharT,_Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return _M_data_allocator; } + _Rope_alloc_base(_RopeRep *__t, const allocator_type& __a) + : _M_tree_ptr(__t), _M_data_allocator(__a) {} + _Rope_alloc_base(const allocator_type& __a) + : _M_data_allocator(__a) {} + +protected: + // The only data members of a rope: + allocator_type _M_data_allocator; + _RopeRep* _M_tree_ptr; + +# define __ROPE_DEFINE_ALLOC(_Tp, __name) \ + typedef typename \ + _Alloc_traits<_Tp,_Allocator>::allocator_type __name##Allocator; \ + _Tp* __name##_allocate(size_t __n) const \ + { return __name##Allocator(_M_data_allocator).allocate(__n); } \ + void __name##_deallocate(_Tp *__p, size_t __n) const \ + { __name##Allocator(_M_data_allocator).deallocate(__p, __n); } + __ROPE_DEFINE_ALLOCS(_Allocator) +# undef __ROPE_DEFINE_ALLOC +}; + +// Specialization for allocators that have the property that we don't +// actually have to store an allocator object. +template +class _Rope_alloc_base<_CharT,_Allocator,true> { +public: + typedef _Rope_RopeRep<_CharT,_Allocator> _RopeRep; + typedef typename _Alloc_traits<_CharT,_Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + _Rope_alloc_base(_RopeRep *__t, const allocator_type&) + : _M_tree_ptr(__t) {} + _Rope_alloc_base(const allocator_type&) {} + +protected: + // The only data member of a rope: + _RopeRep *_M_tree_ptr; + +# define __ROPE_DEFINE_ALLOC(_Tp, __name) \ + typedef typename \ + _Alloc_traits<_Tp,_Allocator>::_Alloc_type __name##Alloc; \ + typedef typename \ + _Alloc_traits<_Tp,_Allocator>::allocator_type __name##Allocator; \ + static _Tp* __name##_allocate(size_t __n) \ + { return __name##Alloc::allocate(__n); } \ + static void __name##_deallocate(_Tp *__p, size_t __n) \ + { __name##Alloc::deallocate(__p, __n); } + __ROPE_DEFINE_ALLOCS(_Allocator) +# undef __ROPE_DEFINE_ALLOC +}; + +template +struct _Rope_base + : public _Rope_alloc_base<_CharT,_Alloc, + _Alloc_traits<_CharT,_Alloc>::_S_instanceless> +{ + typedef _Rope_alloc_base<_CharT,_Alloc, + _Alloc_traits<_CharT,_Alloc>::_S_instanceless> + _Base; + typedef typename _Base::allocator_type allocator_type; + typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; + // The one in _Base may not be visible due to template rules. + _Rope_base(_RopeRep* __t, const allocator_type& __a) : _Base(__t, __a) {} + _Rope_base(const allocator_type& __a) : _Base(__a) {} +}; + +#else /* !__STL_USE_STD_ALLOCATORS */ + +template +class _Rope_base { +public: + typedef _Rope_RopeRep<_CharT, _Alloc> _RopeRep; + typedef _Alloc allocator_type; + static allocator_type get_allocator() { return allocator_type(); } + _Rope_base(_RopeRep * __t, const allocator_type&) : _M_tree_ptr(__t) {} + _Rope_base(const allocator_type&) {} + +protected: + // The only data member of a rope: + _RopeRep* _M_tree_ptr; + +# define __ROPE_DEFINE_ALLOC(_Tp, __name) \ + typedef simple_alloc<_Tp, _Alloc> __name##Alloc; \ + static _Tp* __name##_allocate(size_t __n) \ + { return __name##Alloc::allocate(__n); } \ + static void __name##_deallocate(_Tp *__p, size_t __n) \ + { __name##Alloc::deallocate(__p, __n); } + __ROPE_DEFINE_ALLOCS(_Alloc) +# undef __ROPE_DEFINE_ALLOC +}; + +#endif /* __STL_USE_STD_ALLOCATORS */ + + +template +class rope : public _Rope_base<_CharT,_Alloc> { + public: + typedef _CharT value_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef _CharT const_reference; + typedef const _CharT* const_pointer; + typedef _Rope_iterator<_CharT,_Alloc> iterator; + typedef _Rope_const_iterator<_CharT,_Alloc> const_iterator; + typedef _Rope_char_ref_proxy<_CharT,_Alloc> reference; + typedef _Rope_char_ptr_proxy<_CharT,_Alloc> pointer; + + friend class _Rope_iterator<_CharT,_Alloc>; + friend class _Rope_const_iterator<_CharT,_Alloc>; + friend struct _Rope_RopeRep<_CharT,_Alloc>; + friend class _Rope_iterator_base<_CharT,_Alloc>; + friend class _Rope_char_ptr_proxy<_CharT,_Alloc>; + friend class _Rope_char_ref_proxy<_CharT,_Alloc>; + friend struct _Rope_RopeSubstring<_CharT,_Alloc>; + + protected: + typedef _Rope_base<_CharT,_Alloc> _Base; + typedef typename _Base::allocator_type allocator_type; +# ifdef __STL_USE_NAMESPACES + using _Base::_M_tree_ptr; +# endif + typedef __GC_CONST _CharT* _Cstrptr; + + static _CharT _S_empty_c_str[1]; + + static bool _S_is0(_CharT __c) { return __c == _S_eos((_CharT*)0); } + enum { _S_copy_max = 23 }; + // For strings shorter than _S_copy_max, we copy to + // concatenate. + + typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; + typedef _Rope_RopeConcatenation<_CharT,_Alloc> _RopeConcatenation; + typedef _Rope_RopeLeaf<_CharT,_Alloc> _RopeLeaf; + typedef _Rope_RopeFunction<_CharT,_Alloc> _RopeFunction; + typedef _Rope_RopeSubstring<_CharT,_Alloc> _RopeSubstring; + + // Retrieve a character at the indicated position. + static _CharT _S_fetch(_RopeRep* __r, size_type __pos); + +# ifndef __GC + // Obtain a pointer to the character at the indicated position. + // The pointer can be used to change the character. + // If such a pointer cannot be produced, as is frequently the + // case, 0 is returned instead. + // (Returns nonzero only if all nodes in the path have a refcount + // of 1.) + static _CharT* _S_fetch_ptr(_RopeRep* __r, size_type __pos); +# endif + + static bool _S_apply_to_pieces( + // should be template parameter + _Rope_char_consumer<_CharT>& __c, + const _RopeRep* __r, + size_t __begin, size_t __end); + // begin and end are assumed to be in range. + +# ifndef __GC + static void _S_unref(_RopeRep* __t) + { + _RopeRep::_S_unref(__t); + } + static void _S_ref(_RopeRep* __t) + { + _RopeRep::_S_ref(__t); + } +# else /* __GC */ + static void _S_unref(_RopeRep*) {} + static void _S_ref(_RopeRep*) {} +# endif + + +# ifdef __GC + typedef _Rope_RopeRep<_CharT,_Alloc>* _Self_destruct_ptr; +# else + typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr; +# endif + + // _Result is counted in refcount. + static _RopeRep* _S_substring(_RopeRep* __base, + size_t __start, size_t __endp1); + + static _RopeRep* _S_concat_char_iter(_RopeRep* __r, + const _CharT* __iter, size_t __slen); + // Concatenate rope and char ptr, copying __s. + // Should really take an arbitrary iterator. + // Result is counted in refcount. + static _RopeRep* _S_destr_concat_char_iter(_RopeRep* __r, + const _CharT* __iter, size_t __slen) + // As above, but one reference to __r is about to be + // destroyed. Thus the pieces may be recycled if all + // relevent reference counts are 1. +# ifdef __GC + // We can't really do anything since refcounts are unavailable. + { return _S_concat_char_iter(__r, __iter, __slen); } +# else + ; +# endif + + static _RopeRep* _S_concat(_RopeRep* __left, _RopeRep* __right); + // General concatenation on _RopeRep. _Result + // has refcount of 1. Adjusts argument refcounts. + + public: + void apply_to_pieces( size_t __begin, size_t __end, + _Rope_char_consumer<_CharT>& __c) const { + _S_apply_to_pieces(__c, _M_tree_ptr, __begin, __end); + } + + + protected: + + static size_t _S_rounded_up_size(size_t __n) { + return _RopeLeaf::_S_rounded_up_size(__n); + } + + static size_t _S_allocated_capacity(size_t __n) { + if (_S_is_basic_char_type((_CharT*)0)) { + return _S_rounded_up_size(__n) - 1; + } else { + return _S_rounded_up_size(__n); + } + } + + // Allocate and construct a RopeLeaf using the supplied allocator + // Takes ownership of s instead of copying. + static _RopeLeaf* _S_new_RopeLeaf(__GC_CONST _CharT *__s, + size_t __size, allocator_type __a) + { +# ifdef __STL_USE_STD_ALLOCATORS + _RopeLeaf* __space = _LAllocator(__a).allocate(1); +# else + _RopeLeaf* __space = _L_allocate(1); +# endif + return new(__space) _RopeLeaf(__s, __size, __a); + } + + static _RopeConcatenation* _S_new_RopeConcatenation( + _RopeRep* __left, _RopeRep* __right, + allocator_type __a) + { +# ifdef __STL_USE_STD_ALLOCATORS + _RopeConcatenation* __space = _CAllocator(__a).allocate(1); +# else + _RopeConcatenation* __space = _C_allocate(1); +# endif + return new(__space) _RopeConcatenation(__left, __right, __a); + } + + static _RopeFunction* _S_new_RopeFunction(char_producer<_CharT>* __f, + size_t __size, bool __d, allocator_type __a) + { +# ifdef __STL_USE_STD_ALLOCATORS + _RopeFunction* __space = _FAllocator(__a).allocate(1); +# else + _RopeFunction* __space = _F_allocate(1); +# endif + return new(__space) _RopeFunction(__f, __size, __d, __a); + } + + static _RopeSubstring* _S_new_RopeSubstring( + _Rope_RopeRep<_CharT,_Alloc>* __b, size_t __s, + size_t __l, allocator_type __a) + { +# ifdef __STL_USE_STD_ALLOCATORS + _RopeSubstring* __space = _SAllocator(__a).allocate(1); +# else + _RopeSubstring* __space = _S_allocate(1); +# endif + return new(__space) _RopeSubstring(__b, __s, __l, __a); + } + +# ifdef __STL_USE_STD_ALLOCATORS + static + _RopeLeaf* _S_RopeLeaf_from_unowned_char_ptr(const _CharT *__s, + size_t __size, allocator_type __a) +# define __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __size, __a) \ + _S_RopeLeaf_from_unowned_char_ptr(__s, __size, __a) +# else + static + _RopeLeaf* _S_RopeLeaf_from_unowned_char_ptr2(const _CharT* __s, + size_t __size) +# define __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __size, __a) \ + _S_RopeLeaf_from_unowned_char_ptr2(__s, __size) +# endif + { + if (0 == __size) return 0; +# ifdef __STL_USE_STD_ALLOCATORS + _CharT* __buf = __a.allocate(_S_rounded_up_size(__size)); +# else + _CharT* __buf = _Data_allocate(_S_rounded_up_size(__size)); + allocator_type __a = allocator_type(); +# endif + + uninitialized_copy_n(__s, __size, __buf); + _S_cond_store_eos(__buf[__size]); + __STL_TRY { + return _S_new_RopeLeaf(__buf, __size, __a); + } + __STL_UNWIND(_RopeRep::__STL_FREE_STRING(__buf, __size, __a)) + } + + + // Concatenation of nonempty strings. + // Always builds a concatenation node. + // Rebalances if the result is too deep. + // Result has refcount 1. + // Does not increment left and right ref counts even though + // they are referenced. + static _RopeRep* + _S_tree_concat(_RopeRep* __left, _RopeRep* __right); + + // Concatenation helper functions + static _RopeLeaf* + _S_leaf_concat_char_iter(_RopeLeaf* __r, + const _CharT* __iter, size_t __slen); + // Concatenate by copying leaf. + // should take an arbitrary iterator + // result has refcount 1. +# ifndef __GC + static _RopeLeaf* _S_destr_leaf_concat_char_iter + (_RopeLeaf* __r, const _CharT* __iter, size_t __slen); + // A version that potentially clobbers __r if __r->_M_ref_count == 1. +# endif + + private: + + static size_t _S_char_ptr_len(const _CharT* __s); + // slightly generalized strlen + + rope(_RopeRep* __t, const allocator_type& __a = allocator_type()) + : _Base(__t,__a) { } + + + // Copy __r to the _CharT buffer. + // Returns __buffer + __r->_M_size. + // Assumes that buffer is uninitialized. + static _CharT* _S_flatten(_RopeRep* __r, _CharT* __buffer); + + // Again, with explicit starting position and length. + // Assumes that buffer is uninitialized. + static _CharT* _S_flatten(_RopeRep* __r, + size_t __start, size_t __len, + _CharT* __buffer); + + static const unsigned long + _S_min_len[_RopeRep::_S_max_rope_depth + 1]; + + static bool _S_is_balanced(_RopeRep* __r) + { return (__r->_M_size >= _S_min_len[__r->_M_depth]); } + + static bool _S_is_almost_balanced(_RopeRep* __r) + { return (__r->_M_depth == 0 || + __r->_M_size >= _S_min_len[__r->_M_depth - 1]); } + + static bool _S_is_roughly_balanced(_RopeRep* __r) + { return (__r->_M_depth <= 1 || + __r->_M_size >= _S_min_len[__r->_M_depth - 2]); } + + // Assumes the result is not empty. + static _RopeRep* _S_concat_and_set_balanced(_RopeRep* __left, + _RopeRep* __right) + { + _RopeRep* __result = _S_concat(__left, __right); + if (_S_is_balanced(__result)) __result->_M_is_balanced = true; + return __result; + } + + // The basic rebalancing operation. Logically copies the + // rope. The result has refcount of 1. The client will + // usually decrement the reference count of __r. + // The result is within height 2 of balanced by the above + // definition. + static _RopeRep* _S_balance(_RopeRep* __r); + + // Add all unbalanced subtrees to the forest of balanceed trees. + // Used only by balance. + static void _S_add_to_forest(_RopeRep*__r, _RopeRep** __forest); + + // Add __r to forest, assuming __r is already balanced. + static void _S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest); + + // Print to stdout, exposing structure + static void _S_dump(_RopeRep* __r, int __indent = 0); + + // Return -1, 0, or 1 if __x < __y, __x == __y, or __x > __y resp. + static int _S_compare(const _RopeRep* __x, const _RopeRep* __y); + + public: + bool empty() const { return 0 == _M_tree_ptr; } + + // Comparison member function. This is public only for those + // clients that need a ternary comparison. Others + // should use the comparison operators below. + int compare(const rope& __y) const { + return _S_compare(_M_tree_ptr, __y._M_tree_ptr); + } + + rope(const _CharT* __s, const allocator_type& __a = allocator_type()) + : _Base(__STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, _S_char_ptr_len(__s), + __a),__a) + { } + + rope(const _CharT* __s, size_t __len, + const allocator_type& __a = allocator_type()) + : _Base(__STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __len, __a), __a) + { } + + // Should perhaps be templatized with respect to the iterator type + // and use Sequence_buffer. (It should perhaps use sequence_buffer + // even now.) + rope(const _CharT *__s, const _CharT *__e, + const allocator_type& __a = allocator_type()) + : _Base(__STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __e - __s, __a), __a) + { } + + rope(const const_iterator& __s, const const_iterator& __e, + const allocator_type& __a = allocator_type()) + : _Base(_S_substring(__s._M_root, __s._M_current_pos, + __e._M_current_pos), __a) + { } + + rope(const iterator& __s, const iterator& __e, + const allocator_type& __a = allocator_type()) + : _Base(_S_substring(__s._M_root, __s._M_current_pos, + __e._M_current_pos), __a) + { } + + rope(_CharT __c, const allocator_type& __a = allocator_type()) + : _Base(__a) + { + _CharT* __buf = _Data_allocate(_S_rounded_up_size(1)); + + construct(__buf, __c); + __STL_TRY { + _M_tree_ptr = _S_new_RopeLeaf(__buf, 1, __a); + } + __STL_UNWIND(_RopeRep::__STL_FREE_STRING(__buf, 1, __a)) + } + + rope(size_t __n, _CharT __c, + const allocator_type& __a = allocator_type()); + + rope(const allocator_type& __a = allocator_type()) + : _Base(0, __a) {} + + // Construct a rope from a function that can compute its members + rope(char_producer<_CharT> *__fn, size_t __len, bool __delete_fn, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { + _M_tree_ptr = (0 == __len) ? + 0 : _S_new_RopeFunction(__fn, __len, __delete_fn, __a); + } + + rope(const rope& __x, const allocator_type& __a = allocator_type()) + : _Base(__x._M_tree_ptr, __a) + { + _S_ref(_M_tree_ptr); + } + + ~rope() + { + _S_unref(_M_tree_ptr); + } + + rope& operator=(const rope& __x) + { + _RopeRep* __old = _M_tree_ptr; +# ifdef __STL_USE_STD_ALLOCATORS + __stl_assert(get_allocator() == __x.get_allocator()); +# endif + _M_tree_ptr = __x._M_tree_ptr; + _S_ref(_M_tree_ptr); + _S_unref(__old); + return(*this); + } + + void clear() + { + _S_unref(_M_tree_ptr); + _M_tree_ptr = 0; + } + + void push_back(_CharT __x) + { + _RopeRep* __old = _M_tree_ptr; + _M_tree_ptr = _S_destr_concat_char_iter(_M_tree_ptr, &__x, 1); + _S_unref(__old); + } + + void pop_back() + { + _RopeRep* __old = _M_tree_ptr; + _M_tree_ptr = + _S_substring(_M_tree_ptr, 0, _M_tree_ptr->_M_size - 1); + _S_unref(__old); + } + + _CharT back() const + { + return _S_fetch(_M_tree_ptr, _M_tree_ptr->_M_size - 1); + } + + void push_front(_CharT __x) + { + _RopeRep* __old = _M_tree_ptr; + _RopeRep* __left = + __STL_ROPE_FROM_UNOWNED_CHAR_PTR(&__x, 1, get_allocator()); + __STL_TRY { + _M_tree_ptr = _S_concat(__left, _M_tree_ptr); + _S_unref(__old); + _S_unref(__left); + } + __STL_UNWIND(_S_unref(__left)) + } + + void pop_front() + { + _RopeRep* __old = _M_tree_ptr; + _M_tree_ptr = _S_substring(_M_tree_ptr, 1, _M_tree_ptr->_M_size); + _S_unref(__old); + } + + _CharT front() const + { + return _S_fetch(_M_tree_ptr, 0); + } + + void balance() + { + _RopeRep* __old = _M_tree_ptr; + _M_tree_ptr = _S_balance(_M_tree_ptr); + _S_unref(__old); + } + + void copy(_CharT* __buffer) const { + destroy(__buffer, __buffer + size()); + _S_flatten(_M_tree_ptr, __buffer); + } + + // This is the copy function from the standard, but + // with the arguments reordered to make it consistent with the + // rest of the interface. + // Note that this guaranteed not to compile if the draft standard + // order is assumed. + size_type copy(size_type __pos, size_type __n, _CharT* __buffer) const + { + size_t __size = size(); + size_t __len = (__pos + __n > __size? __size - __pos : __n); + + destroy(__buffer, __buffer + __len); + _S_flatten(_M_tree_ptr, __pos, __len, __buffer); + return __len; + } + + // Print to stdout, exposing structure. May be useful for + // performance debugging. + void dump() { + _S_dump(_M_tree_ptr); + } + + // Convert to 0 terminated string in new allocated memory. + // Embedded 0s in the input do not terminate the copy. + const _CharT* c_str() const; + + // As above, but lso use the flattened representation as the + // the new rope representation. + const _CharT* replace_with_c_str(); + + // Reclaim memory for the c_str generated flattened string. + // Intentionally undocumented, since it's hard to say when this + // is safe for multiple threads. + void delete_c_str () { + if (0 == _M_tree_ptr) return; + if (_RopeRep::_S_leaf == _M_tree_ptr->_M_tag && + ((_RopeLeaf*)_M_tree_ptr)->_M_data == + _M_tree_ptr->_M_c_string) { + // Representation shared + return; + } +# ifndef __GC + _M_tree_ptr->_M_free_c_string(); +# endif + _M_tree_ptr->_M_c_string = 0; + } + + _CharT operator[] (size_type __pos) const { + return _S_fetch(_M_tree_ptr, __pos); + } + + _CharT at(size_type __pos) const { + // if (__pos >= size()) throw out_of_range; // XXX + return (*this)[__pos]; + } + + const_iterator begin() const { + return(const_iterator(_M_tree_ptr, 0)); + } + + // An easy way to get a const iterator from a non-const container. + const_iterator const_begin() const { + return(const_iterator(_M_tree_ptr, 0)); + } + + const_iterator end() const { + return(const_iterator(_M_tree_ptr, size())); + } + + const_iterator const_end() const { + return(const_iterator(_M_tree_ptr, size())); + } + + size_type size() const { + return(0 == _M_tree_ptr? 0 : _M_tree_ptr->_M_size); + } + + size_type length() const { + return size(); + } + + size_type max_size() const { + return _S_min_len[_RopeRep::_S_max_rope_depth-1] - 1; + // Guarantees that the result can be sufficirntly + // balanced. Longer ropes will probably still work, + // but it's harder to make guarantees. + } + +# ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + typedef reverse_iterator const_reverse_iterator; +# else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + typedef reverse_iterator const_reverse_iterator; +# endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + + const_reverse_iterator const_rbegin() const { + return const_reverse_iterator(end()); + } + + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + + const_reverse_iterator const_rend() const { + return const_reverse_iterator(begin()); + } + +#if defined(__STL_MEMBER_TEMPLATES) && defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) + template + friend rope<_CharT2,_Alloc2> + operator+ (const rope<_CharT2,_Alloc2>& __left, + const rope<_CharT2,_Alloc2>& __right); + + template + friend rope<_CharT2,_Alloc2> + operator+ (const rope<_CharT2,_Alloc2>& __left, + const _CharT2* __right); + + template + friend rope<_CharT2,_Alloc2> + operator+ (const rope<_CharT2,_Alloc2>& __left, _CharT2 __right); +#else + friend rope<_CharT,_Alloc> __STD_QUALIFIER + operator+ __STL_NULL_TMPL_ARGS (const rope<_CharT,_Alloc>& __left, + const rope<_CharT,_Alloc>& __right); + + friend rope<_CharT,_Alloc> __STD_QUALIFIER + operator+ __STL_NULL_TMPL_ARGS (const rope<_CharT,_Alloc>& __left, + const _CharT* __right); + + friend rope<_CharT,_Alloc> __STD_QUALIFIER + operator+ __STL_NULL_TMPL_ARGS (const rope<_CharT,_Alloc>& __left, + _CharT __right); +#endif + // The symmetric cases are intentionally omitted, since they're presumed + // to be less common, and we don't handle them as well. + + // The following should really be templatized. + // The first argument should be an input iterator or + // forward iterator with value_type _CharT. + rope& append(const _CharT* __iter, size_t __n) { + _RopeRep* __result = + _S_destr_concat_char_iter(_M_tree_ptr, __iter, __n); + _S_unref(_M_tree_ptr); + _M_tree_ptr = __result; + return *this; + } + + rope& append(const _CharT* __c_string) { + size_t __len = _S_char_ptr_len(__c_string); + append(__c_string, __len); + return(*this); + } + + rope& append(const _CharT* __s, const _CharT* __e) { + _RopeRep* __result = + _S_destr_concat_char_iter(_M_tree_ptr, __s, __e - __s); + _S_unref(_M_tree_ptr); + _M_tree_ptr = __result; + return *this; + } + + rope& append(const_iterator __s, const_iterator __e) { + __stl_assert(__s._M_root == __e._M_root); +# ifdef __STL_USE_STD_ALLOCATORS + __stl_assert(get_allocator() == __s._M_root->get_allocator()); +# endif + _Self_destruct_ptr __appendee(_S_substring( + __s._M_root, __s._M_current_pos, __e._M_current_pos)); + _RopeRep* __result = + _S_concat(_M_tree_ptr, (_RopeRep*)__appendee); + _S_unref(_M_tree_ptr); + _M_tree_ptr = __result; + return *this; + } + + rope& append(_CharT __c) { + _RopeRep* __result = + _S_destr_concat_char_iter(_M_tree_ptr, &__c, 1); + _S_unref(_M_tree_ptr); + _M_tree_ptr = __result; + return *this; + } + + rope& append() { return append(_CharT()); } // XXX why? + + rope& append(const rope& __y) { +# ifdef __STL_USE_STD_ALLOCATORS + __stl_assert(__y.get_allocator() == get_allocator()); +# endif + _RopeRep* __result = _S_concat(_M_tree_ptr, __y._M_tree_ptr); + _S_unref(_M_tree_ptr); + _M_tree_ptr = __result; + return *this; + } + + rope& append(size_t __n, _CharT __c) { + rope<_CharT,_Alloc> __last(__n, __c); + return append(__last); + } + + void swap(rope& __b) { +# ifdef __STL_USE_STD_ALLOCATORS + __stl_assert(get_allocator() == __b.get_allocator()); +# endif + _RopeRep* __tmp = _M_tree_ptr; + _M_tree_ptr = __b._M_tree_ptr; + __b._M_tree_ptr = __tmp; + } + + + protected: + // Result is included in refcount. + static _RopeRep* replace(_RopeRep* __old, size_t __pos1, + size_t __pos2, _RopeRep* __r) { + if (0 == __old) { _S_ref(__r); return __r; } + _Self_destruct_ptr __left( + _S_substring(__old, 0, __pos1)); + _Self_destruct_ptr __right( + _S_substring(__old, __pos2, __old->_M_size)); + _RopeRep* __result; + +# ifdef __STL_USE_STD_ALLOCATORS + __stl_assert(__old->get_allocator() == __r->get_allocator()); +# endif + if (0 == __r) { + __result = _S_concat(__left, __right); + } else { + _Self_destruct_ptr __left_result(_S_concat(__left, __r)); + __result = _S_concat(__left_result, __right); + } + return __result; + } + + public: + void insert(size_t __p, const rope& __r) { + _RopeRep* __result = + replace(_M_tree_ptr, __p, __p, __r._M_tree_ptr); +# ifdef __STL_USE_STD_ALLOCATORS + __stl_assert(get_allocator() == __r.get_allocator()); +# endif + _S_unref(_M_tree_ptr); + _M_tree_ptr = __result; + } + + void insert(size_t __p, size_t __n, _CharT __c) { + rope<_CharT,_Alloc> __r(__n,__c); + insert(__p, __r); + } + + void insert(size_t __p, const _CharT* __i, size_t __n) { + _Self_destruct_ptr __left(_S_substring(_M_tree_ptr, 0, __p)); + _Self_destruct_ptr __right(_S_substring(_M_tree_ptr, __p, size())); + _Self_destruct_ptr __left_result( + _S_concat_char_iter(__left, __i, __n)); + // _S_ destr_concat_char_iter should be safe here. + // But as it stands it's probably not a win, since __left + // is likely to have additional references. + _RopeRep* __result = _S_concat(__left_result, __right); + _S_unref(_M_tree_ptr); + _M_tree_ptr = __result; + } + + void insert(size_t __p, const _CharT* __c_string) { + insert(__p, __c_string, _S_char_ptr_len(__c_string)); + } + + void insert(size_t __p, _CharT __c) { + insert(__p, &__c, 1); + } + + void insert(size_t __p) { + _CharT __c = _CharT(); + insert(__p, &__c, 1); + } + + void insert(size_t __p, const _CharT* __i, const _CharT* __j) { + rope __r(__i, __j); + insert(__p, __r); + } + + void insert(size_t __p, const const_iterator& __i, + const const_iterator& __j) { + rope __r(__i, __j); + insert(__p, __r); + } + + void insert(size_t __p, const iterator& __i, + const iterator& __j) { + rope __r(__i, __j); + insert(__p, __r); + } + + // (position, length) versions of replace operations: + + void replace(size_t __p, size_t __n, const rope& __r) { + _RopeRep* __result = + replace(_M_tree_ptr, __p, __p + __n, __r._M_tree_ptr); + _S_unref(_M_tree_ptr); + _M_tree_ptr = __result; + } + + void replace(size_t __p, size_t __n, + const _CharT* __i, size_t __i_len) { + rope __r(__i, __i_len); + replace(__p, __n, __r); + } + + void replace(size_t __p, size_t __n, _CharT __c) { + rope __r(__c); + replace(__p, __n, __r); + } + + void replace(size_t __p, size_t __n, const _CharT* __c_string) { + rope __r(__c_string); + replace(__p, __n, __r); + } + + void replace(size_t __p, size_t __n, + const _CharT* __i, const _CharT* __j) { + rope __r(__i, __j); + replace(__p, __n, __r); + } + + void replace(size_t __p, size_t __n, + const const_iterator& __i, const const_iterator& __j) { + rope __r(__i, __j); + replace(__p, __n, __r); + } + + void replace(size_t __p, size_t __n, + const iterator& __i, const iterator& __j) { + rope __r(__i, __j); + replace(__p, __n, __r); + } + + // Single character variants: + void replace(size_t __p, _CharT __c) { + iterator __i(this, __p); + *__i = __c; + } + + void replace(size_t __p, const rope& __r) { + replace(__p, 1, __r); + } + + void replace(size_t __p, const _CharT* __i, size_t __i_len) { + replace(__p, 1, __i, __i_len); + } + + void replace(size_t __p, const _CharT* __c_string) { + replace(__p, 1, __c_string); + } + + void replace(size_t __p, const _CharT* __i, const _CharT* __j) { + replace(__p, 1, __i, __j); + } + + void replace(size_t __p, const const_iterator& __i, + const const_iterator& __j) { + replace(__p, 1, __i, __j); + } + + void replace(size_t __p, const iterator& __i, + const iterator& __j) { + replace(__p, 1, __i, __j); + } + + // Erase, (position, size) variant. + void erase(size_t __p, size_t __n) { + _RopeRep* __result = replace(_M_tree_ptr, __p, __p + __n, 0); + _S_unref(_M_tree_ptr); + _M_tree_ptr = __result; + } + + // Erase, single character + void erase(size_t __p) { + erase(__p, __p + 1); + } + + // Insert, iterator variants. + iterator insert(const iterator& __p, const rope& __r) + { insert(__p.index(), __r); return __p; } + iterator insert(const iterator& __p, size_t __n, _CharT __c) + { insert(__p.index(), __n, __c); return __p; } + iterator insert(const iterator& __p, _CharT __c) + { insert(__p.index(), __c); return __p; } + iterator insert(const iterator& __p ) + { insert(__p.index()); return __p; } + iterator insert(const iterator& __p, const _CharT* c_string) + { insert(__p.index(), c_string); return __p; } + iterator insert(const iterator& __p, const _CharT* __i, size_t __n) + { insert(__p.index(), __i, __n); return __p; } + iterator insert(const iterator& __p, const _CharT* __i, + const _CharT* __j) + { insert(__p.index(), __i, __j); return __p; } + iterator insert(const iterator& __p, + const const_iterator& __i, const const_iterator& __j) + { insert(__p.index(), __i, __j); return __p; } + iterator insert(const iterator& __p, + const iterator& __i, const iterator& __j) + { insert(__p.index(), __i, __j); return __p; } + + // Replace, range variants. + void replace(const iterator& __p, const iterator& __q, + const rope& __r) + { replace(__p.index(), __q.index() - __p.index(), __r); } + void replace(const iterator& __p, const iterator& __q, _CharT __c) + { replace(__p.index(), __q.index() - __p.index(), __c); } + void replace(const iterator& __p, const iterator& __q, + const _CharT* __c_string) + { replace(__p.index(), __q.index() - __p.index(), __c_string); } + void replace(const iterator& __p, const iterator& __q, + const _CharT* __i, size_t __n) + { replace(__p.index(), __q.index() - __p.index(), __i, __n); } + void replace(const iterator& __p, const iterator& __q, + const _CharT* __i, const _CharT* __j) + { replace(__p.index(), __q.index() - __p.index(), __i, __j); } + void replace(const iterator& __p, const iterator& __q, + const const_iterator& __i, const const_iterator& __j) + { replace(__p.index(), __q.index() - __p.index(), __i, __j); } + void replace(const iterator& __p, const iterator& __q, + const iterator& __i, const iterator& __j) + { replace(__p.index(), __q.index() - __p.index(), __i, __j); } + + // Replace, iterator variants. + void replace(const iterator& __p, const rope& __r) + { replace(__p.index(), __r); } + void replace(const iterator& __p, _CharT __c) + { replace(__p.index(), __c); } + void replace(const iterator& __p, const _CharT* __c_string) + { replace(__p.index(), __c_string); } + void replace(const iterator& __p, const _CharT* __i, size_t __n) + { replace(__p.index(), __i, __n); } + void replace(const iterator& __p, const _CharT* __i, const _CharT* __j) + { replace(__p.index(), __i, __j); } + void replace(const iterator& __p, const_iterator __i, + const_iterator __j) + { replace(__p.index(), __i, __j); } + void replace(const iterator& __p, iterator __i, iterator __j) + { replace(__p.index(), __i, __j); } + + // Iterator and range variants of erase + iterator erase(const iterator& __p, const iterator& __q) { + size_t __p_index = __p.index(); + erase(__p_index, __q.index() - __p_index); + return iterator(this, __p_index); + } + iterator erase(const iterator& __p) { + size_t __p_index = __p.index(); + erase(__p_index, 1); + return iterator(this, __p_index); + } + + rope substr(size_t __start, size_t __len = 1) const { + return rope<_CharT,_Alloc>( + _S_substring(_M_tree_ptr, __start, __start + __len)); + } + + rope substr(iterator __start, iterator __end) const { + return rope<_CharT,_Alloc>( + _S_substring(_M_tree_ptr, __start.index(), __end.index())); + } + + rope substr(iterator __start) const { + size_t __pos = __start.index(); + return rope<_CharT,_Alloc>( + _S_substring(_M_tree_ptr, __pos, __pos + 1)); + } + + rope substr(const_iterator __start, const_iterator __end) const { + // This might eventually take advantage of the cache in the + // iterator. + return rope<_CharT,_Alloc>( + _S_substring(_M_tree_ptr, __start.index(), __end.index())); + } + + rope<_CharT,_Alloc> substr(const_iterator __start) { + size_t __pos = __start.index(); + return rope<_CharT,_Alloc>( + _S_substring(_M_tree_ptr, __pos, __pos + 1)); + } + + static const size_type npos; + + size_type find(_CharT __c, size_type __pos = 0) const; + size_type find(const _CharT* __s, size_type __pos = 0) const { + size_type __result_pos; + const_iterator __result = search(const_begin() + __pos, const_end(), + __s, __s + _S_char_ptr_len(__s)); + __result_pos = __result.index(); +# ifndef __STL_OLD_ROPE_SEMANTICS + if (__result_pos == size()) __result_pos = npos; +# endif + return __result_pos; + } + + iterator mutable_begin() { + return(iterator(this, 0)); + } + + iterator mutable_end() { + return(iterator(this, size())); + } + +# ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + typedef reverse_iterator reverse_iterator; +# else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + typedef reverse_iterator reverse_iterator; +# endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + + reverse_iterator mutable_rbegin() { + return reverse_iterator(mutable_end()); + } + + reverse_iterator mutable_rend() { + return reverse_iterator(mutable_begin()); + } + + reference mutable_reference_at(size_type __pos) { + return reference(this, __pos); + } + +# ifdef __STD_STUFF + reference operator[] (size_type __pos) { + return _char_ref_proxy(this, __pos); + } + + reference at(size_type __pos) { + // if (__pos >= size()) throw out_of_range; // XXX + return (*this)[__pos]; + } + + void resize(size_type __n, _CharT __c) {} + void resize(size_type __n) {} + void reserve(size_type __res_arg = 0) {} + size_type capacity() const { + return max_size(); + } + + // Stuff below this line is dangerous because it's error prone. + // I would really like to get rid of it. + // copy function with funny arg ordering. + size_type copy(_CharT* __buffer, size_type __n, + size_type __pos = 0) const { + return copy(__pos, __n, __buffer); + } + + iterator end() { return mutable_end(); } + + iterator begin() { return mutable_begin(); } + + reverse_iterator rend() { return mutable_rend(); } + + reverse_iterator rbegin() { return mutable_rbegin(); } + +# else + + const_iterator end() { return const_end(); } + + const_iterator begin() { return const_begin(); } + + const_reverse_iterator rend() { return const_rend(); } + + const_reverse_iterator rbegin() { return const_rbegin(); } + +# endif + +}; + +template +const rope<_CharT, _Alloc>::size_type rope<_CharT, _Alloc>::npos = + (size_type)(-1); + +template +inline bool operator== (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y) { + return (__x._M_current_pos == __y._M_current_pos && + __x._M_root == __y._M_root); +} + +template +inline bool operator< (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y) { + return (__x._M_current_pos < __y._M_current_pos); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!= (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool operator> (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool operator<= (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool operator>= (const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y) { + return !(__x < __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template +inline ptrdiff_t operator-(const _Rope_const_iterator<_CharT,_Alloc>& __x, + const _Rope_const_iterator<_CharT,_Alloc>& __y) { + return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos; +} + +template +inline _Rope_const_iterator<_CharT,_Alloc> +operator-(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) { + return _Rope_const_iterator<_CharT,_Alloc>( + __x._M_root, __x._M_current_pos - __n); +} + +template +inline _Rope_const_iterator<_CharT,_Alloc> +operator+(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) { + return _Rope_const_iterator<_CharT,_Alloc>( + __x._M_root, __x._M_current_pos + __n); +} + +template +inline _Rope_const_iterator<_CharT,_Alloc> +operator+(ptrdiff_t __n, const _Rope_const_iterator<_CharT,_Alloc>& __x) { + return _Rope_const_iterator<_CharT,_Alloc>( + __x._M_root, __x._M_current_pos + __n); +} + +template +inline bool operator== (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y) { + return (__x._M_current_pos == __y._M_current_pos && + __x._M_root_rope == __y._M_root_rope); +} + +template +inline bool operator< (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y) { + return (__x._M_current_pos < __y._M_current_pos); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!= (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool operator> (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool operator<= (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool operator>= (const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y) { + return !(__x < __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template +inline ptrdiff_t operator-(const _Rope_iterator<_CharT,_Alloc>& __x, + const _Rope_iterator<_CharT,_Alloc>& __y) { + return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos; +} + +template +inline _Rope_iterator<_CharT,_Alloc> +operator-(const _Rope_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n) { + return _Rope_iterator<_CharT,_Alloc>( + __x._M_root_rope, __x._M_current_pos - __n); +} + +template +inline _Rope_iterator<_CharT,_Alloc> +operator+(const _Rope_iterator<_CharT,_Alloc>& __x, + ptrdiff_t __n) { + return _Rope_iterator<_CharT,_Alloc>( + __x._M_root_rope, __x._M_current_pos + __n); +} + +template +inline _Rope_iterator<_CharT,_Alloc> +operator+(ptrdiff_t __n, const _Rope_iterator<_CharT,_Alloc>& __x) { + return _Rope_iterator<_CharT,_Alloc>( + __x._M_root_rope, __x._M_current_pos + __n); +} + +template +inline +rope<_CharT,_Alloc> +operator+ (const rope<_CharT,_Alloc>& __left, + const rope<_CharT,_Alloc>& __right) +{ +# ifdef __STL_USE_STD_ALLOCATORS + __stl_assert(__left.get_allocator() == __right.get_allocator()); +# endif + return rope<_CharT,_Alloc>( + rope<_CharT,_Alloc>::_S_concat(__left._M_tree_ptr, __right._M_tree_ptr)); + // Inlining this should make it possible to keep __left and + // __right in registers. +} + +template +inline +rope<_CharT,_Alloc>& +operator+= (rope<_CharT,_Alloc>& __left, + const rope<_CharT,_Alloc>& __right) +{ + __left.append(__right); + return __left; +} + +template +inline +rope<_CharT,_Alloc> +operator+ (const rope<_CharT,_Alloc>& __left, + const _CharT* __right) { + size_t __rlen = rope<_CharT,_Alloc>::_S_char_ptr_len(__right); + return rope<_CharT,_Alloc>( + rope<_CharT,_Alloc>::_S_concat_char_iter( + __left._M_tree_ptr, __right, __rlen)); +} + +template +inline +rope<_CharT,_Alloc>& +operator+= (rope<_CharT,_Alloc>& __left, + const _CharT* __right) { + __left.append(__right); + return __left; +} + +template +inline +rope<_CharT,_Alloc> +operator+ (const rope<_CharT,_Alloc>& __left, _CharT __right) { + return rope<_CharT,_Alloc>( + rope<_CharT,_Alloc>::_S_concat_char_iter( + __left._M_tree_ptr, &__right, 1)); +} + +template +inline +rope<_CharT,_Alloc>& +operator+= (rope<_CharT,_Alloc>& __left, _CharT __right) { + __left.append(__right); + return __left; +} + +template +bool +operator< (const rope<_CharT,_Alloc>& __left, + const rope<_CharT,_Alloc>& __right) { + return __left.compare(__right) < 0; +} + +template +bool +operator== (const rope<_CharT,_Alloc>& __left, + const rope<_CharT,_Alloc>& __right) { + return __left.compare(__right) == 0; +} + +template +inline bool operator== (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x, + const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) { + return (__x._M_pos == __y._M_pos && __x._M_root == __y._M_root); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool +operator> (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool +operator<= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool +operator>= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { + return !(__x < __y); +} + +template +inline bool operator!= (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x, + const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) { + return !(__x == __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +#ifdef __STL_USE_NEW_IOSTREAMS + template + basic_ostream<_CharT, _Traits>& operator<< + (basic_ostream<_CharT, _Traits>& __o, + const rope<_CharT, _Alloc>& __r); +#else + template + ostream& operator<< (ostream& __o, const rope<_CharT, _Alloc>& __r); +#endif + +typedef rope crope; +typedef rope wrope; + +inline crope::reference __mutable_reference_at(crope& __c, size_t __i) +{ + return __c.mutable_reference_at(__i); +} + +inline wrope::reference __mutable_reference_at(wrope& __c, size_t __i) +{ + return __c.mutable_reference_at(__i); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline void swap(rope<_CharT,_Alloc>& __x, rope<_CharT,_Alloc>& __y) { + __x.swap(__y); +} + +#else + +inline void swap(crope __x, crope __y) { __x.swap(__y); } +inline void swap(wrope __x, wrope __y) { __x.swap(__y); } + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// Hash functions should probably be revisited later: +__STL_TEMPLATE_NULL struct hash +{ + size_t operator()(const crope& __str) const + { + size_t __size = __str.size(); + + if (0 == __size) return 0; + return 13*__str[0] + 5*__str[__size - 1] + __size; + } +}; + + +__STL_TEMPLATE_NULL struct hash +{ + size_t operator()(const wrope& __str) const + { + size_t __size = __str.size(); + + if (0 == __size) return 0; + return 13*__str[0] + 5*__str[__size - 1] + __size; + } +}; + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#endif + +__STL_END_NAMESPACE + +# include + +# endif /* __SGI_STL_INTERNAL_ROPE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_set.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_set.h new file mode 100644 index 0000000..1916d21 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_set.h @@ -0,0 +1,268 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_SET_H +#define __SGI_STL_INTERNAL_SET_H + +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +// Forward declarations of operators < and ==, needed for friend declaration. + +template ), + class _Alloc = __STL_DEFAULT_ALLOCATOR(_Key) > +class set; + +template +inline bool operator==(const set<_Key,_Compare,_Alloc>& __x, + const set<_Key,_Compare,_Alloc>& __y); + +template +inline bool operator<(const set<_Key,_Compare,_Alloc>& __x, + const set<_Key,_Compare,_Alloc>& __y); + + +template +class set { + // requirements: + + __STL_CLASS_REQUIRES(_Key, _Assignable); + __STL_CLASS_BINARY_FUNCTION_CHECK(_Compare, bool, _Key, _Key); + +public: + // typedefs: + + typedef _Key key_type; + typedef _Key value_type; + typedef _Compare key_compare; + typedef _Compare value_compare; +private: + typedef _Rb_tree, key_compare, _Alloc> _Rep_type; + _Rep_type _M_t; // red-black tree representing set +public: + typedef typename _Rep_type::const_pointer pointer; + typedef typename _Rep_type::const_pointer const_pointer; + typedef typename _Rep_type::const_reference reference; + typedef typename _Rep_type::const_reference const_reference; + typedef typename _Rep_type::const_iterator iterator; + typedef typename _Rep_type::const_iterator const_iterator; + typedef typename _Rep_type::const_reverse_iterator reverse_iterator; + typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; + typedef typename _Rep_type::size_type size_type; + typedef typename _Rep_type::difference_type difference_type; + typedef typename _Rep_type::allocator_type allocator_type; + + // allocation/deallocation + + set() : _M_t(_Compare(), allocator_type()) {} + explicit set(const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) {} + +#ifdef __STL_MEMBER_TEMPLATES + template + set(_InputIterator __first, _InputIterator __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_unique(__first, __last); } + + template + set(_InputIterator __first, _InputIterator __last, const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); } +#else + set(const value_type* __first, const value_type* __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_unique(__first, __last); } + + set(const value_type* __first, + const value_type* __last, const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); } + + set(const_iterator __first, const_iterator __last) + : _M_t(_Compare(), allocator_type()) + { _M_t.insert_unique(__first, __last); } + + set(const_iterator __first, const_iterator __last, const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); } +#endif /* __STL_MEMBER_TEMPLATES */ + + set(const set<_Key,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {} + set<_Key,_Compare,_Alloc>& operator=(const set<_Key, _Compare, _Alloc>& __x) + { + _M_t = __x._M_t; + return *this; + } + + // accessors: + + key_compare key_comp() const { return _M_t.key_comp(); } + value_compare value_comp() const { return _M_t.key_comp(); } + allocator_type get_allocator() const { return _M_t.get_allocator(); } + + iterator begin() const { return _M_t.begin(); } + iterator end() const { return _M_t.end(); } + reverse_iterator rbegin() const { return _M_t.rbegin(); } + reverse_iterator rend() const { return _M_t.rend(); } + bool empty() const { return _M_t.empty(); } + size_type size() const { return _M_t.size(); } + size_type max_size() const { return _M_t.max_size(); } + void swap(set<_Key,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); } + + // insert/erase + pair insert(const value_type& __x) { + pair __p = _M_t.insert_unique(__x); + return pair(__p.first, __p.second); + } + iterator insert(iterator __position, const value_type& __x) { + typedef typename _Rep_type::iterator _Rep_iterator; + return _M_t.insert_unique((_Rep_iterator&)__position, __x); + } +#ifdef __STL_MEMBER_TEMPLATES + template + void insert(_InputIterator __first, _InputIterator __last) { + _M_t.insert_unique(__first, __last); + } +#else + void insert(const_iterator __first, const_iterator __last) { + _M_t.insert_unique(__first, __last); + } + void insert(const value_type* __first, const value_type* __last) { + _M_t.insert_unique(__first, __last); + } +#endif /* __STL_MEMBER_TEMPLATES */ + void erase(iterator __position) { + typedef typename _Rep_type::iterator _Rep_iterator; + _M_t.erase((_Rep_iterator&)__position); + } + size_type erase(const key_type& __x) { + return _M_t.erase(__x); + } + void erase(iterator __first, iterator __last) { + typedef typename _Rep_type::iterator _Rep_iterator; + _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last); + } + void clear() { _M_t.clear(); } + + // set operations: + + iterator find(const key_type& __x) const { return _M_t.find(__x); } + size_type count(const key_type& __x) const { + return _M_t.find(__x) == _M_t.end() ? 0 : 1; + } + iterator lower_bound(const key_type& __x) const { + return _M_t.lower_bound(__x); + } + iterator upper_bound(const key_type& __x) const { + return _M_t.upper_bound(__x); + } + pair equal_range(const key_type& __x) const { + return _M_t.equal_range(__x); + } + +#ifdef __STL_TEMPLATE_FRIENDS + template + friend bool operator== (const set<_K1,_C1,_A1>&, const set<_K1,_C1,_A1>&); + template + friend bool operator< (const set<_K1,_C1,_A1>&, const set<_K1,_C1,_A1>&); +#else /* __STL_TEMPLATE_FRIENDS */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const set&, const set&); + friend bool __STD_QUALIFIER + operator< __STL_NULL_TMPL_ARGS (const set&, const set&); +#endif /* __STL_TEMPLATE_FRIENDS */ +}; + +template +inline bool operator==(const set<_Key,_Compare,_Alloc>& __x, + const set<_Key,_Compare,_Alloc>& __y) { + return __x._M_t == __y._M_t; +} + +template +inline bool operator<(const set<_Key,_Compare,_Alloc>& __x, + const set<_Key,_Compare,_Alloc>& __y) { + return __x._M_t < __y._M_t; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool operator!=(const set<_Key,_Compare,_Alloc>& __x, + const set<_Key,_Compare,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool operator>(const set<_Key,_Compare,_Alloc>& __x, + const set<_Key,_Compare,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool operator<=(const set<_Key,_Compare,_Alloc>& __x, + const set<_Key,_Compare,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool operator>=(const set<_Key,_Compare,_Alloc>& __x, + const set<_Key,_Compare,_Alloc>& __y) { + return !(__x < __y); +} + +template +inline void swap(set<_Key,_Compare,_Alloc>& __x, + set<_Key,_Compare,_Alloc>& __y) { + __x.swap(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_SET_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_slist.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_slist.h new file mode 100644 index 0000000..a748d1a --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_slist.h @@ -0,0 +1,1048 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_SLIST_H +#define __SGI_STL_INTERNAL_SLIST_H + +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +struct _Slist_node_base +{ + _Slist_node_base* _M_next; +}; + +inline _Slist_node_base* +__slist_make_link(_Slist_node_base* __prev_node, + _Slist_node_base* __new_node) +{ + __new_node->_M_next = __prev_node->_M_next; + __prev_node->_M_next = __new_node; + return __new_node; +} + +inline _Slist_node_base* +__slist_previous(_Slist_node_base* __head, + const _Slist_node_base* __node) +{ + while (__head && __head->_M_next != __node) + __head = __head->_M_next; + return __head; +} + +inline const _Slist_node_base* +__slist_previous(const _Slist_node_base* __head, + const _Slist_node_base* __node) +{ + while (__head && __head->_M_next != __node) + __head = __head->_M_next; + return __head; +} + +inline void __slist_splice_after(_Slist_node_base* __pos, + _Slist_node_base* __before_first, + _Slist_node_base* __before_last) +{ + if (__pos != __before_first && __pos != __before_last) { + _Slist_node_base* __first = __before_first->_M_next; + _Slist_node_base* __after = __pos->_M_next; + __before_first->_M_next = __before_last->_M_next; + __pos->_M_next = __first; + __before_last->_M_next = __after; + } +} + +inline void +__slist_splice_after(_Slist_node_base* __pos, _Slist_node_base* __head) +{ + _Slist_node_base* __before_last = __slist_previous(__head, 0); + if (__before_last != __head) { + _Slist_node_base* __after = __pos->_M_next; + __pos->_M_next = __head->_M_next; + __head->_M_next = 0; + __before_last->_M_next = __after; + } +} + +inline _Slist_node_base* __slist_reverse(_Slist_node_base* __node) +{ + _Slist_node_base* __result = __node; + __node = __node->_M_next; + __result->_M_next = 0; + while(__node) { + _Slist_node_base* __next = __node->_M_next; + __node->_M_next = __result; + __result = __node; + __node = __next; + } + return __result; +} + +inline size_t __slist_size(_Slist_node_base* __node) +{ + size_t __result = 0; + for ( ; __node != 0; __node = __node->_M_next) + ++__result; + return __result; +} + +template +struct _Slist_node : public _Slist_node_base +{ + _Tp _M_data; +}; + +struct _Slist_iterator_base +{ + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef forward_iterator_tag iterator_category; + + _Slist_node_base* _M_node; + + _Slist_iterator_base(_Slist_node_base* __x) : _M_node(__x) {} + void _M_incr() { _M_node = _M_node->_M_next; } + + bool operator==(const _Slist_iterator_base& __x) const { + return _M_node == __x._M_node; + } + bool operator!=(const _Slist_iterator_base& __x) const { + return _M_node != __x._M_node; + } +}; + +template +struct _Slist_iterator : public _Slist_iterator_base +{ + typedef _Slist_iterator<_Tp, _Tp&, _Tp*> iterator; + typedef _Slist_iterator<_Tp, const _Tp&, const _Tp*> const_iterator; + typedef _Slist_iterator<_Tp, _Ref, _Ptr> _Self; + + typedef _Tp value_type; + typedef _Ptr pointer; + typedef _Ref reference; + typedef _Slist_node<_Tp> _Node; + + _Slist_iterator(_Node* __x) : _Slist_iterator_base(__x) {} + _Slist_iterator() : _Slist_iterator_base(0) {} + _Slist_iterator(const iterator& __x) : _Slist_iterator_base(__x._M_node) {} + + reference operator*() const { return ((_Node*) _M_node)->_M_data; } +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return &(operator*()); } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + + _Self& operator++() + { + _M_incr(); + return *this; + } + _Self operator++(int) + { + _Self __tmp = *this; + _M_incr(); + return __tmp; + } +}; + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +inline ptrdiff_t* distance_type(const _Slist_iterator_base&) { + return 0; +} + +inline forward_iterator_tag iterator_category(const _Slist_iterator_base&) { + return forward_iterator_tag(); +} + +template +inline _Tp* value_type(const _Slist_iterator<_Tp, _Ref, _Ptr>&) { + return 0; +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +// Base class that encapsulates details of allocators. Three cases: +// an ordinary standard-conforming allocator, a standard-conforming +// allocator with no non-static data, and an SGI-style allocator. +// This complexity is necessary only because we're worrying about backward +// compatibility and because we want to avoid wasting storage on an +// allocator instance if it isn't necessary. + +#ifdef __STL_USE_STD_ALLOCATORS + +// Base for general standard-conforming allocators. +template +class _Slist_alloc_base { +public: + typedef typename _Alloc_traits<_Tp,_Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return _M_node_allocator; } + + _Slist_alloc_base(const allocator_type& __a) : _M_node_allocator(__a) {} + +protected: + _Slist_node<_Tp>* _M_get_node() + { return _M_node_allocator.allocate(1); } + void _M_put_node(_Slist_node<_Tp>* __p) + { _M_node_allocator.deallocate(__p, 1); } + +protected: + typename _Alloc_traits<_Slist_node<_Tp>,_Allocator>::allocator_type + _M_node_allocator; + _Slist_node_base _M_head; +}; + +// Specialization for instanceless allocators. +template +class _Slist_alloc_base<_Tp,_Allocator, true> { +public: + typedef typename _Alloc_traits<_Tp,_Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Slist_alloc_base(const allocator_type&) {} + +protected: + typedef typename _Alloc_traits<_Slist_node<_Tp>, _Allocator>::_Alloc_type + _Alloc_type; + _Slist_node<_Tp>* _M_get_node() { return _Alloc_type::allocate(1); } + void _M_put_node(_Slist_node<_Tp>* __p) { _Alloc_type::deallocate(__p, 1); } + +protected: + _Slist_node_base _M_head; +}; + + +template +struct _Slist_base + : public _Slist_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> +{ + typedef _Slist_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> + _Base; + typedef typename _Base::allocator_type allocator_type; + + _Slist_base(const allocator_type& __a) + : _Base(__a) { this->_M_head._M_next = 0; } + ~_Slist_base() { _M_erase_after(&this->_M_head, 0); } + +protected: + + _Slist_node_base* _M_erase_after(_Slist_node_base* __pos) + { + _Slist_node<_Tp>* __next = (_Slist_node<_Tp>*) (__pos->_M_next); + _Slist_node_base* __next_next = __next->_M_next; + __pos->_M_next = __next_next; + destroy(&__next->_M_data); + _M_put_node(__next); + return __next_next; + } + _Slist_node_base* _M_erase_after(_Slist_node_base*, _Slist_node_base*); +}; + +#else /* __STL_USE_STD_ALLOCATORS */ + +template +struct _Slist_base { + typedef _Alloc allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Slist_base(const allocator_type&) { _M_head._M_next = 0; } + ~_Slist_base() { _M_erase_after(&_M_head, 0); } + +protected: + typedef simple_alloc<_Slist_node<_Tp>, _Alloc> _Alloc_type; + _Slist_node<_Tp>* _M_get_node() { return _Alloc_type::allocate(1); } + void _M_put_node(_Slist_node<_Tp>* __p) { _Alloc_type::deallocate(__p, 1); } + + _Slist_node_base* _M_erase_after(_Slist_node_base* __pos) + { + _Slist_node<_Tp>* __next = (_Slist_node<_Tp>*) (__pos->_M_next); + _Slist_node_base* __next_next = __next->_M_next; + __pos->_M_next = __next_next; + destroy(&__next->_M_data); + _M_put_node(__next); + return __next_next; + } + _Slist_node_base* _M_erase_after(_Slist_node_base*, _Slist_node_base*); + +protected: + _Slist_node_base _M_head; +}; + +#endif /* __STL_USE_STD_ALLOCATORS */ + +template +_Slist_node_base* +_Slist_base<_Tp,_Alloc>::_M_erase_after(_Slist_node_base* __before_first, + _Slist_node_base* __last_node) { + _Slist_node<_Tp>* __cur = (_Slist_node<_Tp>*) (__before_first->_M_next); + while (__cur != __last_node) { + _Slist_node<_Tp>* __tmp = __cur; + __cur = (_Slist_node<_Tp>*) __cur->_M_next; + destroy(&__tmp->_M_data); + _M_put_node(__tmp); + } + __before_first->_M_next = __last_node; + return __last_node; +} + +template +class slist : private _Slist_base<_Tp,_Alloc> +{ + // requirements: + + __STL_CLASS_REQUIRES(_Tp, _Assignable); + +private: + typedef _Slist_base<_Tp,_Alloc> _Base; +public: + typedef _Tp value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + typedef _Slist_iterator<_Tp, _Tp&, _Tp*> iterator; + typedef _Slist_iterator<_Tp, const _Tp&, const _Tp*> const_iterator; + + typedef typename _Base::allocator_type allocator_type; + allocator_type get_allocator() const { return _Base::get_allocator(); } + +private: + typedef _Slist_node<_Tp> _Node; + typedef _Slist_node_base _Node_base; + typedef _Slist_iterator_base _Iterator_base; + + _Node* _M_create_node(const value_type& __x) { + _Node* __node = this->_M_get_node(); + __STL_TRY { + construct(&__node->_M_data, __x); + __node->_M_next = 0; + } + __STL_UNWIND(this->_M_put_node(__node)); + return __node; + } + + _Node* _M_create_node() { + _Node* __node = this->_M_get_node(); + __STL_TRY { + construct(&__node->_M_data); + __node->_M_next = 0; + } + __STL_UNWIND(this->_M_put_node(__node)); + return __node; + } + +public: + explicit slist(const allocator_type& __a = allocator_type()) : _Base(__a) {} + + slist(size_type __n, const value_type& __x, + const allocator_type& __a = allocator_type()) : _Base(__a) + { _M_insert_after_fill(&this->_M_head, __n, __x); } + + explicit slist(size_type __n) : _Base(allocator_type()) + { _M_insert_after_fill(&this->_M_head, __n, value_type()); } + +#ifdef __STL_MEMBER_TEMPLATES + // We don't need any dispatching tricks here, because _M_insert_after_range + // already does them. + template + slist(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) : _Base(__a) + { _M_insert_after_range(&this->_M_head, __first, __last); } + +#else /* __STL_MEMBER_TEMPLATES */ + slist(const_iterator __first, const_iterator __last, + const allocator_type& __a = allocator_type()) : _Base(__a) + { _M_insert_after_range(&this->_M_head, __first, __last); } + slist(const value_type* __first, const value_type* __last, + const allocator_type& __a = allocator_type()) : _Base(__a) + { _M_insert_after_range(&this->_M_head, __first, __last); } +#endif /* __STL_MEMBER_TEMPLATES */ + + slist(const slist& __x) : _Base(__x.get_allocator()) + { _M_insert_after_range(&this->_M_head, __x.begin(), __x.end()); } + + slist& operator= (const slist& __x); + + ~slist() {} + +public: + // assign(), a generalized assignment member function. Two + // versions: one that takes a count, and one that takes a range. + // The range version is a member template, so we dispatch on whether + // or not the type is an integer. + + void assign(size_type __n, const _Tp& __val) + { _M_fill_assign(__n, __val); } + + void _M_fill_assign(size_type __n, const _Tp& __val); + + +#ifdef __STL_MEMBER_TEMPLATES + + template + void assign(_InputIterator __first, _InputIterator __last) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_assign_dispatch(__first, __last, _Integral()); + } + + template + void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type) + { _M_fill_assign((size_type) __n, (_Tp) __val); } + + template + void _M_assign_dispatch(_InputIterator __first, _InputIterator __last, + __false_type); + +#endif /* __STL_MEMBER_TEMPLATES */ + +public: + + iterator begin() { return iterator((_Node*)this->_M_head._M_next); } + const_iterator begin() const + { return const_iterator((_Node*)this->_M_head._M_next);} + + iterator end() { return iterator(0); } + const_iterator end() const { return const_iterator(0); } + + // Experimental new feature: before_begin() returns a + // non-dereferenceable iterator that, when incremented, yields + // begin(). This iterator may be used as the argument to + // insert_after, erase_after, etc. Note that even for an empty + // slist, before_begin() is not the same iterator as end(). It + // is always necessary to increment before_begin() at least once to + // obtain end(). + iterator before_begin() { return iterator((_Node*) &this->_M_head); } + const_iterator before_begin() const + { return const_iterator((_Node*) &this->_M_head); } + + size_type size() const { return __slist_size(this->_M_head._M_next); } + + size_type max_size() const { return size_type(-1); } + + bool empty() const { return this->_M_head._M_next == 0; } + + void swap(slist& __x) + { __STD::swap(this->_M_head._M_next, __x._M_head._M_next); } + +public: + + reference front() { return ((_Node*) this->_M_head._M_next)->_M_data; } + const_reference front() const + { return ((_Node*) this->_M_head._M_next)->_M_data; } + void push_front(const value_type& __x) { + __slist_make_link(&this->_M_head, _M_create_node(__x)); + } + void push_front() { __slist_make_link(&this->_M_head, _M_create_node()); } + void pop_front() { + _Node* __node = (_Node*) this->_M_head._M_next; + this->_M_head._M_next = __node->_M_next; + destroy(&__node->_M_data); + this->_M_put_node(__node); + } + + iterator previous(const_iterator __pos) { + return iterator((_Node*) __slist_previous(&this->_M_head, __pos._M_node)); + } + const_iterator previous(const_iterator __pos) const { + return const_iterator((_Node*) __slist_previous(&this->_M_head, + __pos._M_node)); + } + +private: + _Node* _M_insert_after(_Node_base* __pos, const value_type& __x) { + return (_Node*) (__slist_make_link(__pos, _M_create_node(__x))); + } + + _Node* _M_insert_after(_Node_base* __pos) { + return (_Node*) (__slist_make_link(__pos, _M_create_node())); + } + + void _M_insert_after_fill(_Node_base* __pos, + size_type __n, const value_type& __x) { + for (size_type __i = 0; __i < __n; ++__i) + __pos = __slist_make_link(__pos, _M_create_node(__x)); + } + +#ifdef __STL_MEMBER_TEMPLATES + + // Check whether it's an integral type. If so, it's not an iterator. + template + void _M_insert_after_range(_Node_base* __pos, + _InIter __first, _InIter __last) { + typedef typename _Is_integer<_InIter>::_Integral _Integral; + _M_insert_after_range(__pos, __first, __last, _Integral()); + } + + template + void _M_insert_after_range(_Node_base* __pos, _Integer __n, _Integer __x, + __true_type) { + _M_insert_after_fill(__pos, __n, __x); + } + + template + void _M_insert_after_range(_Node_base* __pos, + _InIter __first, _InIter __last, + __false_type) { + while (__first != __last) { + __pos = __slist_make_link(__pos, _M_create_node(*__first)); + ++__first; + } + } + +#else /* __STL_MEMBER_TEMPLATES */ + + void _M_insert_after_range(_Node_base* __pos, + const_iterator __first, const_iterator __last) { + while (__first != __last) { + __pos = __slist_make_link(__pos, _M_create_node(*__first)); + ++__first; + } + } + void _M_insert_after_range(_Node_base* __pos, + const value_type* __first, + const value_type* __last) { + while (__first != __last) { + __pos = __slist_make_link(__pos, _M_create_node(*__first)); + ++__first; + } + } + +#endif /* __STL_MEMBER_TEMPLATES */ + +public: + + iterator insert_after(iterator __pos, const value_type& __x) { + return iterator(_M_insert_after(__pos._M_node, __x)); + } + + iterator insert_after(iterator __pos) { + return insert_after(__pos, value_type()); + } + + void insert_after(iterator __pos, size_type __n, const value_type& __x) { + _M_insert_after_fill(__pos._M_node, __n, __x); + } + +#ifdef __STL_MEMBER_TEMPLATES + + // We don't need any dispatching tricks here, because _M_insert_after_range + // already does them. + template + void insert_after(iterator __pos, _InIter __first, _InIter __last) { + _M_insert_after_range(__pos._M_node, __first, __last); + } + +#else /* __STL_MEMBER_TEMPLATES */ + + void insert_after(iterator __pos, + const_iterator __first, const_iterator __last) { + _M_insert_after_range(__pos._M_node, __first, __last); + } + void insert_after(iterator __pos, + const value_type* __first, const value_type* __last) { + _M_insert_after_range(__pos._M_node, __first, __last); + } + +#endif /* __STL_MEMBER_TEMPLATES */ + + iterator insert(iterator __pos, const value_type& __x) { + return iterator(_M_insert_after(__slist_previous(&this->_M_head, + __pos._M_node), + __x)); + } + + iterator insert(iterator __pos) { + return iterator(_M_insert_after(__slist_previous(&this->_M_head, + __pos._M_node), + value_type())); + } + + void insert(iterator __pos, size_type __n, const value_type& __x) { + _M_insert_after_fill(__slist_previous(&this->_M_head, __pos._M_node), + __n, __x); + } + +#ifdef __STL_MEMBER_TEMPLATES + + // We don't need any dispatching tricks here, because _M_insert_after_range + // already does them. + template + void insert(iterator __pos, _InIter __first, _InIter __last) { + _M_insert_after_range(__slist_previous(&this->_M_head, __pos._M_node), + __first, __last); + } + +#else /* __STL_MEMBER_TEMPLATES */ + + void insert(iterator __pos, const_iterator __first, const_iterator __last) { + _M_insert_after_range(__slist_previous(&this->_M_head, __pos._M_node), + __first, __last); + } + void insert(iterator __pos, const value_type* __first, + const value_type* __last) { + _M_insert_after_range(__slist_previous(&this->_M_head, __pos._M_node), + __first, __last); + } + +#endif /* __STL_MEMBER_TEMPLATES */ + + +public: + iterator erase_after(iterator __pos) { + return iterator((_Node*) this->_M_erase_after(__pos._M_node)); + } + iterator erase_after(iterator __before_first, iterator __last) { + return iterator((_Node*) this->_M_erase_after(__before_first._M_node, + __last._M_node)); + } + + iterator erase(iterator __pos) { + return (_Node*) this->_M_erase_after(__slist_previous(&this->_M_head, + __pos._M_node)); + } + iterator erase(iterator __first, iterator __last) { + return (_Node*) this->_M_erase_after( + __slist_previous(&this->_M_head, __first._M_node), __last._M_node); + } + + void resize(size_type new_size, const _Tp& __x); + void resize(size_type new_size) { resize(new_size, _Tp()); } + void clear() { this->_M_erase_after(&this->_M_head, 0); } + +public: + // Moves the range [__before_first + 1, __before_last + 1) to *this, + // inserting it immediately after __pos. This is constant time. + void splice_after(iterator __pos, + iterator __before_first, iterator __before_last) + { + if (__before_first != __before_last) + __slist_splice_after(__pos._M_node, __before_first._M_node, + __before_last._M_node); + } + + // Moves the element that follows __prev to *this, inserting it immediately + // after __pos. This is constant time. + void splice_after(iterator __pos, iterator __prev) + { + __slist_splice_after(__pos._M_node, + __prev._M_node, __prev._M_node->_M_next); + } + + + // Removes all of the elements from the list __x to *this, inserting + // them immediately after __pos. __x must not be *this. Complexity: + // linear in __x.size(). + void splice_after(iterator __pos, slist& __x) + { + __slist_splice_after(__pos._M_node, &__x._M_head); + } + + // Linear in distance(begin(), __pos), and linear in __x.size(). + void splice(iterator __pos, slist& __x) { + if (__x._M_head._M_next) + __slist_splice_after(__slist_previous(&this->_M_head, __pos._M_node), + &__x._M_head, __slist_previous(&__x._M_head, 0)); + } + + // Linear in distance(begin(), __pos), and in distance(__x.begin(), __i). + void splice(iterator __pos, slist& __x, iterator __i) { + __slist_splice_after(__slist_previous(&this->_M_head, __pos._M_node), + __slist_previous(&__x._M_head, __i._M_node), + __i._M_node); + } + + // Linear in distance(begin(), __pos), in distance(__x.begin(), __first), + // and in distance(__first, __last). + void splice(iterator __pos, slist& __x, iterator __first, iterator __last) + { + if (__first != __last) + __slist_splice_after(__slist_previous(&this->_M_head, __pos._M_node), + __slist_previous(&__x._M_head, __first._M_node), + __slist_previous(__first._M_node, __last._M_node)); + } + +public: + void reverse() { + if (this->_M_head._M_next) + this->_M_head._M_next = __slist_reverse(this->_M_head._M_next); + } + + void remove(const _Tp& __val); + void unique(); + void merge(slist& __x); + void sort(); + +#ifdef __STL_MEMBER_TEMPLATES + template + void remove_if(_Predicate __pred); + + template + void unique(_BinaryPredicate __pred); + + template + void merge(slist&, _StrictWeakOrdering); + + template + void sort(_StrictWeakOrdering __comp); +#endif /* __STL_MEMBER_TEMPLATES */ +}; + +template +slist<_Tp,_Alloc>& slist<_Tp,_Alloc>::operator=(const slist<_Tp,_Alloc>& __x) +{ + if (&__x != this) { + _Node_base* __p1 = &this->_M_head; + _Node* __n1 = (_Node*) this->_M_head._M_next; + const _Node* __n2 = (const _Node*) __x._M_head._M_next; + while (__n1 && __n2) { + __n1->_M_data = __n2->_M_data; + __p1 = __n1; + __n1 = (_Node*) __n1->_M_next; + __n2 = (const _Node*) __n2->_M_next; + } + if (__n2 == 0) + this->_M_erase_after(__p1, 0); + else + _M_insert_after_range(__p1, const_iterator((_Node*)__n2), + const_iterator(0)); + } + return *this; +} + +template +void slist<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) { + _Node_base* __prev = &this->_M_head; + _Node* __node = (_Node*) this->_M_head._M_next; + for ( ; __node != 0 && __n > 0 ; --__n) { + __node->_M_data = __val; + __prev = __node; + __node = (_Node*) __node->_M_next; + } + if (__n > 0) + _M_insert_after_fill(__prev, __n, __val); + else + this->_M_erase_after(__prev, 0); +} + +#ifdef __STL_MEMBER_TEMPLATES + +template template +void +slist<_Tp, _Alloc>::_M_assign_dispatch(_InputIter __first, _InputIter __last, + __false_type) +{ + _Node_base* __prev = &this->_M_head; + _Node* __node = (_Node*) this->_M_head._M_next; + while (__node != 0 && __first != __last) { + __node->_M_data = *__first; + __prev = __node; + __node = (_Node*) __node->_M_next; + ++__first; + } + if (__first != __last) + _M_insert_after_range(__prev, __first, __last); + else + this->_M_erase_after(__prev, 0); +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +inline bool +operator==(const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2) +{ + typedef typename slist<_Tp,_Alloc>::const_iterator const_iterator; + const_iterator __end1 = _SL1.end(); + const_iterator __end2 = _SL2.end(); + + const_iterator __i1 = _SL1.begin(); + const_iterator __i2 = _SL2.begin(); + while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) { + ++__i1; + ++__i2; + } + return __i1 == __end1 && __i2 == __end2; +} + + +template +inline bool +operator<(const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2) +{ + return lexicographical_compare(_SL1.begin(), _SL1.end(), + _SL2.begin(), _SL2.end()); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!=(const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2) { + return !(_SL1 == _SL2); +} + +template +inline bool +operator>(const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2) { + return _SL2 < _SL1; +} + +template +inline bool +operator<=(const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2) { + return !(_SL2 < _SL1); +} + +template +inline bool +operator>=(const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2) { + return !(_SL1 < _SL2); +} + +template +inline void swap(slist<_Tp,_Alloc>& __x, slist<_Tp,_Alloc>& __y) { + __x.swap(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + + +template +void slist<_Tp,_Alloc>::resize(size_type __len, const _Tp& __x) +{ + _Node_base* __cur = &this->_M_head; + while (__cur->_M_next != 0 && __len > 0) { + --__len; + __cur = __cur->_M_next; + } + if (__cur->_M_next) + this->_M_erase_after(__cur, 0); + else + _M_insert_after_fill(__cur, __len, __x); +} + +template +void slist<_Tp,_Alloc>::remove(const _Tp& __val) +{ + _Node_base* __cur = &this->_M_head; + while (__cur && __cur->_M_next) { + if (((_Node*) __cur->_M_next)->_M_data == __val) + this->_M_erase_after(__cur); + else + __cur = __cur->_M_next; + } +} + +template +void slist<_Tp,_Alloc>::unique() +{ + _Node_base* __cur = this->_M_head._M_next; + if (__cur) { + while (__cur->_M_next) { + if (((_Node*)__cur)->_M_data == + ((_Node*)(__cur->_M_next))->_M_data) + this->_M_erase_after(__cur); + else + __cur = __cur->_M_next; + } + } +} + +template +void slist<_Tp,_Alloc>::merge(slist<_Tp,_Alloc>& __x) +{ + _Node_base* __n1 = &this->_M_head; + while (__n1->_M_next && __x._M_head._M_next) { + if (((_Node*) __x._M_head._M_next)->_M_data < + ((_Node*) __n1->_M_next)->_M_data) + __slist_splice_after(__n1, &__x._M_head, __x._M_head._M_next); + __n1 = __n1->_M_next; + } + if (__x._M_head._M_next) { + __n1->_M_next = __x._M_head._M_next; + __x._M_head._M_next = 0; + } +} + +template +void slist<_Tp,_Alloc>::sort() +{ + if (this->_M_head._M_next && this->_M_head._M_next->_M_next) { + slist __carry; + slist __counter[64]; + int __fill = 0; + while (!empty()) { + __slist_splice_after(&__carry._M_head, + &this->_M_head, this->_M_head._M_next); + int __i = 0; + while (__i < __fill && !__counter[__i].empty()) { + __counter[__i].merge(__carry); + __carry.swap(__counter[__i]); + ++__i; + } + __carry.swap(__counter[__i]); + if (__i == __fill) + ++__fill; + } + + for (int __i = 1; __i < __fill; ++__i) + __counter[__i].merge(__counter[__i-1]); + this->swap(__counter[__fill-1]); + } +} + +#ifdef __STL_MEMBER_TEMPLATES + +template +template +void slist<_Tp,_Alloc>::remove_if(_Predicate __pred) +{ + _Node_base* __cur = &this->_M_head; + while (__cur->_M_next) { + if (__pred(((_Node*) __cur->_M_next)->_M_data)) + this->_M_erase_after(__cur); + else + __cur = __cur->_M_next; + } +} + +template template +void slist<_Tp,_Alloc>::unique(_BinaryPredicate __pred) +{ + _Node* __cur = (_Node*) this->_M_head._M_next; + if (__cur) { + while (__cur->_M_next) { + if (__pred(((_Node*)__cur)->_M_data, + ((_Node*)(__cur->_M_next))->_M_data)) + this->_M_erase_after(__cur); + else + __cur = (_Node*) __cur->_M_next; + } + } +} + +template template +void slist<_Tp,_Alloc>::merge(slist<_Tp,_Alloc>& __x, + _StrictWeakOrdering __comp) +{ + _Node_base* __n1 = &this->_M_head; + while (__n1->_M_next && __x._M_head._M_next) { + if (__comp(((_Node*) __x._M_head._M_next)->_M_data, + ((_Node*) __n1->_M_next)->_M_data)) + __slist_splice_after(__n1, &__x._M_head, __x._M_head._M_next); + __n1 = __n1->_M_next; + } + if (__x._M_head._M_next) { + __n1->_M_next = __x._M_head._M_next; + __x._M_head._M_next = 0; + } +} + +template template +void slist<_Tp,_Alloc>::sort(_StrictWeakOrdering __comp) +{ + if (this->_M_head._M_next && this->_M_head._M_next->_M_next) { + slist __carry; + slist __counter[64]; + int __fill = 0; + while (!empty()) { + __slist_splice_after(&__carry._M_head, + &this->_M_head, this->_M_head._M_next); + int __i = 0; + while (__i < __fill && !__counter[__i].empty()) { + __counter[__i].merge(__carry, __comp); + __carry.swap(__counter[__i]); + ++__i; + } + __carry.swap(__counter[__i]); + if (__i == __fill) + ++__fill; + } + + for (int __i = 1; __i < __fill; ++__i) + __counter[__i].merge(__counter[__i-1], __comp); + this->swap(__counter[__fill-1]); + } +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +// Specialization of insert_iterator so that insertions will be constant +// time rather than linear time. + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +class insert_iterator > { +protected: + typedef slist<_Tp, _Alloc> _Container; + _Container* container; + typename _Container::iterator iter; +public: + typedef _Container container_type; + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + insert_iterator(_Container& __x, typename _Container::iterator __i) + : container(&__x) { + if (__i == __x.begin()) + iter = __x.before_begin(); + else + iter = __x.previous(__i); + } + + insert_iterator<_Container>& + operator=(const typename _Container::value_type& __value) { + iter = container->insert_after(iter, __value); + return *this; + } + insert_iterator<_Container>& operator*() { return *this; } + insert_iterator<_Container>& operator++() { return *this; } + insert_iterator<_Container>& operator++(int) { return *this; } +}; + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_SLIST_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_stack.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_stack.h new file mode 100644 index 0000000..0693e57 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_stack.h @@ -0,0 +1,143 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_STACK_H +#define __SGI_STL_INTERNAL_STACK_H + +#include + +__STL_BEGIN_NAMESPACE + +// Forward declarations of operators == and <, needed for friend declaration. + +template ) > +class stack; + +template +bool operator==(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y); + +template +bool operator<(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y); + + +template +class stack { + + // requirements: + + __STL_CLASS_REQUIRES(_Tp, _Assignable); + __STL_CLASS_REQUIRES(_Sequence, _BackInsertionSequence); + typedef typename _Sequence::value_type _Sequence_value_type; + __STL_CLASS_REQUIRES_SAME_TYPE(_Tp, _Sequence_value_type); + + +#ifdef __STL_MEMBER_TEMPLATES + template + friend bool operator== (const stack<_Tp1, _Seq1>&, + const stack<_Tp1, _Seq1>&); + template + friend bool operator< (const stack<_Tp1, _Seq1>&, + const stack<_Tp1, _Seq1>&); +#else /* __STL_MEMBER_TEMPLATES */ + friend bool __STD_QUALIFIER + operator== __STL_NULL_TMPL_ARGS (const stack&, const stack&); + friend bool __STD_QUALIFIER + operator< __STL_NULL_TMPL_ARGS (const stack&, const stack&); +#endif /* __STL_MEMBER_TEMPLATES */ + +public: + typedef typename _Sequence::value_type value_type; + typedef typename _Sequence::size_type size_type; + typedef _Sequence container_type; + + typedef typename _Sequence::reference reference; + typedef typename _Sequence::const_reference const_reference; +protected: + _Sequence c; +public: + stack() : c() {} + explicit stack(const _Sequence& __s) : c(__s) {} + + bool empty() const { return c.empty(); } + size_type size() const { return c.size(); } + reference top() { return c.back(); } + const_reference top() const { return c.back(); } + void push(const value_type& __x) { c.push_back(__x); } + void pop() { c.pop_back(); } +}; + +template +bool operator==(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) +{ + return __x.c == __y.c; +} + +template +bool operator<(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) +{ + return __x.c < __y.c; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +bool operator!=(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) +{ + return !(__x == __y); +} + +template +bool operator>(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) +{ + return __y < __x; +} + +template +bool operator<=(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) +{ + return !(__y < __x); +} + +template +bool operator>=(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) +{ + return !(__x < __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_STACK_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_string_fwd.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_string_fwd.h new file mode 100644 index 0000000..8e59de7 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_string_fwd.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_STRING_FWD_H +#define __SGI_STL_STRING_FWD_H + +#include +#include +#include +#include + +__STL_BEGIN_NAMESPACE + +template , + class _Alloc = __STL_DEFAULT_ALLOCATOR(_CharT) > +class basic_string; + +typedef basic_string string; +typedef basic_string wstring; + +static const char* __get_c_string(const string&); + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_STRING_FWD_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_tempbuf.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_tempbuf.h new file mode 100644 index 0000000..0fc68d6 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_tempbuf.h @@ -0,0 +1,162 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_TEMPBUF_H +#define __SGI_STL_INTERNAL_TEMPBUF_H + + +__STL_BEGIN_NAMESPACE + +template +pair<_Tp*, ptrdiff_t> +__get_temporary_buffer(ptrdiff_t __len, _Tp*) +{ + if (__len > ptrdiff_t(INT_MAX / sizeof(_Tp))) + __len = INT_MAX / sizeof(_Tp); + + while (__len > 0) { + _Tp* __tmp = (_Tp*) malloc((size_t)__len * sizeof(_Tp)); + if (__tmp != 0) + return pair<_Tp*, ptrdiff_t>(__tmp, __len); + __len /= 2; + } + + return pair<_Tp*, ptrdiff_t>((_Tp*)0, 0); +} + +#ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS + +template +inline pair<_Tp*, ptrdiff_t> get_temporary_buffer(ptrdiff_t __len) { + return __get_temporary_buffer(__len, (_Tp*) 0); +} + +#endif /* __STL_EXPLICIT_FUNCTION_TMPL_ARGS */ + +// This overload is not required by the standard; it is an extension. +// It is supported for backward compatibility with the HP STL, and +// because not all compilers support the language feature (explicit +// function template arguments) that is required for the standard +// version of get_temporary_buffer. +template +inline pair<_Tp*, ptrdiff_t> get_temporary_buffer(ptrdiff_t __len, _Tp*) { + return __get_temporary_buffer(__len, (_Tp*) 0); +} + +template +void return_temporary_buffer(_Tp* __p) { + free(__p); +} + +template +class _Temporary_buffer { +private: + ptrdiff_t _M_original_len; + ptrdiff_t _M_len; + _Tp* _M_buffer; + + void _M_allocate_buffer() { + _M_original_len = _M_len; + _M_buffer = 0; + + if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_Tp))) + _M_len = INT_MAX / sizeof(_Tp); + + while (_M_len > 0) { + _M_buffer = (_Tp*) malloc(_M_len * sizeof(_Tp)); + if (_M_buffer) + break; + _M_len /= 2; + } + } + + void _M_initialize_buffer(const _Tp&, __true_type) {} + void _M_initialize_buffer(const _Tp& val, __false_type) { + uninitialized_fill_n(_M_buffer, _M_len, val); + } + +public: + ptrdiff_t size() const { return _M_len; } + ptrdiff_t requested_size() const { return _M_original_len; } + _Tp* begin() { return _M_buffer; } + _Tp* end() { return _M_buffer + _M_len; } + + _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) { + // Workaround for a __type_traits bug in the pre-7.3 compiler. +# if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION < 730 + typedef typename __type_traits<_Tp>::is_POD_type _Trivial; +# else + typedef typename __type_traits<_Tp>::has_trivial_default_constructor + _Trivial; +# endif + + __STL_TRY { + _M_len = 0; + distance(__first, __last, _M_len); + _M_allocate_buffer(); + if (_M_len > 0) + _M_initialize_buffer(*__first, _Trivial()); + } + __STL_UNWIND(free(_M_buffer); _M_buffer = 0; _M_len = 0); + } + + ~_Temporary_buffer() { + destroy(_M_buffer, _M_buffer + _M_len); + free(_M_buffer); + } + +private: + // Disable copy constructor and assignment operator. + _Temporary_buffer(const _Temporary_buffer&) {} + void operator=(const _Temporary_buffer&) {} +}; + +// Class temporary_buffer is not part of the standard. It is an extension. + +template ::value_type +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + > +struct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _Tp> +{ + temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) + : _Temporary_buffer<_ForwardIterator, _Tp>(__first, __last) {} + ~temporary_buffer() {} +}; + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_TEMPBUF_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_threads.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_threads.h new file mode 100644 index 0000000..4b0a643 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_threads.h @@ -0,0 +1,374 @@ +/* + * Copyright (c) 1997-1999 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +// WARNING: This is an internal header file, included by other C++ +// standard library headers. You should not attempt to use this header +// file directly. +// Stl_config.h should be included before this file. + +#ifndef __SGI_STL_INTERNAL_THREADS_H +#define __SGI_STL_INTERNAL_THREADS_H + +// Supported threading models are native SGI, pthreads, uithreads +// (similar to pthreads, but based on an earlier draft of the Posix +// threads standard), and Win32 threads. Uithread support by Jochen +// Schlick, 1999. + +#if defined(__STL_SGI_THREADS) +#include +#include +#elif defined(__STL_PTHREADS) +#include +#elif defined(__STL_UITHREADS) +#include +#include +#elif defined(__STL_WIN32THREADS) +#include +#endif + +__STL_BEGIN_NAMESPACE + + +// Class _Refcount_Base provides a type, _RC_t, a data member, +// _M_ref_count, and member functions _M_incr and _M_decr, which perform +// atomic preincrement/predecrement. The constructor initializes +// _M_ref_count. + +// Hack for SGI o32 compilers. +#if defined(__STL_SGI_THREADS) && !defined(__add_and_fetch) && \ + (__mips < 3 || !(defined (_ABIN32) || defined(_ABI64))) +# define __add_and_fetch(__l,__v) add_then_test((unsigned long*)__l,__v) +# define __test_and_set(__l,__v) test_and_set(__l,__v) +#endif /* o32 */ + +struct _Refcount_Base +{ + // The type _RC_t +# ifdef __STL_WIN32THREADS + typedef long _RC_t; +# else + typedef size_t _RC_t; +#endif + + // The data member _M_ref_count + volatile _RC_t _M_ref_count; + + // Constructor +# ifdef __STL_PTHREADS + pthread_mutex_t _M_ref_count_lock; + _Refcount_Base(_RC_t __n) : _M_ref_count(__n) + { pthread_mutex_init(&_M_ref_count_lock, 0); } +# elif defined(__STL_UITHREADS) + mutex_t _M_ref_count_lock; + _Refcount_Base(_RC_t __n) : _M_ref_count(__n) + { mutex_init(&_M_ref_count_lock, USYNC_THREAD, 0); } +# else + _Refcount_Base(_RC_t __n) : _M_ref_count(__n) {} +# endif + + // _M_incr and _M_decr +# ifdef __STL_SGI_THREADS + void _M_incr() { __add_and_fetch(&_M_ref_count, 1); } + _RC_t _M_decr() { return __add_and_fetch(&_M_ref_count, (size_t) -1); } +# elif defined (__STL_WIN32THREADS) + void _M_incr() { InterlockedIncrement((_RC_t*)&_M_ref_count); } + _RC_t _M_decr() { return InterlockedDecrement((_RC_t*)&_M_ref_count); } +# elif defined(__STL_PTHREADS) + void _M_incr() { + pthread_mutex_lock(&_M_ref_count_lock); + ++_M_ref_count; + pthread_mutex_unlock(&_M_ref_count_lock); + } + _RC_t _M_decr() { + pthread_mutex_lock(&_M_ref_count_lock); + volatile _RC_t __tmp = --_M_ref_count; + pthread_mutex_unlock(&_M_ref_count_lock); + return __tmp; + } +# elif defined(__STL_UITHREADS) + void _M_incr() { + mutex_lock(&_M_ref_count_lock); + ++_M_ref_count; + mutex_unlock(&_M_ref_count_lock); + } + _RC_t _M_decr() { + mutex_lock(&_M_ref_count_lock); + /*volatile*/ _RC_t __tmp = --_M_ref_count; + mutex_unlock(&_M_ref_count_lock); + return __tmp; + } +# else /* No threads */ + void _M_incr() { ++_M_ref_count; } + _RC_t _M_decr() { return --_M_ref_count; } +# endif +}; + +// Atomic swap on unsigned long +// This is guaranteed to behave as though it were atomic only if all +// possibly concurrent updates use _Atomic_swap. +// In some cases the operation is emulated with a lock. +# ifdef __STL_SGI_THREADS + inline unsigned long _Atomic_swap(unsigned long * __p, unsigned long __q) { +# if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64)) + return test_and_set(__p, __q); +# else + return __test_and_set(__p, (unsigned long)__q); +# endif + } +# elif defined(__STL_WIN32THREADS) + inline unsigned long _Atomic_swap(unsigned long * __p, unsigned long __q) { + return (unsigned long) InterlockedExchange((LPLONG)__p, (LONG)__q); + } +# elif defined(__STL_PTHREADS) + // We use a template here only to get a unique initialized instance. + template + struct _Swap_lock_struct { + static pthread_mutex_t _S_swap_lock; + }; + + template + pthread_mutex_t + _Swap_lock_struct<__dummy>::_S_swap_lock = PTHREAD_MUTEX_INITIALIZER; + + // This should be portable, but performance is expected + // to be quite awful. This really needs platform specific + // code. + inline unsigned long _Atomic_swap(unsigned long * __p, unsigned long __q) { + pthread_mutex_lock(&_Swap_lock_struct<0>::_S_swap_lock); + unsigned long __result = *__p; + *__p = __q; + pthread_mutex_unlock(&_Swap_lock_struct<0>::_S_swap_lock); + return __result; + } +# elif defined(__STL_UITHREADS) + // We use a template here only to get a unique initialized instance. + template + struct _Swap_lock_struct { + static mutex_t _S_swap_lock; + }; + + template + mutex_t + _Swap_lock_struct<__dummy>::_S_swap_lock = DEFAULTMUTEX; + + // This should be portable, but performance is expected + // to be quite awful. This really needs platform specific + // code. + inline unsigned long _Atomic_swap(unsigned long * __p, unsigned long __q) { + mutex_lock(&_Swap_lock_struct<0>::_S_swap_lock); + unsigned long __result = *__p; + *__p = __q; + mutex_unlock(&_Swap_lock_struct<0>::_S_swap_lock); + return __result; + } +# elif defined (__STL_SOLARIS_THREADS) + // any better solutions ? + // We use a template here only to get a unique initialized instance. + template + struct _Swap_lock_struct { + static mutex_t _S_swap_lock; + }; + +# if ( __STL_STATIC_TEMPLATE_DATA > 0 ) + template + mutex_t + _Swap_lock_struct<__dummy>::_S_swap_lock = DEFAULTMUTEX; +# else + __DECLARE_INSTANCE(mutex_t, _Swap_lock_struct<__dummy>::_S_swap_lock, + =DEFAULTMUTEX); +# endif /* ( __STL_STATIC_TEMPLATE_DATA > 0 ) */ + + // This should be portable, but performance is expected + // to be quite awful. This really needs platform specific + // code. + inline unsigned long _Atomic_swap(unsigned long * __p, unsigned long __q) { + mutex_lock(&_Swap_lock_struct<0>::_S_swap_lock); + unsigned long __result = *__p; + *__p = __q; + mutex_unlock(&_Swap_lock_struct<0>::_S_swap_lock); + return __result; + } +# else + static inline unsigned long _Atomic_swap(unsigned long * __p, unsigned long __q) { + unsigned long __result = *__p; + *__p = __q; + return __result; + } +# endif + +// Locking class. Note that this class *does not have a constructor*. +// It must be initialized either statically, with __STL_MUTEX_INITIALIZER, +// or dynamically, by explicitly calling the _M_initialize member function. +// (This is similar to the ways that a pthreads mutex can be initialized.) +// There are explicit member functions for acquiring and releasing the lock. + +// There is no constructor because static initialization is essential for +// some uses, and only a class aggregate (see section 8.5.1 of the C++ +// standard) can be initialized that way. That means we must have no +// constructors, no base classes, no virtual functions, and no private or +// protected members. + +// Helper struct. This is a workaround for various compilers that don't +// handle static variables in inline functions properly. +template +struct _STL_mutex_spin { + enum { __low_max = 30, __high_max = 1000 }; + // Low if we suspect uniprocessor, high for multiprocessor. + + static unsigned __max; + static unsigned __last; +}; + +template +unsigned _STL_mutex_spin<__inst>::__max = _STL_mutex_spin<__inst>::__low_max; + +template +unsigned _STL_mutex_spin<__inst>::__last = 0; + +struct _STL_mutex_lock +{ +#if defined(__STL_SGI_THREADS) || defined(__STL_WIN32THREADS) + // It should be relatively easy to get this to work on any modern Unix. + volatile unsigned long _M_lock; + void _M_initialize() { _M_lock = 0; } + static void _S_nsec_sleep(int __log_nsec) { +# ifdef __STL_SGI_THREADS + struct timespec __ts; + /* Max sleep is 2**27nsec ~ 60msec */ + __ts.tv_sec = 0; + __ts.tv_nsec = 1 << __log_nsec; + nanosleep(&__ts, 0); +# elif defined(__STL_WIN32THREADS) + if (__log_nsec <= 20) { + Sleep(0); + } else { + Sleep(1 << (__log_nsec - 20)); + } +# else +# error unimplemented +# endif + } + void _M_acquire_lock() { + volatile unsigned long* __lock = &this->_M_lock; + + if (!_Atomic_swap((unsigned long*)__lock, 1)) { + return; + } + unsigned __my_spin_max = _STL_mutex_spin<0>::__max; + unsigned __my_last_spins = _STL_mutex_spin<0>::__last; + volatile unsigned __junk = 17; // Value doesn't matter. + unsigned __i; + for (__i = 0; __i < __my_spin_max; __i++) { + if (__i < __my_last_spins/2 || *__lock) { + __junk *= __junk; __junk *= __junk; + __junk *= __junk; __junk *= __junk; + continue; + } + if (!_Atomic_swap((unsigned long*)__lock, 1)) { + // got it! + // Spinning worked. Thus we're probably not being scheduled + // against the other process with which we were contending. + // Thus it makes sense to spin longer the next time. + _STL_mutex_spin<0>::__last = __i; + _STL_mutex_spin<0>::__max = _STL_mutex_spin<0>::__high_max; + return; + } + } + // We are probably being scheduled against the other process. Sleep. + _STL_mutex_spin<0>::__max = _STL_mutex_spin<0>::__low_max; + for (__i = 0 ;; ++__i) { + int __log_nsec = __i + 6; + + if (__log_nsec > 27) __log_nsec = 27; + if (!_Atomic_swap((unsigned long *)__lock, 1)) { + return; + } + _S_nsec_sleep(__log_nsec); + } + } + void _M_release_lock() { + volatile unsigned long* __lock = &_M_lock; +# if defined(__STL_SGI_THREADS) && defined(__GNUC__) && __mips >= 3 + asm("sync"); + *__lock = 0; +# elif defined(__STL_SGI_THREADS) && __mips >= 3 \ + && (defined (_ABIN32) || defined(_ABI64)) + __lock_release(__lock); +# else + *__lock = 0; + // This is not sufficient on many multiprocessors, since + // writes to protected variables and the lock may be reordered. +# endif + } + +// We no longer use win32 critical sections. +// They appear to be slower in the contention-free case, +// and they appear difficult to initialize without introducing a race. + +#elif defined(__STL_PTHREADS) + pthread_mutex_t _M_lock; + void _M_initialize() { pthread_mutex_init(&_M_lock, NULL); } + void _M_acquire_lock() { pthread_mutex_lock(&_M_lock); } + void _M_release_lock() { pthread_mutex_unlock(&_M_lock); } +#elif defined(__STL_UITHREADS) + mutex_t _M_lock; + void _M_initialize() { mutex_init(&_M_lock, USYNC_THREAD, 0); } + void _M_acquire_lock() { mutex_lock(&_M_lock); } + void _M_release_lock() { mutex_unlock(&_M_lock); } +#else /* No threads */ + void _M_initialize() {} + void _M_acquire_lock() {} + void _M_release_lock() {} +#endif +}; + +#ifdef __STL_PTHREADS +// Pthreads locks must be statically initialized to something other than +// the default value of zero. +# define __STL_MUTEX_INITIALIZER = { PTHREAD_MUTEX_INITIALIZER } +#elif defined(__STL_UITHREADS) +// UIthreads locks must be statically initialized to something other than +// the default value of zero. +# define __STL_MUTEX_INITIALIZER = { DEFAULTMUTEX } +#elif defined(__STL_SGI_THREADS) || defined(__STL_WIN32THREADS) +# define __STL_MUTEX_INITIALIZER = { 0 } +#else +# define __STL_MUTEX_INITIALIZER +#endif + + +// A locking class that uses _STL_mutex_lock. The constructor takes a +// reference to an _STL_mutex_lock, and acquires a lock. The +// destructor releases the lock. It's not clear that this is exactly +// the right functionality. It will probably change in the future. + +struct _STL_auto_lock +{ + _STL_mutex_lock& _M_lock; + + _STL_auto_lock(_STL_mutex_lock& __lock) : _M_lock(__lock) + { _M_lock._M_acquire_lock(); } + ~_STL_auto_lock() { _M_lock._M_release_lock(); } + +private: + void operator=(const _STL_auto_lock&); + _STL_auto_lock(const _STL_auto_lock&); +}; + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_THREADS_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_tree.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_tree.h new file mode 100644 index 0000000..1049ba3 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_tree.h @@ -0,0 +1,1366 @@ +/* + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_TREE_H +#define __SGI_STL_INTERNAL_TREE_H + +/* + +Red-black tree class, designed for use in implementing STL +associative containers (set, multiset, map, and multimap). The +insertion and deletion algorithms are based on those in Cormen, +Leiserson, and Rivest, Introduction to Algorithms (MIT Press, 1990), +except that + +(1) the header cell is maintained with links not only to the root +but also to the leftmost node of the tree, to enable constant time +begin(), and to the rightmost node of the tree, to enable linear time +performance when used with the generic set algorithms (set_union, +etc.); + +(2) when a node being deleted has two children its successor node is +relinked into its place, rather than copied, so that the only +iterators invalidated are those referring to the deleted node. + +*/ + +#include +#include +#include +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1375 +#endif + +typedef bool _Rb_tree_Color_type; +const _Rb_tree_Color_type _S_rb_tree_red = false; +const _Rb_tree_Color_type _S_rb_tree_black = true; + +struct _Rb_tree_node_base +{ + typedef _Rb_tree_Color_type _Color_type; + typedef _Rb_tree_node_base* _Base_ptr; + + _Color_type _M_color; + _Base_ptr _M_parent; + _Base_ptr _M_left; + _Base_ptr _M_right; + + static _Base_ptr _S_minimum(_Base_ptr __x) + { + while (__x->_M_left != 0) __x = __x->_M_left; + return __x; + } + + static _Base_ptr _S_maximum(_Base_ptr __x) + { + while (__x->_M_right != 0) __x = __x->_M_right; + return __x; + } +}; + +template +struct _Rb_tree_node : public _Rb_tree_node_base +{ + typedef _Rb_tree_node<_Value>* _Link_type; + _Value _M_value_field; +}; + + +struct _Rb_tree_base_iterator +{ + typedef _Rb_tree_node_base::_Base_ptr _Base_ptr; + typedef bidirectional_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + _Base_ptr _M_node; + + void _M_increment() + { + if (_M_node->_M_right != 0) { + _M_node = _M_node->_M_right; + while (_M_node->_M_left != 0) + _M_node = _M_node->_M_left; + } + else { + _Base_ptr __y = _M_node->_M_parent; + while (_M_node == __y->_M_right) { + _M_node = __y; + __y = __y->_M_parent; + } + if (_M_node->_M_right != __y) + _M_node = __y; + } + } + + void _M_decrement() + { + if (_M_node->_M_color == _S_rb_tree_red && + _M_node->_M_parent->_M_parent == _M_node) + _M_node = _M_node->_M_right; + else if (_M_node->_M_left != 0) { + _Base_ptr __y = _M_node->_M_left; + while (__y->_M_right != 0) + __y = __y->_M_right; + _M_node = __y; + } + else { + _Base_ptr __y = _M_node->_M_parent; + while (_M_node == __y->_M_left) { + _M_node = __y; + __y = __y->_M_parent; + } + _M_node = __y; + } + } +}; + +template +struct _Rb_tree_iterator : public _Rb_tree_base_iterator +{ + typedef _Value value_type; + typedef _Ref reference; + typedef _Ptr pointer; + typedef _Rb_tree_iterator<_Value, _Value&, _Value*> + iterator; + typedef _Rb_tree_iterator<_Value, const _Value&, const _Value*> + const_iterator; + typedef _Rb_tree_iterator<_Value, _Ref, _Ptr> + _Self; + typedef _Rb_tree_node<_Value>* _Link_type; + + _Rb_tree_iterator() {} + _Rb_tree_iterator(_Link_type __x) { _M_node = __x; } + _Rb_tree_iterator(const iterator& __it) { _M_node = __it._M_node; } + + reference operator*() const { return _Link_type(_M_node)->_M_value_field; } +#ifndef __SGI_STL_NO_ARROW_OPERATOR + pointer operator->() const { return &(operator*()); } +#endif /* __SGI_STL_NO_ARROW_OPERATOR */ + + _Self& operator++() { _M_increment(); return *this; } + _Self operator++(int) { + _Self __tmp = *this; + _M_increment(); + return __tmp; + } + + _Self& operator--() { _M_decrement(); return *this; } + _Self operator--(int) { + _Self __tmp = *this; + _M_decrement(); + return __tmp; + } +}; + +inline bool operator==(const _Rb_tree_base_iterator& __x, + const _Rb_tree_base_iterator& __y) { + return __x._M_node == __y._M_node; +} + +inline bool operator!=(const _Rb_tree_base_iterator& __x, + const _Rb_tree_base_iterator& __y) { + return __x._M_node != __y._M_node; +} + +#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION + +inline bidirectional_iterator_tag +iterator_category(const _Rb_tree_base_iterator&) { + return bidirectional_iterator_tag(); +} + +inline _Rb_tree_base_iterator::difference_type* +distance_type(const _Rb_tree_base_iterator&) { + return (_Rb_tree_base_iterator::difference_type*) 0; +} + +template +inline _Value* value_type(const _Rb_tree_iterator<_Value, _Ref, _Ptr>&) { + return (_Value*) 0; +} + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +inline void +_Rb_tree_rotate_left(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root) +{ + _Rb_tree_node_base* __y = __x->_M_right; + __x->_M_right = __y->_M_left; + if (__y->_M_left !=0) + __y->_M_left->_M_parent = __x; + __y->_M_parent = __x->_M_parent; + + if (__x == __root) + __root = __y; + else if (__x == __x->_M_parent->_M_left) + __x->_M_parent->_M_left = __y; + else + __x->_M_parent->_M_right = __y; + __y->_M_left = __x; + __x->_M_parent = __y; +} + +inline void +_Rb_tree_rotate_right(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root) +{ + _Rb_tree_node_base* __y = __x->_M_left; + __x->_M_left = __y->_M_right; + if (__y->_M_right != 0) + __y->_M_right->_M_parent = __x; + __y->_M_parent = __x->_M_parent; + + if (__x == __root) + __root = __y; + else if (__x == __x->_M_parent->_M_right) + __x->_M_parent->_M_right = __y; + else + __x->_M_parent->_M_left = __y; + __y->_M_right = __x; + __x->_M_parent = __y; +} + +inline void +_Rb_tree_rebalance(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root) +{ + __x->_M_color = _S_rb_tree_red; + while (__x != __root && __x->_M_parent->_M_color == _S_rb_tree_red) { + if (__x->_M_parent == __x->_M_parent->_M_parent->_M_left) { + _Rb_tree_node_base* __y = __x->_M_parent->_M_parent->_M_right; + if (__y && __y->_M_color == _S_rb_tree_red) { + __x->_M_parent->_M_color = _S_rb_tree_black; + __y->_M_color = _S_rb_tree_black; + __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red; + __x = __x->_M_parent->_M_parent; + } + else { + if (__x == __x->_M_parent->_M_right) { + __x = __x->_M_parent; + _Rb_tree_rotate_left(__x, __root); + } + __x->_M_parent->_M_color = _S_rb_tree_black; + __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red; + _Rb_tree_rotate_right(__x->_M_parent->_M_parent, __root); + } + } + else { + _Rb_tree_node_base* __y = __x->_M_parent->_M_parent->_M_left; + if (__y && __y->_M_color == _S_rb_tree_red) { + __x->_M_parent->_M_color = _S_rb_tree_black; + __y->_M_color = _S_rb_tree_black; + __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red; + __x = __x->_M_parent->_M_parent; + } + else { + if (__x == __x->_M_parent->_M_left) { + __x = __x->_M_parent; + _Rb_tree_rotate_right(__x, __root); + } + __x->_M_parent->_M_color = _S_rb_tree_black; + __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red; + _Rb_tree_rotate_left(__x->_M_parent->_M_parent, __root); + } + } + } + __root->_M_color = _S_rb_tree_black; +} + +inline _Rb_tree_node_base* +_Rb_tree_rebalance_for_erase(_Rb_tree_node_base* __z, + _Rb_tree_node_base*& __root, + _Rb_tree_node_base*& __leftmost, + _Rb_tree_node_base*& __rightmost) +{ + _Rb_tree_node_base* __y = __z; + _Rb_tree_node_base* __x = 0; + _Rb_tree_node_base* __x_parent = 0; + if (__y->_M_left == 0) // __z has at most one non-null child. y == z. + __x = __y->_M_right; // __x might be null. + else + if (__y->_M_right == 0) // __z has exactly one non-null child. y == z. + __x = __y->_M_left; // __x is not null. + else { // __z has two non-null children. Set __y to + __y = __y->_M_right; // __z's successor. __x might be null. + while (__y->_M_left != 0) + __y = __y->_M_left; + __x = __y->_M_right; + } + if (__y != __z) { // relink y in place of z. y is z's successor + __z->_M_left->_M_parent = __y; + __y->_M_left = __z->_M_left; + if (__y != __z->_M_right) { + __x_parent = __y->_M_parent; + if (__x) __x->_M_parent = __y->_M_parent; + __y->_M_parent->_M_left = __x; // __y must be a child of _M_left + __y->_M_right = __z->_M_right; + __z->_M_right->_M_parent = __y; + } + else + __x_parent = __y; + if (__root == __z) + __root = __y; + else if (__z->_M_parent->_M_left == __z) + __z->_M_parent->_M_left = __y; + else + __z->_M_parent->_M_right = __y; + __y->_M_parent = __z->_M_parent; + __STD::swap(__y->_M_color, __z->_M_color); + __y = __z; + // __y now points to node to be actually deleted + } + else { // __y == __z + __x_parent = __y->_M_parent; + if (__x) __x->_M_parent = __y->_M_parent; + if (__root == __z) + __root = __x; + else + if (__z->_M_parent->_M_left == __z) + __z->_M_parent->_M_left = __x; + else + __z->_M_parent->_M_right = __x; + if (__leftmost == __z) + if (__z->_M_right == 0) // __z->_M_left must be null also + __leftmost = __z->_M_parent; + // makes __leftmost == _M_header if __z == __root + else + __leftmost = _Rb_tree_node_base::_S_minimum(__x); + if (__rightmost == __z) + if (__z->_M_left == 0) // __z->_M_right must be null also + __rightmost = __z->_M_parent; + // makes __rightmost == _M_header if __z == __root + else // __x == __z->_M_left + __rightmost = _Rb_tree_node_base::_S_maximum(__x); + } + if (__y->_M_color != _S_rb_tree_red) { + while (__x != __root && (__x == 0 || __x->_M_color == _S_rb_tree_black)) + if (__x == __x_parent->_M_left) { + _Rb_tree_node_base* __w = __x_parent->_M_right; + if (__w->_M_color == _S_rb_tree_red) { + __w->_M_color = _S_rb_tree_black; + __x_parent->_M_color = _S_rb_tree_red; + _Rb_tree_rotate_left(__x_parent, __root); + __w = __x_parent->_M_right; + } + if ((__w->_M_left == 0 || + __w->_M_left->_M_color == _S_rb_tree_black) && + (__w->_M_right == 0 || + __w->_M_right->_M_color == _S_rb_tree_black)) { + __w->_M_color = _S_rb_tree_red; + __x = __x_parent; + __x_parent = __x_parent->_M_parent; + } else { + if (__w->_M_right == 0 || + __w->_M_right->_M_color == _S_rb_tree_black) { + if (__w->_M_left) __w->_M_left->_M_color = _S_rb_tree_black; + __w->_M_color = _S_rb_tree_red; + _Rb_tree_rotate_right(__w, __root); + __w = __x_parent->_M_right; + } + __w->_M_color = __x_parent->_M_color; + __x_parent->_M_color = _S_rb_tree_black; + if (__w->_M_right) __w->_M_right->_M_color = _S_rb_tree_black; + _Rb_tree_rotate_left(__x_parent, __root); + break; + } + } else { // same as above, with _M_right <-> _M_left. + _Rb_tree_node_base* __w = __x_parent->_M_left; + if (__w->_M_color == _S_rb_tree_red) { + __w->_M_color = _S_rb_tree_black; + __x_parent->_M_color = _S_rb_tree_red; + _Rb_tree_rotate_right(__x_parent, __root); + __w = __x_parent->_M_left; + } + if ((__w->_M_right == 0 || + __w->_M_right->_M_color == _S_rb_tree_black) && + (__w->_M_left == 0 || + __w->_M_left->_M_color == _S_rb_tree_black)) { + __w->_M_color = _S_rb_tree_red; + __x = __x_parent; + __x_parent = __x_parent->_M_parent; + } else { + if (__w->_M_left == 0 || + __w->_M_left->_M_color == _S_rb_tree_black) { + if (__w->_M_right) __w->_M_right->_M_color = _S_rb_tree_black; + __w->_M_color = _S_rb_tree_red; + _Rb_tree_rotate_left(__w, __root); + __w = __x_parent->_M_left; + } + __w->_M_color = __x_parent->_M_color; + __x_parent->_M_color = _S_rb_tree_black; + if (__w->_M_left) __w->_M_left->_M_color = _S_rb_tree_black; + _Rb_tree_rotate_right(__x_parent, __root); + break; + } + } + if (__x) __x->_M_color = _S_rb_tree_black; + } + return __y; +} + +// Base class to encapsulate the differences between old SGI-style +// allocators and standard-conforming allocators. In order to avoid +// having an empty base class, we arbitrarily move one of rb_tree's +// data members into the base class. + +#ifdef __STL_USE_STD_ALLOCATORS + +// _Base for general standard-conforming allocators. +template +class _Rb_tree_alloc_base { +public: + typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type; + allocator_type get_allocator() const { return _M_node_allocator; } + + _Rb_tree_alloc_base(const allocator_type& __a) + : _M_node_allocator(__a), _M_header(0) {} + +protected: + typename _Alloc_traits<_Rb_tree_node<_Tp>, _Alloc>::allocator_type + _M_node_allocator; + _Rb_tree_node<_Tp>* _M_header; + + _Rb_tree_node<_Tp>* _M_get_node() + { return _M_node_allocator.allocate(1); } + void _M_put_node(_Rb_tree_node<_Tp>* __p) + { _M_node_allocator.deallocate(__p, 1); } +}; + +// Specialization for instanceless allocators. +template +class _Rb_tree_alloc_base<_Tp, _Alloc, true> { +public: + typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Rb_tree_alloc_base(const allocator_type&) : _M_header(0) {} + +protected: + _Rb_tree_node<_Tp>* _M_header; + + typedef typename _Alloc_traits<_Rb_tree_node<_Tp>, _Alloc>::_Alloc_type + _Alloc_type; + + _Rb_tree_node<_Tp>* _M_get_node() + { return _Alloc_type::allocate(1); } + void _M_put_node(_Rb_tree_node<_Tp>* __p) + { _Alloc_type::deallocate(__p, 1); } +}; + +template +struct _Rb_tree_base + : public _Rb_tree_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> +{ + typedef _Rb_tree_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> + _Base; + typedef typename _Base::allocator_type allocator_type; + + _Rb_tree_base(const allocator_type& __a) + : _Base(__a) { _M_header = _M_get_node(); } + ~_Rb_tree_base() { _M_put_node(_M_header); } + +}; + +#else /* __STL_USE_STD_ALLOCATORS */ + +template +struct _Rb_tree_base +{ + typedef _Alloc allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Rb_tree_base(const allocator_type&) + : _M_header(0) { _M_header = _M_get_node(); } + ~_Rb_tree_base() { _M_put_node(_M_header); } + +protected: + _Rb_tree_node<_Tp>* _M_header; + + typedef simple_alloc<_Rb_tree_node<_Tp>, _Alloc> _Alloc_type; + + _Rb_tree_node<_Tp>* _M_get_node() + { return _Alloc_type::allocate(1); } + void _M_put_node(_Rb_tree_node<_Tp>* __p) + { _Alloc_type::deallocate(__p, 1); } +}; + +#endif /* __STL_USE_STD_ALLOCATORS */ + +template +class _Rb_tree : protected _Rb_tree_base<_Value, _Alloc> { + typedef _Rb_tree_base<_Value, _Alloc> _Base; +protected: + typedef _Rb_tree_node_base* _Base_ptr; + typedef _Rb_tree_node<_Value> _Rb_tree_node; + typedef _Rb_tree_Color_type _Color_type; +public: + typedef _Key key_type; + typedef _Value value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef _Rb_tree_node* _Link_type; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + typedef typename _Base::allocator_type allocator_type; + allocator_type get_allocator() const { return _Base::get_allocator(); } + +protected: +#ifdef __STL_USE_NAMESPACES + using _Base::_M_get_node; + using _Base::_M_put_node; + using _Base::_M_header; +#endif /* __STL_USE_NAMESPACES */ + +protected: + + _Link_type _M_create_node(const value_type& __x) + { + _Link_type __tmp = _M_get_node(); + __STL_TRY { + construct(&__tmp->_M_value_field, __x); + } + __STL_UNWIND(_M_put_node(__tmp)); + return __tmp; + } + + _Link_type _M_clone_node(_Link_type __x) + { + _Link_type __tmp = _M_create_node(__x->_M_value_field); + __tmp->_M_color = __x->_M_color; + __tmp->_M_left = 0; + __tmp->_M_right = 0; + return __tmp; + } + + void destroy_node(_Link_type __p) + { + destroy(&__p->_M_value_field); + _M_put_node(__p); + } + +protected: + size_type _M_node_count; // keeps track of size of tree + _Compare _M_key_compare; + + _Link_type& _M_root() const + { return (_Link_type&) _M_header->_M_parent; } + _Link_type& _M_leftmost() const + { return (_Link_type&) _M_header->_M_left; } + _Link_type& _M_rightmost() const + { return (_Link_type&) _M_header->_M_right; } + + static _Link_type& _S_left(_Link_type __x) + { return (_Link_type&)(__x->_M_left); } + static _Link_type& _S_right(_Link_type __x) + { return (_Link_type&)(__x->_M_right); } + static _Link_type& _S_parent(_Link_type __x) + { return (_Link_type&)(__x->_M_parent); } + static reference _S_value(_Link_type __x) + { return __x->_M_value_field; } + static const _Key& _S_key(_Link_type __x) + { return _KeyOfValue()(_S_value(__x)); } + static _Color_type& _S_color(_Link_type __x) + { return (_Color_type&)(__x->_M_color); } + + static _Link_type& _S_left(_Base_ptr __x) + { return (_Link_type&)(__x->_M_left); } + static _Link_type& _S_right(_Base_ptr __x) + { return (_Link_type&)(__x->_M_right); } + static _Link_type& _S_parent(_Base_ptr __x) + { return (_Link_type&)(__x->_M_parent); } + static reference _S_value(_Base_ptr __x) + { return ((_Link_type)__x)->_M_value_field; } + static const _Key& _S_key(_Base_ptr __x) + { return _KeyOfValue()(_S_value(_Link_type(__x)));} + static _Color_type& _S_color(_Base_ptr __x) + { return (_Color_type&)(_Link_type(__x)->_M_color); } + + static _Link_type _S_minimum(_Link_type __x) + { return (_Link_type) _Rb_tree_node_base::_S_minimum(__x); } + + static _Link_type _S_maximum(_Link_type __x) + { return (_Link_type) _Rb_tree_node_base::_S_maximum(__x); } + +public: + typedef _Rb_tree_iterator iterator; + typedef _Rb_tree_iterator + const_iterator; + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + typedef reverse_iterator const_reverse_iterator; + typedef reverse_iterator reverse_iterator; +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + typedef reverse_bidirectional_iterator + reverse_iterator; + typedef reverse_bidirectional_iterator + const_reverse_iterator; +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +private: + iterator _M_insert(_Base_ptr __x, _Base_ptr __y, const value_type& __v); + _Link_type _M_copy(_Link_type __x, _Link_type __p); + void _M_erase(_Link_type __x); + +public: + // allocation/deallocation + _Rb_tree() + : _Base(allocator_type()), _M_node_count(0), _M_key_compare() + { _M_empty_initialize(); } + + _Rb_tree(const _Compare& __comp) + : _Base(allocator_type()), _M_node_count(0), _M_key_compare(__comp) + { _M_empty_initialize(); } + + _Rb_tree(const _Compare& __comp, const allocator_type& __a) + : _Base(__a), _M_node_count(0), _M_key_compare(__comp) + { _M_empty_initialize(); } + + _Rb_tree(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x) + : _Base(__x.get_allocator()), + _M_node_count(0), _M_key_compare(__x._M_key_compare) + { + if (__x._M_root() == 0) + _M_empty_initialize(); + else { + _S_color(_M_header) = _S_rb_tree_red; + _M_root() = _M_copy(__x._M_root(), _M_header); + _M_leftmost() = _S_minimum(_M_root()); + _M_rightmost() = _S_maximum(_M_root()); + } + _M_node_count = __x._M_node_count; + } + ~_Rb_tree() { clear(); } + _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& + operator=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x); + +private: + void _M_empty_initialize() { + _S_color(_M_header) = _S_rb_tree_red; // used to distinguish header from + // __root, in iterator.operator++ + _M_root() = 0; + _M_leftmost() = _M_header; + _M_rightmost() = _M_header; + } + +public: + // accessors: + _Compare key_comp() const { return _M_key_compare; } + iterator begin() { return _M_leftmost(); } + const_iterator begin() const { return _M_leftmost(); } + iterator end() { return _M_header; } + const_iterator end() const { return _M_header; } + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + bool empty() const { return _M_node_count == 0; } + size_type size() const { return _M_node_count; } + size_type max_size() const { return size_type(-1); } + + void swap(_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __t) { + __STD::swap(_M_header, __t._M_header); + __STD::swap(_M_node_count, __t._M_node_count); + __STD::swap(_M_key_compare, __t._M_key_compare); + } + +public: + // insert/erase + pair insert_unique(const value_type& __x); + iterator insert_equal(const value_type& __x); + + iterator insert_unique(iterator __position, const value_type& __x); + iterator insert_equal(iterator __position, const value_type& __x); + +#ifdef __STL_MEMBER_TEMPLATES + template + void insert_unique(_InputIterator __first, _InputIterator __last); + template + void insert_equal(_InputIterator __first, _InputIterator __last); +#else /* __STL_MEMBER_TEMPLATES */ + void insert_unique(const_iterator __first, const_iterator __last); + void insert_unique(const value_type* __first, const value_type* __last); + void insert_equal(const_iterator __first, const_iterator __last); + void insert_equal(const value_type* __first, const value_type* __last); +#endif /* __STL_MEMBER_TEMPLATES */ + + void erase(iterator __position); + size_type erase(const key_type& __x); + void erase(iterator __first, iterator __last); + void erase(const key_type* __first, const key_type* __last); + void clear() { + if (_M_node_count != 0) { + _M_erase(_M_root()); + _M_leftmost() = _M_header; + _M_root() = 0; + _M_rightmost() = _M_header; + _M_node_count = 0; + } + } + +public: + // set operations: + iterator find(const key_type& __x); + const_iterator find(const key_type& __x) const; + size_type count(const key_type& __x) const; + iterator lower_bound(const key_type& __x); + const_iterator lower_bound(const key_type& __x) const; + iterator upper_bound(const key_type& __x); + const_iterator upper_bound(const key_type& __x) const; + pair equal_range(const key_type& __x); + pair equal_range(const key_type& __x) const; + +public: + // Debugging. + bool __rb_verify() const; +}; + +template +inline bool +operator==(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, + const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) +{ + return __x.size() == __y.size() && + equal(__x.begin(), __x.end(), __y.begin()); +} + +template +inline bool +operator<(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, + const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) +{ + return lexicographical_compare(__x.begin(), __x.end(), + __y.begin(), __y.end()); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, + const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool +operator>(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, + const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool +operator<=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, + const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool +operator>=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, + const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) { + return !(__x < __y); +} + + +template +inline void +swap(_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, + _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) +{ + __x.swap(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + + +template +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::operator=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x) +{ + if (this != &__x) { + // Note that _Key may be a constant type. + clear(); + _M_node_count = 0; + _M_key_compare = __x._M_key_compare; + if (__x._M_root() == 0) { + _M_root() = 0; + _M_leftmost() = _M_header; + _M_rightmost() = _M_header; + } + else { + _M_root() = _M_copy(__x._M_root(), _M_header); + _M_leftmost() = _S_minimum(_M_root()); + _M_rightmost() = _S_maximum(_M_root()); + _M_node_count = __x._M_node_count; + } + } + return *this; +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::_M_insert(_Base_ptr __x_, _Base_ptr __y_, const _Value& __v) +{ + _Link_type __x = (_Link_type) __x_; + _Link_type __y = (_Link_type) __y_; + _Link_type __z; + + if (__y == _M_header || __x != 0 || + _M_key_compare(_KeyOfValue()(__v), _S_key(__y))) { + __z = _M_create_node(__v); + _S_left(__y) = __z; // also makes _M_leftmost() = __z + // when __y == _M_header + if (__y == _M_header) { + _M_root() = __z; + _M_rightmost() = __z; + } + else if (__y == _M_leftmost()) + _M_leftmost() = __z; // maintain _M_leftmost() pointing to min node + } + else { + __z = _M_create_node(__v); + _S_right(__y) = __z; + if (__y == _M_rightmost()) + _M_rightmost() = __z; // maintain _M_rightmost() pointing to max node + } + _S_parent(__z) = __y; + _S_left(__z) = 0; + _S_right(__z) = 0; + _Rb_tree_rebalance(__z, _M_header->_M_parent); + ++_M_node_count; + return iterator(__z); +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::insert_equal(const _Value& __v) +{ + _Link_type __y = _M_header; + _Link_type __x = _M_root(); + while (__x != 0) { + __y = __x; + __x = _M_key_compare(_KeyOfValue()(__v), _S_key(__x)) ? + _S_left(__x) : _S_right(__x); + } + return _M_insert(__x, __y, __v); +} + + +template +pair::iterator, + bool> +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::insert_unique(const _Value& __v) +{ + _Link_type __y = _M_header; + _Link_type __x = _M_root(); + bool __comp = true; + while (__x != 0) { + __y = __x; + __comp = _M_key_compare(_KeyOfValue()(__v), _S_key(__x)); + __x = __comp ? _S_left(__x) : _S_right(__x); + } + iterator __j = iterator(__y); + if (__comp) + if (__j == begin()) + return pair(_M_insert(__x, __y, __v), true); + else + --__j; + if (_M_key_compare(_S_key(__j._M_node), _KeyOfValue()(__v))) + return pair(_M_insert(__x, __y, __v), true); + return pair(__j, false); +} + + +template +typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator +_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc> + ::insert_unique(iterator __position, const _Val& __v) +{ + if (__position._M_node == _M_header->_M_left) { // begin() + if (size() > 0 && + _M_key_compare(_KeyOfValue()(__v), _S_key(__position._M_node))) + return _M_insert(__position._M_node, __position._M_node, __v); + // first argument just needs to be non-null + else + return insert_unique(__v).first; + } else if (__position._M_node == _M_header) { // end() + if (_M_key_compare(_S_key(_M_rightmost()), _KeyOfValue()(__v))) + return _M_insert(0, _M_rightmost(), __v); + else + return insert_unique(__v).first; + } else { + iterator __before = __position; + --__before; + if (_M_key_compare(_S_key(__before._M_node), _KeyOfValue()(__v)) + && _M_key_compare(_KeyOfValue()(__v), _S_key(__position._M_node))) { + if (_S_right(__before._M_node) == 0) + return _M_insert(0, __before._M_node, __v); + else + return _M_insert(__position._M_node, __position._M_node, __v); + // first argument just needs to be non-null + } else + return insert_unique(__v).first; + } +} + +template +typename _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::iterator +_Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc> + ::insert_equal(iterator __position, const _Val& __v) +{ + if (__position._M_node == _M_header->_M_left) { // begin() + if (size() > 0 && + !_M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v))) + return _M_insert(__position._M_node, __position._M_node, __v); + // first argument just needs to be non-null + else + return insert_equal(__v); + } else if (__position._M_node == _M_header) {// end() + if (!_M_key_compare(_KeyOfValue()(__v), _S_key(_M_rightmost()))) + return _M_insert(0, _M_rightmost(), __v); + else + return insert_equal(__v); + } else { + iterator __before = __position; + --__before; + if (!_M_key_compare(_KeyOfValue()(__v), _S_key(__before._M_node)) + && !_M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v))) { + if (_S_right(__before._M_node) == 0) + return _M_insert(0, __before._M_node, __v); + else + return _M_insert(__position._M_node, __position._M_node, __v); + // first argument just needs to be non-null + } else + return insert_equal(__v); + } +} + +#ifdef __STL_MEMBER_TEMPLATES + +template + template +void _Rb_tree<_Key,_Val,_KoV,_Cmp,_Alloc> + ::insert_equal(_II __first, _II __last) +{ + for ( ; __first != __last; ++__first) + insert_equal(*__first); +} + +template + template +void _Rb_tree<_Key,_Val,_KoV,_Cmp,_Alloc> + ::insert_unique(_II __first, _II __last) { + for ( ; __first != __last; ++__first) + insert_unique(*__first); +} + +#else /* __STL_MEMBER_TEMPLATES */ + +template +void +_Rb_tree<_Key,_Val,_KoV,_Cmp,_Alloc> + ::insert_equal(const _Val* __first, const _Val* __last) +{ + for ( ; __first != __last; ++__first) + insert_equal(*__first); +} + +template +void +_Rb_tree<_Key,_Val,_KoV,_Cmp,_Alloc> + ::insert_equal(const_iterator __first, const_iterator __last) +{ + for ( ; __first != __last; ++__first) + insert_equal(*__first); +} + +template +void +_Rb_tree<_Key,_Val,_KoV,_Cmp,_Alloc> + ::insert_unique(const _Val* __first, const _Val* __last) +{ + for ( ; __first != __last; ++__first) + insert_unique(*__first); +} + +template +void _Rb_tree<_Key,_Val,_KoV,_Cmp,_Alloc> + ::insert_unique(const_iterator __first, const_iterator __last) +{ + for ( ; __first != __last; ++__first) + insert_unique(*__first); +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +inline void _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::erase(iterator __position) +{ + _Link_type __y = + (_Link_type) _Rb_tree_rebalance_for_erase(__position._M_node, + _M_header->_M_parent, + _M_header->_M_left, + _M_header->_M_right); + destroy_node(__y); + --_M_node_count; +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::size_type +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::erase(const _Key& __x) +{ + pair __p = equal_range(__x); + size_type __n = 0; + distance(__p.first, __p.second, __n); + erase(__p.first, __p.second); + return __n; +} + +template +typename _Rb_tree<_Key, _Val, _KoV, _Compare, _Alloc>::_Link_type +_Rb_tree<_Key,_Val,_KoV,_Compare,_Alloc> + ::_M_copy(_Link_type __x, _Link_type __p) +{ + // structural copy. __x and __p must be non-null. + _Link_type __top = _M_clone_node(__x); + __top->_M_parent = __p; + + __STL_TRY { + if (__x->_M_right) + __top->_M_right = _M_copy(_S_right(__x), __top); + __p = __top; + __x = _S_left(__x); + + while (__x != 0) { + _Link_type __y = _M_clone_node(__x); + __p->_M_left = __y; + __y->_M_parent = __p; + if (__x->_M_right) + __y->_M_right = _M_copy(_S_right(__x), __y); + __p = __y; + __x = _S_left(__x); + } + } + __STL_UNWIND(_M_erase(__top)); + + return __top; +} + +template +void _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::_M_erase(_Link_type __x) +{ + // erase without rebalancing + while (__x != 0) { + _M_erase(_S_right(__x)); + _Link_type __y = _S_left(__x); + destroy_node(__x); + __x = __y; + } +} + +template +void _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::erase(iterator __first, iterator __last) +{ + if (__first == begin() && __last == end()) + clear(); + else + while (__first != __last) erase(__first++); +} + +template +void _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::erase(const _Key* __first, const _Key* __last) +{ + while (__first != __last) erase(*__first++); +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::find(const _Key& __k) +{ + _Link_type __y = _M_header; // Last node which is not less than __k. + _Link_type __x = _M_root(); // Current node. + + while (__x != 0) + if (!_M_key_compare(_S_key(__x), __k)) + __y = __x, __x = _S_left(__x); + else + __x = _S_right(__x); + + iterator __j = iterator(__y); + return (__j == end() || _M_key_compare(__k, _S_key(__j._M_node))) ? + end() : __j; +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::const_iterator +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::find(const _Key& __k) const +{ + _Link_type __y = _M_header; /* Last node which is not less than __k. */ + _Link_type __x = _M_root(); /* Current node. */ + + while (__x != 0) { + if (!_M_key_compare(_S_key(__x), __k)) + __y = __x, __x = _S_left(__x); + else + __x = _S_right(__x); + } + const_iterator __j = const_iterator(__y); + return (__j == end() || _M_key_compare(__k, _S_key(__j._M_node))) ? + end() : __j; +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::size_type +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::count(const _Key& __k) const +{ + pair __p = equal_range(__k); + size_type __n = 0; + distance(__p.first, __p.second, __n); + return __n; +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::lower_bound(const _Key& __k) +{ + _Link_type __y = _M_header; /* Last node which is not less than __k. */ + _Link_type __x = _M_root(); /* Current node. */ + + while (__x != 0) + if (!_M_key_compare(_S_key(__x), __k)) + __y = __x, __x = _S_left(__x); + else + __x = _S_right(__x); + + return iterator(__y); +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::const_iterator +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::lower_bound(const _Key& __k) const +{ + _Link_type __y = _M_header; /* Last node which is not less than __k. */ + _Link_type __x = _M_root(); /* Current node. */ + + while (__x != 0) + if (!_M_key_compare(_S_key(__x), __k)) + __y = __x, __x = _S_left(__x); + else + __x = _S_right(__x); + + return const_iterator(__y); +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::upper_bound(const _Key& __k) +{ + _Link_type __y = _M_header; /* Last node which is greater than __k. */ + _Link_type __x = _M_root(); /* Current node. */ + + while (__x != 0) + if (_M_key_compare(__k, _S_key(__x))) + __y = __x, __x = _S_left(__x); + else + __x = _S_right(__x); + + return iterator(__y); +} + +template +typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::const_iterator +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::upper_bound(const _Key& __k) const +{ + _Link_type __y = _M_header; /* Last node which is greater than __k. */ + _Link_type __x = _M_root(); /* Current node. */ + + while (__x != 0) + if (_M_key_compare(__k, _S_key(__x))) + __y = __x, __x = _S_left(__x); + else + __x = _S_right(__x); + + return const_iterator(__y); +} + +template +inline +pair::iterator, + typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator> +_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> + ::equal_range(const _Key& __k) +{ + return pair(lower_bound(__k), upper_bound(__k)); +} + +template +inline +pair::const_iterator, + typename _Rb_tree<_Key, _Value, _KoV, _Compare, _Alloc>::const_iterator> +_Rb_tree<_Key, _Value, _KoV, _Compare, _Alloc> + ::equal_range(const _Key& __k) const +{ + return pair(lower_bound(__k), + upper_bound(__k)); +} + +inline int +__black_count(_Rb_tree_node_base* __node, _Rb_tree_node_base* __root) +{ + if (__node == 0) + return 0; + else { + int __bc = __node->_M_color == _S_rb_tree_black ? 1 : 0; + if (__node == __root) + return __bc; + else + return __bc + __black_count(__node->_M_parent, __root); + } +} + +template +bool _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::__rb_verify() const +{ + if (_M_node_count == 0 || begin() == end()) + return _M_node_count == 0 && begin() == end() && + _M_header->_M_left == _M_header && _M_header->_M_right == _M_header; + + int __len = __black_count(_M_leftmost(), _M_root()); + for (const_iterator __it = begin(); __it != end(); ++__it) { + _Link_type __x = (_Link_type) __it._M_node; + _Link_type __L = _S_left(__x); + _Link_type __R = _S_right(__x); + + if (__x->_M_color == _S_rb_tree_red) + if ((__L && __L->_M_color == _S_rb_tree_red) || + (__R && __R->_M_color == _S_rb_tree_red)) + return false; + + if (__L && _M_key_compare(_S_key(__x), _S_key(__L))) + return false; + if (__R && _M_key_compare(_S_key(__R), _S_key(__x))) + return false; + + if (!__L && !__R && __black_count(__x, _M_root()) != __len) + return false; + } + + if (_M_leftmost() != _Rb_tree_node_base::_S_minimum(_M_root())) + return false; + if (_M_rightmost() != _Rb_tree_node_base::_S_maximum(_M_root())) + return false; + + return true; +} + +// Class rb_tree is not part of the C++ standard. It is provided for +// compatibility with the HP STL. + +template +struct rb_tree : public _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> +{ + typedef _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> _Base; + typedef typename _Base::allocator_type allocator_type; + + rb_tree(const _Compare& __comp = _Compare(), + const allocator_type& __a = allocator_type()) + : _Base(__comp, __a) {} + + ~rb_tree() {} +}; + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_TREE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_uninitialized.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_uninitialized.h new file mode 100644 index 0000000..d367fbe --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_uninitialized.h @@ -0,0 +1,279 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_UNINITIALIZED_H +#define __SGI_STL_INTERNAL_UNINITIALIZED_H + +__STL_BEGIN_NAMESPACE + +// uninitialized_copy + +// Valid if copy construction is equivalent to assignment, and if the +// destructor is trivial. +template +inline _ForwardIter +__uninitialized_copy_aux(_InputIter __first, _InputIter __last, + _ForwardIter __result, + __true_type) +{ + return copy(__first, __last, __result); +} + +template +_ForwardIter +__uninitialized_copy_aux(_InputIter __first, _InputIter __last, + _ForwardIter __result, + __false_type) +{ + _ForwardIter __cur = __result; + __STL_TRY { + for ( ; __first != __last; ++__first, ++__cur) + _Construct(&*__cur, *__first); + return __cur; + } + __STL_UNWIND(_Destroy(__result, __cur)); +} + + +template +inline _ForwardIter +__uninitialized_copy(_InputIter __first, _InputIter __last, + _ForwardIter __result, _Tp*) +{ + typedef typename __type_traits<_Tp>::is_POD_type _Is_POD; + return __uninitialized_copy_aux(__first, __last, __result, _Is_POD()); +} + +template +inline _ForwardIter + uninitialized_copy(_InputIter __first, _InputIter __last, + _ForwardIter __result) +{ + return __uninitialized_copy(__first, __last, __result, + __VALUE_TYPE(__result)); +} + +inline char* uninitialized_copy(const char* __first, const char* __last, + char* __result) { + memmove(__result, __first, __last - __first); + return __result + (__last - __first); +} + +inline wchar_t* +uninitialized_copy(const wchar_t* __first, const wchar_t* __last, + wchar_t* __result) +{ + memmove(__result, __first, sizeof(wchar_t) * (__last - __first)); + return __result + (__last - __first); +} + +// uninitialized_copy_n (not part of the C++ standard) + +template +pair<_InputIter, _ForwardIter> +__uninitialized_copy_n(_InputIter __first, _Size __count, + _ForwardIter __result, + input_iterator_tag) +{ + _ForwardIter __cur = __result; + __STL_TRY { + for ( ; __count > 0 ; --__count, ++__first, ++__cur) + _Construct(&*__cur, *__first); + return pair<_InputIter, _ForwardIter>(__first, __cur); + } + __STL_UNWIND(_Destroy(__result, __cur)); +} + +template +inline pair<_RandomAccessIter, _ForwardIter> +__uninitialized_copy_n(_RandomAccessIter __first, _Size __count, + _ForwardIter __result, + random_access_iterator_tag) { + _RandomAccessIter __last = __first + __count; + return pair<_RandomAccessIter, _ForwardIter>( + __last, + uninitialized_copy(__first, __last, __result)); +} + +template +inline pair<_InputIter, _ForwardIter> +__uninitialized_copy_n(_InputIter __first, _Size __count, + _ForwardIter __result) { + return __uninitialized_copy_n(__first, __count, __result, + __ITERATOR_CATEGORY(__first)); +} + +template +inline pair<_InputIter, _ForwardIter> +uninitialized_copy_n(_InputIter __first, _Size __count, + _ForwardIter __result) { + return __uninitialized_copy_n(__first, __count, __result, + __ITERATOR_CATEGORY(__first)); +} + +// Valid if copy construction is equivalent to assignment, and if the +// destructor is trivial. +template +inline void +__uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last, + const _Tp& __x, __true_type) +{ + fill(__first, __last, __x); +} + +template +void +__uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last, + const _Tp& __x, __false_type) +{ + _ForwardIter __cur = __first; + __STL_TRY { + for ( ; __cur != __last; ++__cur) + _Construct(&*__cur, __x); + } + __STL_UNWIND(_Destroy(__first, __cur)); +} + +template +inline void __uninitialized_fill(_ForwardIter __first, + _ForwardIter __last, const _Tp& __x, _Tp1*) +{ + typedef typename __type_traits<_Tp1>::is_POD_type _Is_POD; + __uninitialized_fill_aux(__first, __last, __x, _Is_POD()); + +} + +template +inline void uninitialized_fill(_ForwardIter __first, + _ForwardIter __last, + const _Tp& __x) +{ + __uninitialized_fill(__first, __last, __x, __VALUE_TYPE(__first)); +} + +// Valid if copy construction is equivalent to assignment, and if the +// destructor is trivial. +template +inline _ForwardIter +__uninitialized_fill_n_aux(_ForwardIter __first, _Size __n, + const _Tp& __x, __true_type) +{ + return fill_n(__first, __n, __x); +} + +template +_ForwardIter +__uninitialized_fill_n_aux(_ForwardIter __first, _Size __n, + const _Tp& __x, __false_type) +{ + _ForwardIter __cur = __first; + __STL_TRY { + for ( ; __n > 0; --__n, ++__cur) + _Construct(&*__cur, __x); + return __cur; + } + __STL_UNWIND(_Destroy(__first, __cur)); +} + +template +inline _ForwardIter +__uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x, _Tp1*) +{ + typedef typename __type_traits<_Tp1>::is_POD_type _Is_POD; + return __uninitialized_fill_n_aux(__first, __n, __x, _Is_POD()); +} + +template +inline _ForwardIter +uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x) +{ + return __uninitialized_fill_n(__first, __n, __x, __VALUE_TYPE(__first)); +} + +// Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill, +// __uninitialized_fill_copy. + +// __uninitialized_copy_copy +// Copies [first1, last1) into [result, result + (last1 - first1)), and +// copies [first2, last2) into +// [result, result + (last1 - first1) + (last2 - first2)). + +template +inline _ForwardIter +__uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _ForwardIter __result) +{ + _ForwardIter __mid = uninitialized_copy(__first1, __last1, __result); + __STL_TRY { + return uninitialized_copy(__first2, __last2, __mid); + } + __STL_UNWIND(_Destroy(__result, __mid)); +} + +// __uninitialized_fill_copy +// Fills [result, mid) with x, and copies [first, last) into +// [mid, mid + (last - first)). +template +inline _ForwardIter +__uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid, + const _Tp& __x, + _InputIter __first, _InputIter __last) +{ + uninitialized_fill(__result, __mid, __x); + __STL_TRY { + return uninitialized_copy(__first, __last, __mid); + } + __STL_UNWIND(_Destroy(__result, __mid)); +} + +// __uninitialized_copy_fill +// Copies [first1, last1) into [first2, first2 + (last1 - first1)), and +// fills [first2 + (last1 - first1), last2) with x. +template +inline void +__uninitialized_copy_fill(_InputIter __first1, _InputIter __last1, + _ForwardIter __first2, _ForwardIter __last2, + const _Tp& __x) +{ + _ForwardIter __mid2 = uninitialized_copy(__first1, __last1, __first2); + __STL_TRY { + uninitialized_fill(__mid2, __last2, __x); + } + __STL_UNWIND(_Destroy(__first2, __mid2)); +} + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_UNINITIALIZED_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_vector.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_vector.h new file mode 100644 index 0000000..883fff9 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/stl_vector.h @@ -0,0 +1,869 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef __SGI_STL_INTERNAL_VECTOR_H +#define __SGI_STL_INTERNAL_VECTOR_H + +#include + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +// The vector base class serves two purposes. First, its constructor +// and destructor allocate (but don't initialize) storage. This makes +// exception safety easier. Second, the base class encapsulates all of +// the differences between SGI-style allocators and standard-conforming +// allocators. + +#ifdef __STL_USE_STD_ALLOCATORS + +// Base class for ordinary allocators. +template +class _Vector_alloc_base { +public: + typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return _M_data_allocator; } + + _Vector_alloc_base(const allocator_type& __a) + : _M_data_allocator(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0) + {} + +protected: + allocator_type _M_data_allocator; + _Tp* _M_start; + _Tp* _M_finish; + _Tp* _M_end_of_storage; + + _Tp* _M_allocate(size_t __n) + { return _M_data_allocator.allocate(__n); } + void _M_deallocate(_Tp* __p, size_t __n) + { if (__p) _M_data_allocator.deallocate(__p, __n); } +}; + +// Specialization for allocators that have the property that we don't +// actually have to store an allocator object. +template +class _Vector_alloc_base<_Tp, _Allocator, true> { +public: + typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type + allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Vector_alloc_base(const allocator_type&) + : _M_start(0), _M_finish(0), _M_end_of_storage(0) + {} + +protected: + _Tp* _M_start; + _Tp* _M_finish; + _Tp* _M_end_of_storage; + + typedef typename _Alloc_traits<_Tp, _Allocator>::_Alloc_type _Alloc_type; + _Tp* _M_allocate(size_t __n) + { return _Alloc_type::allocate(__n); } + void _M_deallocate(_Tp* __p, size_t __n) + { _Alloc_type::deallocate(__p, __n);} +}; + +template +struct _Vector_base + : public _Vector_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> +{ + typedef _Vector_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> + _Base; + typedef typename _Base::allocator_type allocator_type; + + _Vector_base(const allocator_type& __a) : _Base(__a) {} + _Vector_base(size_t __n, const allocator_type& __a) : _Base(__a) { + _M_start = _M_allocate(__n); + _M_finish = _M_start; + _M_end_of_storage = _M_start + __n; + } + + ~_Vector_base() { _M_deallocate(_M_start, _M_end_of_storage - _M_start); } +}; + +#else /* __STL_USE_STD_ALLOCATORS */ + +template +class _Vector_base { +public: + typedef _Alloc allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _Vector_base(const _Alloc&) + : _M_start(0), _M_finish(0), _M_end_of_storage(0) {} + _Vector_base(size_t __n, const _Alloc&) + : _M_start(0), _M_finish(0), _M_end_of_storage(0) + { + _M_start = _M_allocate(__n); + _M_finish = _M_start; + _M_end_of_storage = _M_start + __n; + } + + ~_Vector_base() { _M_deallocate(_M_start, _M_end_of_storage - _M_start); } + +protected: + _Tp* _M_start; + _Tp* _M_finish; + _Tp* _M_end_of_storage; + + typedef simple_alloc<_Tp, _Alloc> _M_data_allocator; + _Tp* _M_allocate(size_t __n) + { return _M_data_allocator::allocate(__n); } + void _M_deallocate(_Tp* __p, size_t __n) + { _M_data_allocator::deallocate(__p, __n); } +}; + +#endif /* __STL_USE_STD_ALLOCATORS */ + +template +class vector : protected _Vector_base<_Tp, _Alloc> +{ + // requirements: + + __STL_CLASS_REQUIRES(_Tp, _Assignable); + +private: + typedef _Vector_base<_Tp, _Alloc> _Base; +public: + typedef _Tp value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + typedef typename _Base::allocator_type allocator_type; + allocator_type get_allocator() const { return _Base::get_allocator(); } + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + typedef reverse_iterator const_reverse_iterator; + typedef reverse_iterator reverse_iterator; +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + typedef reverse_iterator const_reverse_iterator; + typedef reverse_iterator + reverse_iterator; +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +protected: +#ifdef __STL_HAS_NAMESPACES + using _Base::_M_allocate; + using _Base::_M_deallocate; + using _Base::_M_start; + using _Base::_M_finish; + using _Base::_M_end_of_storage; +#endif /* __STL_HAS_NAMESPACES */ + +protected: + void _M_insert_aux(iterator __position, const _Tp& __x); + void _M_insert_aux(iterator __position); + +public: + iterator begin() { return _M_start; } + const_iterator begin() const { return _M_start; } + iterator end() { return _M_finish; } + const_iterator end() const { return _M_finish; } + + reverse_iterator rbegin() + { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const + { return const_reverse_iterator(end()); } + reverse_iterator rend() + { return reverse_iterator(begin()); } + const_reverse_iterator rend() const + { return const_reverse_iterator(begin()); } + + size_type size() const + { return size_type(end() - begin()); } + size_type max_size() const + { return size_type(-1) / sizeof(_Tp); } + size_type capacity() const + { return size_type(_M_end_of_storage - begin()); } + bool empty() const + { return begin() == end(); } + + reference operator[](size_type __n) { return *(begin() + __n); } + const_reference operator[](size_type __n) const { return *(begin() + __n); } + +#ifdef __STL_THROW_RANGE_ERRORS + void _M_range_check(size_type __n) const { + if (__n >= this->size()) + __stl_throw_range_error("vector"); + } + + reference at(size_type __n) + { _M_range_check(__n); return (*this)[__n]; } + const_reference at(size_type __n) const + { _M_range_check(__n); return (*this)[__n]; } +#endif /* __STL_THROW_RANGE_ERRORS */ + + explicit vector(const allocator_type& __a = allocator_type()) + : _Base(__a) {} + + vector(size_type __n, const _Tp& __value, + const allocator_type& __a = allocator_type()) + : _Base(__n, __a) + { _M_finish = uninitialized_fill_n(_M_start, __n, __value); } + + explicit vector(size_type __n) + : _Base(__n, allocator_type()) + { _M_finish = uninitialized_fill_n(_M_start, __n, _Tp()); } + + vector(const vector<_Tp, _Alloc>& __x) + : _Base(__x.size(), __x.get_allocator()) + { _M_finish = uninitialized_copy(__x.begin(), __x.end(), _M_start); } + +#ifdef __STL_MEMBER_TEMPLATES + // Check whether it's an integral type. If so, it's not an iterator. + template + vector(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) : _Base(__a) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_initialize_aux(__first, __last, _Integral()); + } + + template + void _M_initialize_aux(_Integer __n, _Integer __value, __true_type) { + _M_start = _M_allocate(__n); + _M_end_of_storage = _M_start + __n; + _M_finish = uninitialized_fill_n(_M_start, __n, __value); + } + + template + void _M_initialize_aux(_InputIterator __first, _InputIterator __last, + __false_type) { + _M_range_initialize(__first, __last, __ITERATOR_CATEGORY(__first)); + } + +#else + vector(const _Tp* __first, const _Tp* __last, + const allocator_type& __a = allocator_type()) + : _Base(__last - __first, __a) + { _M_finish = uninitialized_copy(__first, __last, _M_start); } +#endif /* __STL_MEMBER_TEMPLATES */ + + ~vector() { destroy(_M_start, _M_finish); } + + vector<_Tp, _Alloc>& operator=(const vector<_Tp, _Alloc>& __x); + void reserve(size_type __n) { + if (capacity() < __n) { + const size_type __old_size = size(); + iterator __tmp = _M_allocate_and_copy(__n, _M_start, _M_finish); + destroy(_M_start, _M_finish); + _M_deallocate(_M_start, _M_end_of_storage - _M_start); + _M_start = __tmp; + _M_finish = __tmp + __old_size; + _M_end_of_storage = _M_start + __n; + } + } + + // assign(), a generalized assignment member function. Two + // versions: one that takes a count, and one that takes a range. + // The range version is a member template, so we dispatch on whether + // or not the type is an integer. + + void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); } + void _M_fill_assign(size_type __n, const _Tp& __val); + +#ifdef __STL_MEMBER_TEMPLATES + + template + void assign(_InputIterator __first, _InputIterator __last) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_assign_dispatch(__first, __last, _Integral()); + } + + template + void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type) + { _M_fill_assign((size_type) __n, (_Tp) __val); } + + template + void _M_assign_dispatch(_InputIter __first, _InputIter __last, __false_type) + { _M_assign_aux(__first, __last, __ITERATOR_CATEGORY(__first)); } + + template + void _M_assign_aux(_InputIterator __first, _InputIterator __last, + input_iterator_tag); + + template + void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last, + forward_iterator_tag); + +#endif /* __STL_MEMBER_TEMPLATES */ + + reference front() { return *begin(); } + const_reference front() const { return *begin(); } + reference back() { return *(end() - 1); } + const_reference back() const { return *(end() - 1); } + + void push_back(const _Tp& __x) { + if (_M_finish != _M_end_of_storage) { + construct(_M_finish, __x); + ++_M_finish; + } + else + _M_insert_aux(end(), __x); + } + void push_back() { + if (_M_finish != _M_end_of_storage) { + construct(_M_finish); + ++_M_finish; + } + else + _M_insert_aux(end()); + } + void swap(vector<_Tp, _Alloc>& __x) { + __STD::swap(_M_start, __x._M_start); + __STD::swap(_M_finish, __x._M_finish); + __STD::swap(_M_end_of_storage, __x._M_end_of_storage); + } + + iterator insert(iterator __position, const _Tp& __x) { + size_type __n = __position - begin(); + if (_M_finish != _M_end_of_storage && __position == end()) { + construct(_M_finish, __x); + ++_M_finish; + } + else + _M_insert_aux(__position, __x); + return begin() + __n; + } + iterator insert(iterator __position) { + size_type __n = __position - begin(); + if (_M_finish != _M_end_of_storage && __position == end()) { + construct(_M_finish); + ++_M_finish; + } + else + _M_insert_aux(__position); + return begin() + __n; + } +#ifdef __STL_MEMBER_TEMPLATES + // Check whether it's an integral type. If so, it's not an iterator. + template + void insert(iterator __pos, _InputIterator __first, _InputIterator __last) { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_insert_dispatch(__pos, __first, __last, _Integral()); + } + + template + void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val, + __true_type) + { _M_fill_insert(__pos, (size_type) __n, (_Tp) __val); } + + template + void _M_insert_dispatch(iterator __pos, + _InputIterator __first, _InputIterator __last, + __false_type) { + _M_range_insert(__pos, __first, __last, __ITERATOR_CATEGORY(__first)); + } +#else /* __STL_MEMBER_TEMPLATES */ + void insert(iterator __position, + const_iterator __first, const_iterator __last); +#endif /* __STL_MEMBER_TEMPLATES */ + + void insert (iterator __pos, size_type __n, const _Tp& __x) + { _M_fill_insert(__pos, __n, __x); } + + void _M_fill_insert (iterator __pos, size_type __n, const _Tp& __x); + + void pop_back() { + --_M_finish; + destroy(_M_finish); + } + iterator erase(iterator __position) { + if (__position + 1 != end()) + copy(__position + 1, _M_finish, __position); + --_M_finish; + destroy(_M_finish); + return __position; + } + iterator erase(iterator __first, iterator __last) { + iterator __i = copy(__last, _M_finish, __first); + destroy(__i, _M_finish); + _M_finish = _M_finish - (__last - __first); + return __first; + } + + void resize(size_type __new_size, const _Tp& __x) { + if (__new_size < size()) + erase(begin() + __new_size, end()); + else + insert(end(), __new_size - size(), __x); + } + void resize(size_type __new_size) { resize(__new_size, _Tp()); } + void clear() { erase(begin(), end()); } + +protected: + +#ifdef __STL_MEMBER_TEMPLATES + template + iterator _M_allocate_and_copy(size_type __n, _ForwardIterator __first, + _ForwardIterator __last) +{ + iterator __result = _M_allocate(__n); + __STL_TRY { + uninitialized_copy(__first, __last, __result); + return __result; + } + __STL_UNWIND(_M_deallocate(__result, __n)); + } +#else /* __STL_MEMBER_TEMPLATES */ + iterator _M_allocate_and_copy(size_type __n, const_iterator __first, + const_iterator __last) + { + iterator __result = _M_allocate(__n); + __STL_TRY { + uninitialized_copy(__first, __last, __result); + return __result; + } + __STL_UNWIND(_M_deallocate(__result, __n)); + } +#endif /* __STL_MEMBER_TEMPLATES */ + + +#ifdef __STL_MEMBER_TEMPLATES + template + void _M_range_initialize(_InputIterator __first, + _InputIterator __last, input_iterator_tag) + { + for ( ; __first != __last; ++__first) + push_back(*__first); + } + + // This function is only called by the constructor. + template + void _M_range_initialize(_ForwardIterator __first, + _ForwardIterator __last, forward_iterator_tag) + { + size_type __n = 0; + distance(__first, __last, __n); + _M_start = _M_allocate(__n); + _M_end_of_storage = _M_start + __n; + _M_finish = uninitialized_copy(__first, __last, _M_start); + } + + template + void _M_range_insert(iterator __pos, + _InputIterator __first, _InputIterator __last, + input_iterator_tag); + + template + void _M_range_insert(iterator __pos, + _ForwardIterator __first, _ForwardIterator __last, + forward_iterator_tag); + +#endif /* __STL_MEMBER_TEMPLATES */ +}; + +template +inline bool +operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) +{ + return __x.size() == __y.size() && + equal(__x.begin(), __x.end(), __y.begin()); +} + +template +inline bool +operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) +{ + return lexicographical_compare(__x.begin(), __x.end(), + __y.begin(), __y.end()); +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline void swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y) +{ + __x.swap(__y); +} + +template +inline bool +operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool +operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) { + return __y < __x; +} + +template +inline bool +operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool +operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) { + return !(__x < __y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template +vector<_Tp,_Alloc>& +vector<_Tp,_Alloc>::operator=(const vector<_Tp, _Alloc>& __x) +{ + if (&__x != this) { + const size_type __xlen = __x.size(); + if (__xlen > capacity()) { + iterator __tmp = _M_allocate_and_copy(__xlen, __x.begin(), __x.end()); + destroy(_M_start, _M_finish); + _M_deallocate(_M_start, _M_end_of_storage - _M_start); + _M_start = __tmp; + _M_end_of_storage = _M_start + __xlen; + } + else if (size() >= __xlen) { + iterator __i = copy(__x.begin(), __x.end(), begin()); + destroy(__i, _M_finish); + } + else { + copy(__x.begin(), __x.begin() + size(), _M_start); + uninitialized_copy(__x.begin() + size(), __x.end(), _M_finish); + } + _M_finish = _M_start + __xlen; + } + return *this; +} + +template +void vector<_Tp, _Alloc>::_M_fill_assign(size_t __n, const value_type& __val) +{ + if (__n > capacity()) { + vector<_Tp, _Alloc> __tmp(__n, __val, get_allocator()); + __tmp.swap(*this); + } + else if (__n > size()) { + fill(begin(), end(), __val); + _M_finish = uninitialized_fill_n(_M_finish, __n - size(), __val); + } + else + erase(fill_n(begin(), __n, __val), end()); +} + +#ifdef __STL_MEMBER_TEMPLATES + +template template +void vector<_Tp, _Alloc>::_M_assign_aux(_InputIter __first, _InputIter __last, + input_iterator_tag) { + iterator __cur = begin(); + for ( ; __first != __last && __cur != end(); ++__cur, ++__first) + *__cur = *__first; + if (__first == __last) + erase(__cur, end()); + else + insert(end(), __first, __last); +} + +template template +void +vector<_Tp, _Alloc>::_M_assign_aux(_ForwardIter __first, _ForwardIter __last, + forward_iterator_tag) { + size_type __len = 0; + distance(__first, __last, __len); + + if (__len > capacity()) { + iterator __tmp = _M_allocate_and_copy(__len, __first, __last); + destroy(_M_start, _M_finish); + _M_deallocate(_M_start, _M_end_of_storage - _M_start); + _M_start = __tmp; + _M_end_of_storage = _M_finish = _M_start + __len; + } + else if (size() >= __len) { + iterator __new_finish = copy(__first, __last, _M_start); + destroy(__new_finish, _M_finish); + _M_finish = __new_finish; + } + else { + _ForwardIter __mid = __first; + advance(__mid, size()); + copy(__first, __mid, _M_start); + _M_finish = uninitialized_copy(__mid, __last, _M_finish); + } +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +void +vector<_Tp, _Alloc>::_M_insert_aux(iterator __position, const _Tp& __x) +{ + if (_M_finish != _M_end_of_storage) { + construct(_M_finish, *(_M_finish - 1)); + ++_M_finish; + _Tp __x_copy = __x; + copy_backward(__position, _M_finish - 2, _M_finish - 1); + *__position = __x_copy; + } + else { + const size_type __old_size = size(); + const size_type __len = __old_size != 0 ? 2 * __old_size : 1; + iterator __new_start = _M_allocate(__len); + iterator __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, __position, __new_start); + construct(__new_finish, __x); + ++__new_finish; + __new_finish = uninitialized_copy(__position, _M_finish, __new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(begin(), end()); + _M_deallocate(_M_start, _M_end_of_storage - _M_start); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } +} + +template +void +vector<_Tp, _Alloc>::_M_insert_aux(iterator __position) +{ + if (_M_finish != _M_end_of_storage) { + construct(_M_finish, *(_M_finish - 1)); + ++_M_finish; + copy_backward(__position, _M_finish - 2, _M_finish - 1); + *__position = _Tp(); + } + else { + const size_type __old_size = size(); + const size_type __len = __old_size != 0 ? 2 * __old_size : 1; + iterator __new_start = _M_allocate(__len); + iterator __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, __position, __new_start); + construct(__new_finish); + ++__new_finish; + __new_finish = uninitialized_copy(__position, _M_finish, __new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(begin(), end()); + _M_deallocate(_M_start, _M_end_of_storage - _M_start); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } +} + +template +void vector<_Tp, _Alloc>::_M_fill_insert(iterator __position, size_type __n, + const _Tp& __x) +{ + if (__n != 0) { + if (size_type(_M_end_of_storage - _M_finish) >= __n) { + _Tp __x_copy = __x; + const size_type __elems_after = _M_finish - __position; + iterator __old_finish = _M_finish; + if (__elems_after > __n) { + uninitialized_copy(_M_finish - __n, _M_finish, _M_finish); + _M_finish += __n; + copy_backward(__position, __old_finish - __n, __old_finish); + fill(__position, __position + __n, __x_copy); + } + else { + uninitialized_fill_n(_M_finish, __n - __elems_after, __x_copy); + _M_finish += __n - __elems_after; + uninitialized_copy(__position, __old_finish, _M_finish); + _M_finish += __elems_after; + fill(__position, __old_finish, __x_copy); + } + } + else { + const size_type __old_size = size(); + const size_type __len = __old_size + max(__old_size, __n); + iterator __new_start = _M_allocate(__len); + iterator __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, __position, __new_start); + __new_finish = uninitialized_fill_n(__new_finish, __n, __x); + __new_finish + = uninitialized_copy(__position, _M_finish, __new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(_M_start, _M_finish); + _M_deallocate(_M_start, _M_end_of_storage - _M_start); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } + } +} + +#ifdef __STL_MEMBER_TEMPLATES + +template template +void +vector<_Tp, _Alloc>::_M_range_insert(iterator __pos, + _InputIterator __first, + _InputIterator __last, + input_iterator_tag) +{ + for ( ; __first != __last; ++__first) { + __pos = insert(__pos, *__first); + ++__pos; + } +} + +template template +void +vector<_Tp, _Alloc>::_M_range_insert(iterator __position, + _ForwardIterator __first, + _ForwardIterator __last, + forward_iterator_tag) +{ + if (__first != __last) { + size_type __n = 0; + distance(__first, __last, __n); + if (size_type(_M_end_of_storage - _M_finish) >= __n) { + const size_type __elems_after = _M_finish - __position; + iterator __old_finish = _M_finish; + if (__elems_after > __n) { + uninitialized_copy(_M_finish - __n, _M_finish, _M_finish); + _M_finish += __n; + copy_backward(__position, __old_finish - __n, __old_finish); + copy(__first, __last, __position); + } + else { + _ForwardIterator __mid = __first; + advance(__mid, __elems_after); + uninitialized_copy(__mid, __last, _M_finish); + _M_finish += __n - __elems_after; + uninitialized_copy(__position, __old_finish, _M_finish); + _M_finish += __elems_after; + copy(__first, __mid, __position); + } + } + else { + const size_type __old_size = size(); + const size_type __len = __old_size + max(__old_size, __n); + iterator __new_start = _M_allocate(__len); + iterator __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, __position, __new_start); + __new_finish = uninitialized_copy(__first, __last, __new_finish); + __new_finish + = uninitialized_copy(__position, _M_finish, __new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(_M_start, _M_finish); + _M_deallocate(_M_start, _M_end_of_storage - _M_start); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } + } +} + +#else /* __STL_MEMBER_TEMPLATES */ + +template +void +vector<_Tp, _Alloc>::insert(iterator __position, + const_iterator __first, + const_iterator __last) +{ + if (__first != __last) { + size_type __n = 0; + distance(__first, __last, __n); + if (size_type(_M_end_of_storage - _M_finish) >= __n) { + const size_type __elems_after = _M_finish - __position; + iterator __old_finish = _M_finish; + if (__elems_after > __n) { + uninitialized_copy(_M_finish - __n, _M_finish, _M_finish); + _M_finish += __n; + copy_backward(__position, __old_finish - __n, __old_finish); + copy(__first, __last, __position); + } + else { + uninitialized_copy(__first + __elems_after, __last, _M_finish); + _M_finish += __n - __elems_after; + uninitialized_copy(__position, __old_finish, _M_finish); + _M_finish += __elems_after; + copy(__first, __first + __elems_after, __position); + } + } + else { + const size_type __old_size = size(); + const size_type __len = __old_size + max(__old_size, __n); + iterator __new_start = _M_allocate(__len); + iterator __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, __position, __new_start); + __new_finish = uninitialized_copy(__first, __last, __new_finish); + __new_finish + = uninitialized_copy(__position, _M_finish, __new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(_M_start, _M_finish); + _M_deallocate(_M_start, _M_end_of_storage - _M_start); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } + } +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_INTERNAL_VECTOR_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/string b/src/UWE_projectCode/SGI STL源码/SGI STL源码/string new file mode 100644 index 0000000..1ca6521 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/string @@ -0,0 +1,2413 @@ +/* + * Copyright (c) 1997-1999 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_STRING +#define __SGI_STL_STRING + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __STL_USE_NEW_IOSTREAMS +#include +#else /* __STL_USE_NEW_IOSTREAMS */ +#include +#endif /* __STL_USE_NEW_IOSTREAMS */ + +// Standard C++ string class. This class has performance +// characteristics very much like vector<>, meaning, for example, that +// it does not perform reference-count or copy-on-write, and that +// concatenation of two strings is an O(N) operation. + +// There are three reasons why basic_string is not identical to +// vector. First, basic_string always stores a null character at the +// end; this makes it possible for c_str to be a fast operation. +// Second, the C++ standard requires basic_string to copy elements +// using char_traits<>::assign, char_traits<>::copy, and +// char_traits<>::move. This means that all of vector<>'s low-level +// operations must be rewritten. Third, basic_string<> has a lot of +// extra functions in its interface that are convenient but, strictly +// speaking, redundant. + +// Additionally, the C++ standard imposes a major restriction: according +// to the standard, the character type _CharT must be a POD type. This +// implementation weakens that restriction, and allows _CharT to be a +// a user-defined non-POD type. However, _CharT must still have a +// default constructor. + +__STL_BEGIN_NAMESPACE + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma set woff 1174 +#pragma set woff 1375 +#endif + +// A helper class to use a char_traits as a function object. + +template +struct _Not_within_traits + : public unary_function +{ + typedef const typename _Traits::char_type* _Pointer; + const _Pointer _M_first; + const _Pointer _M_last; + + _Not_within_traits(_Pointer __f, _Pointer __l) + : _M_first(__f), _M_last(__l) {} + + bool operator()(const typename _Traits::char_type& __x) const { + return find_if(_M_first, _M_last, + bind1st(_Eq_traits<_Traits>(), __x)) == _M_last; + } +}; + +// ------------------------------------------------------------ +// Class _String_base. + +// _String_base is a helper class that makes it it easier to write an +// exception-safe version of basic_string. The constructor allocates, +// but does not initialize, a block of memory. The destructor +// deallocates, but does not destroy elements within, a block of +// memory. The destructor assumes that _M_start either is null, or else +// points to a block of memory that was allocated using _String_base's +// allocator and whose size is _M_end_of_storage - _M_start. + +// Additionally, _String_base encapsulates the difference between +// old SGI-style allocators and standard-conforming allocators. + +#ifdef __STL_USE_STD_ALLOCATORS + +// General base class. +template +class _String_alloc_base { +public: + typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type; + allocator_type get_allocator() const { return _M_data_allocator; } + + _String_alloc_base(const allocator_type& __a) + : _M_data_allocator(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0) + {} + +protected: + _Tp* _M_allocate(size_t __n) + { return _M_data_allocator.allocate(__n); } + void _M_deallocate(_Tp* __p, size_t __n) { + if (__p) + _M_data_allocator.deallocate(__p, __n); + } + +protected: + allocator_type _M_data_allocator; + + _Tp* _M_start; + _Tp* _M_finish; + _Tp* _M_end_of_storage; +}; + +// Specialization for instanceless allocators. +template +class _String_alloc_base<_Tp,_Alloc,true> { +public: + typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + + _String_alloc_base(const allocator_type&) + : _M_start(0), _M_finish(0), _M_end_of_storage(0) {} + +protected: + typedef typename _Alloc_traits<_Tp, _Alloc>::_Alloc_type _Alloc_type; + _Tp* _M_allocate(size_t __n) + { return _Alloc_type::allocate(__n); } + void _M_deallocate(_Tp* __p, size_t __n) + { _Alloc_type::deallocate(__p, __n); } + +protected: + _Tp* _M_start; + _Tp* _M_finish; + _Tp* _M_end_of_storage; +}; + +template +class _String_base + : public _String_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> +{ +protected: + typedef _String_alloc_base<_Tp, _Alloc, + _Alloc_traits<_Tp, _Alloc>::_S_instanceless> + _Base; + typedef typename _Base::allocator_type allocator_type; + + void _M_allocate_block(size_t __n) { + if (__n <= max_size()) { + _M_start = _M_allocate(__n); + _M_finish = _M_start; + _M_end_of_storage = _M_start + __n; + } + else + _M_throw_length_error(); + } + + void _M_deallocate_block() + { _M_deallocate(_M_start, _M_end_of_storage - _M_start); } + + size_t max_size() const { return (size_t(-1) / sizeof(_Tp)) - 1; } + + _String_base(const allocator_type& __a) : _Base(__a) { } + + _String_base(const allocator_type& __a, size_t __n) : _Base(__a) + { _M_allocate_block(__n); } + + ~_String_base() { _M_deallocate_block(); } + + void _M_throw_length_error() const; + void _M_throw_out_of_range() const; +}; + +#else /* __STL_USE_STD_ALLOCATORS */ + +template class _String_base { +public: + typedef _Alloc allocator_type; + allocator_type get_allocator() const { return allocator_type(); } + +protected: + typedef simple_alloc<_Tp, _Alloc> _Alloc_type; + + _Tp* _M_start; + _Tp* _M_finish; + _Tp* _M_end_of_storage; + // Precondition: 0 < __n <= max_size(). + + _Tp* _M_allocate(size_t __n) { return _Alloc_type::allocate(__n); } + void _M_deallocate(_Tp* __p, size_t __n) { + if (__p) + _Alloc_type::deallocate(__p, __n); + } + + void _M_allocate_block(size_t __n) { + if (__n <= max_size()) { + _M_start = _M_allocate(__n); + _M_finish = _M_start; + _M_end_of_storage = _M_start + __n; + } + else + _M_throw_length_error(); + } + + void _M_deallocate_block() + { _M_deallocate(_M_start, _M_end_of_storage - _M_start); } + + size_t max_size() const { return (size_t(-1) / sizeof(_Tp)) - 1; } + + _String_base(const allocator_type&) + : _M_start(0), _M_finish(0), _M_end_of_storage(0) { } + + _String_base(const allocator_type&, size_t __n) + : _M_start(0), _M_finish(0), _M_end_of_storage(0) + { _M_allocate_block(__n); } + + ~_String_base() { _M_deallocate_block(); } + + void _M_throw_length_error() const; + void _M_throw_out_of_range() const; +}; + +#endif /* __STL_USE_STD_ALLOCATORS */ + +// Helper functions for exception handling. +template +void _String_base<_Tp,_Alloc>::_M_throw_length_error() const { + __STL_THROW(length_error("basic_string")); +} + +template +void _String_base<_Tp, _Alloc>::_M_throw_out_of_range() const { + __STL_THROW(out_of_range("basic_string")); +} + + +// ------------------------------------------------------------ +// Class basic_string. + +// Class invariants: +// (1) [start, finish) is a valid range. +// (2) Each iterator in [start, finish) points to a valid object +// of type value_type. +// (3) *finish is a valid object of type value_type; in particular, +// it is value_type(). +// (4) [finish + 1, end_of_storage) is a valid range. +// (5) Each iterator in [finish + 1, end_of_storage) points to +// unininitialized memory. + +// Note one important consequence: a string of length n must manage +// a block of memory whose size is at least n + 1. + + +template +class basic_string : private _String_base<_CharT,_Alloc> { +public: + typedef _CharT value_type; + typedef _Traits traits_type; + + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + typedef const value_type* const_iterator; + typedef value_type* iterator; + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + typedef reverse_iterator const_reverse_iterator; + typedef reverse_iterator reverse_iterator; +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + typedef reverse_iterator + const_reverse_iterator; + typedef reverse_iterator + reverse_iterator; +#endif /* __STL_PARTIAL_SPECIALIZATION */ + + static const size_type npos; + + typedef _String_base<_CharT,_Alloc> _Base; + +public: // Constructor, destructor, assignment. + typedef typename _Base::allocator_type allocator_type; + allocator_type get_allocator() const { return _Base::get_allocator(); } + + explicit basic_string(const allocator_type& __a = allocator_type()) + : _Base(__a, 8) { _M_terminate_string(); } + + struct _Reserve_t {}; + basic_string(_Reserve_t, size_t __n, + const allocator_type& __a = allocator_type()) + : _Base(__a, __n + 1) { _M_terminate_string(); } + + basic_string(const basic_string& __s) : _Base(__s.get_allocator()) + { _M_range_initialize(__s.begin(), __s.end()); } + + basic_string(const basic_string& __s, size_type __pos, size_type __n = npos, + const allocator_type& __a = allocator_type()) + : _Base(__a) { + if (__pos > __s.size()) + _M_throw_out_of_range(); + else + _M_range_initialize(__s.begin() + __pos, + __s.begin() + __pos + min(__n, __s.size() - __pos)); + } + + basic_string(const _CharT* __s, size_type __n, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { _M_range_initialize(__s, __s + __n); } + + basic_string(const _CharT* __s, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { _M_range_initialize(__s, __s + _Traits::length(__s)); } + + basic_string(size_type __n, _CharT __c, + const allocator_type& __a = allocator_type()) + : _Base(__a, __n + 1) + { + _M_finish = uninitialized_fill_n(_M_start, __n, __c); + _M_terminate_string(); + } + + // Check to see if _InputIterator is an integer type. If so, then + // it can't be an iterator. +#ifdef __STL_MEMBER_TEMPLATES + template + basic_string(_InputIterator __f, _InputIterator __l, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { + typedef typename _Is_integer<_InputIterator>::_Integral _Integral; + _M_initialize_dispatch(__f, __l, _Integral()); + } +#else /* __STL_MEMBER_TEMPLATES */ + basic_string(const _CharT* __f, const _CharT* __l, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { + _M_range_initialize(__f, __l); + } +#endif + + ~basic_string() { destroy(_M_start, _M_finish + 1); } + + basic_string& operator=(const basic_string& __s) { + if (&__s != this) + assign(__s.begin(), __s.end()); + return *this; + } + + basic_string& operator=(const _CharT* __s) + { return assign(__s, __s + _Traits::length(__s)); } + + basic_string& operator=(_CharT __c) + { return assign(static_cast(1), __c); } + +protected: // Protected members inherited from base. +#ifdef __STL_HAS_NAMESPACES + using _Base::_M_allocate; + using _Base::_M_deallocate; + using _Base::_M_allocate_block; + using _Base::_M_deallocate_block; + using _Base::_M_throw_length_error; + using _Base::_M_throw_out_of_range; + + using _Base::_M_start; + using _Base::_M_finish; + using _Base::_M_end_of_storage; +#endif /* __STL_HAS_NAMESPACES */ + +private: // Helper functions used by constructors + // and elsewhere. + void _M_construct_null(_CharT* __p) { + construct(__p); +# ifdef __STL_DEFAULT_CONSTRUCTOR_BUG + __STL_TRY { + *__p = (_CharT) 0; + } + __STL_UNWIND(destroy(__p)); +# endif + } + + static _CharT _M_null() { +# ifndef __STL_DEFAULT_CONSTRUCTOR_BUG + return _CharT(); +# else + return (_CharT) 0; +# endif + } + +private: + // Helper functions used by constructors. It is a severe error for + // any of them to be called anywhere except from within constructors. + + void _M_terminate_string() { + __STL_TRY { + _M_construct_null(_M_finish); + } + __STL_UNWIND(destroy(_M_start, _M_finish)); + } + +#ifdef __STL_MEMBER_TEMPLATES + + template + void _M_range_initialize(_InputIter __f, _InputIter __l, + input_iterator_tag) { + _M_allocate_block(8); + _M_construct_null(_M_finish); + __STL_TRY { + append(__f, __l); + } + __STL_UNWIND(destroy(_M_start, _M_finish + 1)); + } + + template + void _M_range_initialize(_ForwardIter __f, _ForwardIter __l, + forward_iterator_tag) { + difference_type __n = 0; + distance(__f, __l, __n); + _M_allocate_block(__n + 1); + _M_finish = uninitialized_copy(__f, __l, _M_start); + _M_terminate_string(); + } + + template + void _M_range_initialize(_InputIter __f, _InputIter __l) { + typedef typename iterator_traits<_InputIter>::iterator_category _Category; + _M_range_initialize(__f, __l, _Category()); + } + + template + void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) { + _M_allocate_block(__n + 1); + _M_finish = uninitialized_fill_n(_M_start, __n, __x); + _M_terminate_string(); + } + + template + void _M_initialize_dispatch(_InputIter __f, _InputIter __l, __false_type) { + _M_range_initialize(__f, __l); + } + +#else /* __STL_MEMBER_TEMPLATES */ + + void _M_range_initialize(const _CharT* __f, const _CharT* __l) { + ptrdiff_t __n = __l - __f; + _M_allocate_block(__n + 1); + _M_finish = uninitialized_copy(__f, __l, _M_start); + _M_terminate_string(); + } + +#endif /* __STL_MEMBER_TEMPLATES */ + +public: // Iterators. + iterator begin() { return _M_start; } + iterator end() { return _M_finish; } + const_iterator begin() const { return _M_start; } + const_iterator end() const { return _M_finish; } + + reverse_iterator rbegin() + { return reverse_iterator(_M_finish); } + reverse_iterator rend() + { return reverse_iterator(_M_start); } + const_reverse_iterator rbegin() const + { return const_reverse_iterator(_M_finish); } + const_reverse_iterator rend() const + { return const_reverse_iterator(_M_start); } + +public: // Size, capacity, etc. + size_type size() const { return _M_finish - _M_start; } + size_type length() const { return size(); } + + size_t max_size() const { return _Base::max_size(); } + + + void resize(size_type __n, _CharT __c) { + if (__n <= size()) + erase(begin() + __n, end()); + else + append(__n - size(), __c); + } + + void resize(size_type __n) { resize(__n, _M_null()); } + + void reserve(size_type = 0); + + size_type capacity() const { return (_M_end_of_storage - _M_start) - 1; } + + void clear() { + if (!empty()) { + _Traits::assign(*_M_start, _M_null()); + destroy(_M_start+1, _M_finish+1); + _M_finish = _M_start; + } + } + + bool empty() const { return _M_start == _M_finish; } + +public: // Element access. + + const_reference operator[](size_type __n) const + { return *(_M_start + __n); } + reference operator[](size_type __n) + { return *(_M_start + __n); } + + const_reference at(size_type __n) const { + if (__n >= size()) + _M_throw_out_of_range(); + return *(_M_start + __n); + } + + reference at(size_type __n) { + if (__n >= size()) + _M_throw_out_of_range(); + return *(_M_start + __n); + } + +public: // Append, operator+=, push_back. + + basic_string& operator+=(const basic_string& __s) { return append(__s); } + basic_string& operator+=(const _CharT* __s) { return append(__s); } + basic_string& operator+=(_CharT __c) { push_back(__c); return *this; } + + basic_string& append(const basic_string& __s) + { return append(__s.begin(), __s.end()); } + + basic_string& append(const basic_string& __s, + size_type __pos, size_type __n) + { + if (__pos > __s.size()) + _M_throw_out_of_range(); + return append(__s.begin() + __pos, + __s.begin() + __pos + min(__n, __s.size() - __pos)); + } + + basic_string& append(const _CharT* __s, size_type __n) + { return append(__s, __s+__n); } + + basic_string& append(const _CharT* __s) + { return append(__s, __s + _Traits::length(__s)); } + + basic_string& append(size_type __n, _CharT __c); + +#ifdef __STL_MEMBER_TEMPLATES + + // Check to see if _InputIterator is an integer type. If so, then + // it can't be an iterator. + template + basic_string& append(_InputIter __first, _InputIter __last) { + typedef typename _Is_integer<_InputIter>::_Integral _Integral; + return _M_append_dispatch(__first, __last, _Integral()); + } + +#else /* __STL_MEMBER_TEMPLATES */ + + basic_string& append(const _CharT* __first, const _CharT* __last); + +#endif /* __STL_MEMBER_TEMPLATES */ + + void push_back(_CharT __c) { + if (_M_finish + 1 == _M_end_of_storage) + reserve(size() + max(size(), static_cast(1))); + _M_construct_null(_M_finish + 1); + _Traits::assign(*_M_finish, __c); + ++_M_finish; + } + + void pop_back() { + _Traits::assign(*(_M_finish - 1), _M_null()); + destroy(_M_finish); + --_M_finish; + } + +private: // Helper functions for append. + +#ifdef __STL_MEMBER_TEMPLATES + + template + basic_string& append(_InputIter __f, _InputIter __l, input_iterator_tag); + + template + basic_string& append(_ForwardIter __f, _ForwardIter __l, + forward_iterator_tag); + + template + basic_string& _M_append_dispatch(_Integer __n, _Integer __x, __true_type) { + return append((size_type) __n, (_CharT) __x); + } + + template + basic_string& _M_append_dispatch(_InputIter __f, _InputIter __l, + __false_type) { + typedef typename iterator_traits<_InputIter>::iterator_category _Category; + return append(__f, __l, _Category()); + } + +#endif /* __STL_MEMBER_TEMPLATES */ + +public: // Assign + + basic_string& assign(const basic_string& __s) + { return assign(__s.begin(), __s.end()); } + + basic_string& assign(const basic_string& __s, + size_type __pos, size_type __n) { + if (__pos > __s.size()) + _M_throw_out_of_range(); + return assign(__s.begin() + __pos, + __s.begin() + __pos + min(__n, __s.size() - __pos)); + } + + basic_string& assign(const _CharT* __s, size_type __n) + { return assign(__s, __s + __n); } + + basic_string& assign(const _CharT* __s) + { return assign(__s, __s + _Traits::length(__s)); } + + basic_string& assign(size_type __n, _CharT __c); + +#ifdef __STL_MEMBER_TEMPLATES + + // Check to see if _InputIterator is an integer type. If so, then + // it can't be an iterator. + template + basic_string& assign(_InputIter __first, _InputIter __last) { + typedef typename _Is_integer<_InputIter>::_Integral _Integral; + return _M_assign_dispatch(__first, __last, _Integral()); + } + +#endif /* __STL_MEMBER_TEMPLATES */ + + basic_string& assign(const _CharT* __f, const _CharT* __l); + +private: // Helper functions for assign. + +#ifdef __STL_MEMBER_TEMPLATES + + template + basic_string& _M_assign_dispatch(_Integer __n, _Integer __x, __true_type) { + return assign((size_type) __n, (_CharT) __x); + } + + template + basic_string& _M_assign_dispatch(_InputIter __f, _InputIter __l, + __false_type); + +#endif /* __STL_MEMBER_TEMPLATES */ + +public: // Insert + + basic_string& insert(size_type __pos, const basic_string& __s) { + if (__pos > size()) + _M_throw_out_of_range(); + if (size() > max_size() - __s.size()) + _M_throw_length_error(); + insert(_M_start + __pos, __s.begin(), __s.end()); + return *this; + } + + basic_string& insert(size_type __pos, const basic_string& __s, + size_type __beg, size_type __n) { + if (__pos > size() || __beg > __s.size()) + _M_throw_out_of_range(); + size_type __len = min(__n, __s.size() - __beg); + if (size() > max_size() - __len) + _M_throw_length_error(); + insert(_M_start + __pos, + __s.begin() + __beg, __s.begin() + __beg + __len); + return *this; + } + + basic_string& insert(size_type __pos, const _CharT* __s, size_type __n) { + if (__pos > size()) + _M_throw_out_of_range(); + if (size() > max_size() - __n) + _M_throw_length_error(); + insert(_M_start + __pos, __s, __s + __n); + return *this; + } + + basic_string& insert(size_type __pos, const _CharT* __s) { + if (__pos > size()) + _M_throw_out_of_range(); + size_type __len = _Traits::length(__s); + if (size() > max_size() - __len) + _M_throw_length_error(); + insert(_M_start + __pos, __s, __s + __len); + return *this; + } + + basic_string& insert(size_type __pos, size_type __n, _CharT __c) { + if (__pos > size()) + _M_throw_out_of_range(); + if (size() > max_size() - __n) + _M_throw_length_error(); + insert(_M_start + __pos, __n, __c); + return *this; + } + + iterator insert(iterator __p, _CharT __c) { + if (__p == _M_finish) { + push_back(__c); + return _M_finish - 1; + } + else + return _M_insert_aux(__p, __c); + } + + void insert(iterator __p, size_t __n, _CharT __c); + +#ifdef __STL_MEMBER_TEMPLATES + + // Check to see if _InputIterator is an integer type. If so, then + // it can't be an iterator. + template + void insert(iterator __p, _InputIter __first, _InputIter __last) { + typedef typename _Is_integer<_InputIter>::_Integral _Integral; + _M_insert_dispatch(__p, __first, __last, _Integral()); + } + +#else /* __STL_MEMBER_TEMPLATES */ + + void insert(iterator __p, const _CharT* __first, const _CharT* __last); + +#endif /* __STL_MEMBER_TEMPLATES */ + +private: // Helper functions for insert. + +#ifdef __STL_MEMBER_TEMPLATES + + template + void insert(iterator __p, _InputIter, _InputIter, input_iterator_tag); + + template + void insert(iterator __p, _ForwardIter, _ForwardIter, forward_iterator_tag); + + + template + void _M_insert_dispatch(iterator __p, _Integer __n, _Integer __x, + __true_type) { + insert(__p, (size_type) __n, (_CharT) __x); + } + + template + void _M_insert_dispatch(iterator __p, _InputIter __first, _InputIter __last, + __false_type) { + typedef typename iterator_traits<_InputIter>::iterator_category _Category; + insert(__p, __first, __last, _Category()); + } + + template + void + _M_copy(_InputIterator __first, _InputIterator __last, iterator __result) { + for ( ; __first != __last; ++__first, ++__result) + _Traits::assign(*__result, *__first); + } + +#endif /* __STL_MEMBER_TEMPLATES */ + + iterator _M_insert_aux(iterator, _CharT); + + void + _M_copy(const _CharT* __first, const _CharT* __last, _CharT* __result) { + _Traits::copy(__result, __first, __last - __first); + } + +public: // Erase. + + basic_string& erase(size_type __pos = 0, size_type __n = npos) { + if (__pos > size()) + _M_throw_out_of_range(); + erase(_M_start + __pos, _M_start + __pos + min(__n, size() - __pos)); + return *this; + } + + iterator erase(iterator __position) { + // The move includes the terminating null. + _Traits::move(__position, __position + 1, _M_finish - __position); + destroy(_M_finish); + --_M_finish; + return __position; + } + + iterator erase(iterator __first, iterator __last) { + if (__first != __last) { + // The move includes the terminating null. + _Traits::move(__first, __last, (_M_finish - __last) + 1); + const iterator __new_finish = _M_finish - (__last - __first); + destroy(__new_finish + 1, _M_finish + 1); + _M_finish = __new_finish; + } + return __first; + } + +public: // Replace. (Conceptually equivalent + // to erase followed by insert.) + basic_string& replace(size_type __pos, size_type __n, + const basic_string& __s) { + if (__pos > size()) + _M_throw_out_of_range(); + const size_type __len = min(__n, size() - __pos); + if (size() - __len >= max_size() - __s.size()) + _M_throw_length_error(); + return replace(_M_start + __pos, _M_start + __pos + __len, + __s.begin(), __s.end()); + } + + basic_string& replace(size_type __pos1, size_type __n1, + const basic_string& __s, + size_type __pos2, size_type __n2) { + if (__pos1 > size() || __pos2 > __s.size()) + _M_throw_out_of_range(); + const size_type __len1 = min(__n1, size() - __pos1); + const size_type __len2 = min(__n2, __s.size() - __pos2); + if (size() - __len1 >= max_size() - __len2) + _M_throw_length_error(); + return replace(_M_start + __pos1, _M_start + __pos1 + __len1, + __s._M_start + __pos2, __s._M_start + __pos2 + __len2); + } + + basic_string& replace(size_type __pos, size_type __n1, + const _CharT* __s, size_type __n2) { + if (__pos > size()) + _M_throw_out_of_range(); + const size_type __len = min(__n1, size() - __pos); + if (__n2 > max_size() || size() - __len >= max_size() - __n2) + _M_throw_length_error(); + return replace(_M_start + __pos, _M_start + __pos + __len, + __s, __s + __n2); + } + + basic_string& replace(size_type __pos, size_type __n1, + const _CharT* __s) { + if (__pos > size()) + _M_throw_out_of_range(); + const size_type __len = min(__n1, size() - __pos); + const size_type __n2 = _Traits::length(__s); + if (__n2 > max_size() || size() - __len >= max_size() - __n2) + _M_throw_length_error(); + return replace(_M_start + __pos, _M_start + __pos + __len, + __s, __s + _Traits::length(__s)); + } + + basic_string& replace(size_type __pos, size_type __n1, + size_type __n2, _CharT __c) { + if (__pos > size()) + _M_throw_out_of_range(); + const size_type __len = min(__n1, size() - __pos); + if (__n2 > max_size() || size() - __len >= max_size() - __n2) + _M_throw_length_error(); + return replace(_M_start + __pos, _M_start + __pos + __len, __n2, __c); + } + + basic_string& replace(iterator __first, iterator __last, + const basic_string& __s) + { return replace(__first, __last, __s.begin(), __s.end()); } + + basic_string& replace(iterator __first, iterator __last, + const _CharT* __s, size_type __n) + { return replace(__first, __last, __s, __s + __n); } + + basic_string& replace(iterator __first, iterator __last, + const _CharT* __s) { + return replace(__first, __last, __s, __s + _Traits::length(__s)); + } + + basic_string& replace(iterator __first, iterator __last, + size_type __n, _CharT __c); + + // Check to see if _InputIterator is an integer type. If so, then + // it can't be an iterator. +#ifdef __STL_MEMBER_TEMPLATES + template + basic_string& replace(iterator __first, iterator __last, + _InputIter __f, _InputIter __l) { + typedef typename _Is_integer<_InputIter>::_Integral _Integral; + return _M_replace_dispatch(__first, __last, __f, __l, _Integral()); + } +#else /* __STL_MEMBER_TEMPLATES */ + basic_string& replace(iterator __first, iterator __last, + const _CharT* __f, const _CharT* __l); +#endif /* __STL_MEMBER_TEMPLATES */ + +private: // Helper functions for replace. + +#ifdef __STL_MEMBER_TEMPLATES + + template + basic_string& _M_replace_dispatch(iterator __first, iterator __last, + _Integer __n, _Integer __x, + __true_type) { + return replace(__first, __last, (size_type) __n, (_CharT) __x); + } + + template + basic_string& _M_replace_dispatch(iterator __first, iterator __last, + _InputIter __f, _InputIter __l, + __false_type) { + typedef typename iterator_traits<_InputIter>::iterator_category _Category; + return replace(__first, __last, __f, __l, _Category()); + } + + template + basic_string& replace(iterator __first, iterator __last, + _InputIter __f, _InputIter __l, input_iterator_tag); + + template + basic_string& replace(iterator __first, iterator __last, + _ForwardIter __f, _ForwardIter __l, + forward_iterator_tag); + +#endif /* __STL_MEMBER_TEMPLATES */ + +public: // Other modifier member functions. + + size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const { + if (__pos > size()) + _M_throw_out_of_range(); + const size_type __len = min(__n, size() - __pos); + _Traits::copy(__s, _M_start + __pos, __len); + return __len; + } + + void swap(basic_string& __s) { + __STD::swap(_M_start, __s._M_start); + __STD::swap(_M_finish, __s._M_finish); + __STD::swap(_M_end_of_storage, __s._M_end_of_storage); + } + +public: // Conversion to C string. + + const _CharT* c_str() const { return _M_start; } + const _CharT* data() const { return _M_start; } + +public: // find. + + size_type find(const basic_string& __s, size_type __pos = 0) const + { return find(__s.begin(), __pos, __s.size()); } + + size_type find(const _CharT* __s, size_type __pos = 0) const + { return find(__s, __pos, _Traits::length(__s)); } + + size_type find(const _CharT* __s, size_type __pos, size_type __n) const; + size_type find(_CharT __c, size_type __pos = 0) const; + +public: // rfind. + + size_type rfind(const basic_string& __s, size_type __pos = npos) const + { return rfind(__s.begin(), __pos, __s.size()); } + + size_type rfind(const _CharT* __s, size_type __pos = npos) const + { return rfind(__s, __pos, _Traits::length(__s)); } + + size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const; + size_type rfind(_CharT __c, size_type __pos = npos) const; + +public: // find_first_of + + size_type find_first_of(const basic_string& __s, size_type __pos = 0) const + { return find_first_of(__s.begin(), __pos, __s.size()); } + + size_type find_first_of(const _CharT* __s, size_type __pos = 0) const + { return find_first_of(__s, __pos, _Traits::length(__s)); } + + size_type find_first_of(const _CharT* __s, size_type __pos, + size_type __n) const; + + size_type find_first_of(_CharT __c, size_type __pos = 0) const + { return find(__c, __pos); } + +public: // find_last_of + + size_type find_last_of(const basic_string& __s, + size_type __pos = npos) const + { return find_last_of(__s.begin(), __pos, __s.size()); } + + size_type find_last_of(const _CharT* __s, size_type __pos = npos) const + { return find_last_of(__s, __pos, _Traits::length(__s)); } + + size_type find_last_of(const _CharT* __s, size_type __pos, + size_type __n) const; + + size_type find_last_of(_CharT __c, size_type __pos = npos) const { + return rfind(__c, __pos); + } + +public: // find_first_not_of + + size_type find_first_not_of(const basic_string& __s, + size_type __pos = 0) const + { return find_first_not_of(__s.begin(), __pos, __s.size()); } + + size_type find_first_not_of(const _CharT* __s, size_type __pos = 0) const + { return find_first_not_of(__s, __pos, _Traits::length(__s)); } + + size_type find_first_not_of(const _CharT* __s, size_type __pos, + size_type __n) const; + + size_type find_first_not_of(_CharT __c, size_type __pos = 0) const; + +public: // find_last_not_of + + size_type find_last_not_of(const basic_string& __s, + size_type __pos = npos) const + { return find_last_not_of(__s.begin(), __pos, __s.size()); } + + size_type find_last_not_of(const _CharT* __s, size_type __pos = npos) const + { return find_last_not_of(__s, __pos, _Traits::length(__s)); } + + size_type find_last_not_of(const _CharT* __s, size_type __pos, + size_type __n) const; + + size_type find_last_not_of(_CharT __c, size_type __pos = npos) const; + +public: // Substring. + + basic_string substr(size_type __pos = 0, size_type __n = npos) const { + if (__pos > size()) + _M_throw_out_of_range(); + return basic_string(_M_start + __pos, + _M_start + __pos + min(__n, size() - __pos)); + } + +public: // Compare + + int compare(const basic_string& __s) const + { return _M_compare(_M_start, _M_finish, __s._M_start, __s._M_finish); } + + int compare(size_type __pos1, size_type __n1, + const basic_string& __s) const { + if (__pos1 > size()) + _M_throw_out_of_range(); + return _M_compare(_M_start + __pos1, + _M_start + __pos1 + min(__n1, size() - __pos1), + __s._M_start, __s._M_finish); + } + + int compare(size_type __pos1, size_type __n1, + const basic_string& __s, + size_type __pos2, size_type __n2) const { + if (__pos1 > size() || __pos2 > __s.size()) + _M_throw_out_of_range(); + return _M_compare(_M_start + __pos1, + _M_start + __pos1 + min(__n1, size() - __pos1), + __s._M_start + __pos2, + __s._M_start + __pos2 + min(__n2, size() - __pos2)); + } + + int compare(const _CharT* __s) const { + return _M_compare(_M_start, _M_finish, __s, __s + _Traits::length(__s)); + } + + int compare(size_type __pos1, size_type __n1, const _CharT* __s) const { + if (__pos1 > size()) + _M_throw_out_of_range(); + return _M_compare(_M_start + __pos1, + _M_start + __pos1 + min(__n1, size() - __pos1), + __s, __s + _Traits::length(__s)); + } + + int compare(size_type __pos1, size_type __n1, const _CharT* __s, + size_type __n2) const { + if (__pos1 > size()) + _M_throw_out_of_range(); + return _M_compare(_M_start + __pos1, + _M_start + __pos1 + min(__n1, size() - __pos1), + __s, __s + __n2); + } + +public: // Helper function for compare. + static int _M_compare(const _CharT* __f1, const _CharT* __l1, + const _CharT* __f2, const _CharT* __l2) { + const ptrdiff_t __n1 = __l1 - __f1; + const ptrdiff_t __n2 = __l2 - __f2; + const int cmp = _Traits::compare(__f1, __f2, min(__n1, __n2)); + return cmp != 0 ? cmp : (__n1 < __n2 ? -1 : (__n1 > __n2 ? 1 : 0)); + } +}; + + + +// ------------------------------------------------------------ +// Non-inline declarations. + +template +const basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc>::npos + = (basic_string<_CharT,_Traits,_Alloc>::size_type) -1; + +// Change the string's capacity so that it is large enough to hold +// at least __res_arg elements, plus the terminating null. Note that, +// if __res_arg < capacity(), this member function may actually decrease +// the string's capacity. +template +void basic_string<_CharT,_Traits,_Alloc>::reserve(size_type __res_arg) { + if (__res_arg > max_size()) + _M_throw_length_error(); + + size_type __n = max(__res_arg, size()) + 1; + pointer __new_start = _M_allocate(__n); + pointer __new_finish = __new_start; + + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, _M_finish, __new_start); + _M_construct_null(__new_finish); + } + __STL_UNWIND((destroy(__new_start, __new_finish), + _M_deallocate(__new_start, __n))); + + destroy(_M_start, _M_finish + 1); + _M_deallocate_block(); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __n; +} + +template +basic_string<_CharT,_Traits,_Alloc>& +basic_string<_CharT,_Traits,_Alloc>::append(size_type __n, _CharT __c) { + if (__n > max_size() || size() > max_size() - __n) + _M_throw_length_error(); + if (size() + __n > capacity()) + reserve(size() + max(size(), __n)); + if (__n > 0) { + uninitialized_fill_n(_M_finish + 1, __n - 1, __c); + __STL_TRY { + _M_construct_null(_M_finish + __n); + } + __STL_UNWIND(destroy(_M_finish + 1, _M_finish + __n)); + _Traits::assign(*_M_finish, __c); + _M_finish += __n; + } + return *this; +} + +#ifdef __STL_MEMBER_TEMPLATES + +template +template +basic_string<_Tp, _Traits, _Alloc>& +basic_string<_Tp, _Traits, _Alloc>::append(_InputIterator __first, + _InputIterator __last, + input_iterator_tag) { + for ( ; __first != __last ; ++__first) + push_back(*__first); + return *this; +} + +template +template +basic_string<_Tp, _Traits, _Alloc>& +basic_string<_Tp, _Traits, _Alloc>::append(_ForwardIter __first, + _ForwardIter __last, + forward_iterator_tag) { + if (__first != __last) { + const size_type __old_size = size(); + difference_type __n = 0; + distance(__first, __last, __n); + if (static_cast(__n) > max_size() || + __old_size > max_size() - static_cast(__n)) + _M_throw_length_error(); + if (__old_size + static_cast(__n) > capacity()) { + const size_type __len = __old_size + + max(__old_size, static_cast(__n)) + 1; + pointer __new_start = _M_allocate(__len); + pointer __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, _M_finish, __new_start); + __new_finish = uninitialized_copy(__first, __last, __new_finish); + _M_construct_null(__new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(_M_start, _M_finish + 1); + _M_deallocate_block(); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } + else { + _ForwardIter __f1 = __first; + ++__f1; + uninitialized_copy(__f1, __last, _M_finish + 1); + __STL_TRY { + _M_construct_null(_M_finish + __n); + } + __STL_UNWIND(destroy(_M_finish + 1, _M_finish + __n)); + _Traits::assign(*_M_finish, *__first); + _M_finish += __n; + } + } + return *this; +} + +#else /* __STL_MEMBER_TEMPLATES */ + +template +basic_string<_Tp, _Traits, _Alloc>& +basic_string<_Tp, _Traits, _Alloc>::append(const _Tp* __first, + const _Tp* __last) +{ + if (__first != __last) { + const size_type __old_size = size(); + ptrdiff_t __n = __last - __first; + if (__n > max_size() || __old_size > max_size() - __n) + _M_throw_length_error(); + if (__old_size + __n > capacity()) { + const size_type __len = __old_size + max(__old_size, (size_t) __n) + 1; + pointer __new_start = _M_allocate(__len); + pointer __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, _M_finish, __new_start); + __new_finish = uninitialized_copy(__first, __last, __new_finish); + _M_construct_null(__new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(_M_start, _M_finish + 1); + _M_deallocate_block(); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } + else { + const _Tp* __f1 = __first; + ++__f1; + uninitialized_copy(__f1, __last, _M_finish + 1); + __STL_TRY { + _M_construct_null(_M_finish + __n); + } + __STL_UNWIND(destroy(_M_finish + 1, _M_finish + __n)); + _Traits::assign(*_M_finish, *__first); + _M_finish += __n; + } + } + return *this; +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +basic_string<_CharT,_Traits,_Alloc>& +basic_string<_CharT,_Traits,_Alloc>::assign(size_type __n, _CharT __c) { + if (__n <= size()) { + _Traits::assign(_M_start, __n, __c); + erase(_M_start + __n, _M_finish); + } + else { + _Traits::assign(_M_start, size(), __c); + append(__n - size(), __c); + } + return *this; +} + +#ifdef __STL_MEMBER_TEMPLATES + +template +template +basic_string<_CharT,_Traits,_Alloc>& basic_string<_CharT,_Traits,_Alloc> + ::_M_assign_dispatch(_InputIter __f, _InputIter __l, __false_type) +{ + pointer __cur = _M_start; + while (__f != __l && __cur != _M_finish) { + _Traits::assign(*__cur, *__f); + ++__f; + ++__cur; + } + if (__f == __l) + erase(__cur, _M_finish); + else + append(__f, __l); + return *this; +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +basic_string<_CharT,_Traits,_Alloc>& +basic_string<_CharT,_Traits,_Alloc>::assign(const _CharT* __f, + const _CharT* __l) +{ + const ptrdiff_t __n = __l - __f; + if (static_cast(__n) <= size()) { + _Traits::copy(_M_start, __f, __n); + erase(_M_start + __n, _M_finish); + } + else { + _Traits::copy(_M_start, __f, size()); + append(__f + size(), __l); + } + return *this; +} + +template +basic_string<_CharT,_Traits,_Alloc>::iterator +basic_string<_CharT,_Traits,_Alloc> + ::_M_insert_aux(basic_string<_CharT,_Traits,_Alloc>::iterator __p, + _CharT __c) +{ + iterator __new_pos = __p; + if (_M_finish + 1 < _M_end_of_storage) { + _M_construct_null(_M_finish + 1); + _Traits::move(__p + 1, __p, _M_finish - __p); + _Traits::assign(*__p, __c); + ++_M_finish; + } + else { + const size_type __old_len = size(); + const size_type __len = __old_len + + max(__old_len, static_cast(1)) + 1; + iterator __new_start = _M_allocate(__len); + iterator __new_finish = __new_start; + __STL_TRY { + __new_pos = uninitialized_copy(_M_start, __p, __new_start); + construct(__new_pos, __c); + __new_finish = __new_pos + 1; + __new_finish = uninitialized_copy(__p, _M_finish, __new_finish); + _M_construct_null(__new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(_M_start, _M_finish + 1); + _M_deallocate_block(); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } + return __new_pos; +} + +template +void basic_string<_CharT,_Traits,_Alloc> + ::insert(basic_string<_CharT,_Traits,_Alloc>::iterator __position, + size_t __n, _CharT __c) +{ + if (__n != 0) { + if (size_type(_M_end_of_storage - _M_finish) >= __n + 1) { + const size_type __elems_after = _M_finish - __position; + iterator __old_finish = _M_finish; + if (__elems_after >= __n) { + uninitialized_copy((_M_finish - __n) + 1, _M_finish + 1, + _M_finish + 1); + _M_finish += __n; + _Traits::move(__position + __n, + __position, (__elems_after - __n) + 1); + _Traits::assign(__position, __n, __c); + } + else { + uninitialized_fill_n(_M_finish + 1, __n - __elems_after - 1, __c); + _M_finish += __n - __elems_after; + __STL_TRY { + uninitialized_copy(__position, __old_finish + 1, _M_finish); + _M_finish += __elems_after; + } + __STL_UNWIND((destroy(__old_finish + 1, _M_finish), + _M_finish = __old_finish)); + _Traits::assign(__position, __elems_after + 1, __c); + } + } + else { + const size_type __old_size = size(); + const size_type __len = __old_size + max(__old_size, __n) + 1; + iterator __new_start = _M_allocate(__len); + iterator __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, __position, __new_start); + __new_finish = uninitialized_fill_n(__new_finish, __n, __c); + __new_finish = uninitialized_copy(__position, _M_finish, + __new_finish); + _M_construct_null(__new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(_M_start, _M_finish + 1); + _M_deallocate_block(); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } + } +} + +#ifdef __STL_MEMBER_TEMPLATES + +template +template +void basic_string<_Tp, _Traits, _Alloc>::insert(iterator __p, + _InputIter __first, + _InputIter __last, + input_iterator_tag) +{ + for ( ; __first != __last; ++__first) { + __p = insert(__p, *__first); + ++__p; + } +} + +template +template +void +basic_string<_CharT,_Traits,_Alloc>::insert(iterator __position, + _ForwardIter __first, + _ForwardIter __last, + forward_iterator_tag) +{ + if (__first != __last) { + difference_type __n = 0; + distance(__first, __last, __n); + if (_M_end_of_storage - _M_finish >= __n + 1) { + const difference_type __elems_after = _M_finish - __position; + iterator __old_finish = _M_finish; + if (__elems_after >= __n) { + uninitialized_copy((_M_finish - __n) + 1, _M_finish + 1, + _M_finish + 1); + _M_finish += __n; + _Traits::move(__position + __n, + __position, (__elems_after - __n) + 1); + _M_copy(__first, __last, __position); + } + else { + _ForwardIter __mid = __first; + advance(__mid, __elems_after + 1); + uninitialized_copy(__mid, __last, _M_finish + 1); + _M_finish += __n - __elems_after; + __STL_TRY { + uninitialized_copy(__position, __old_finish + 1, _M_finish); + _M_finish += __elems_after; + } + __STL_UNWIND((destroy(__old_finish + 1, _M_finish), + _M_finish = __old_finish)); + _M_copy(__first, __mid, __position); + } + } + else { + const size_type __old_size = size(); + const size_type __len + = __old_size + max(__old_size, static_cast(__n)) + 1; + pointer __new_start = _M_allocate(__len); + pointer __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, __position, __new_start); + __new_finish = uninitialized_copy(__first, __last, __new_finish); + __new_finish + = uninitialized_copy(__position, _M_finish, __new_finish); + _M_construct_null(__new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(_M_start, _M_finish + 1); + _M_deallocate_block(); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } + } +} + +#else /* __STL_MEMBER_TEMPLATES */ + +template +void +basic_string<_CharT,_Traits,_Alloc>::insert(iterator __position, + const _CharT* __first, + const _CharT* __last) +{ + if (__first != __last) { + const ptrdiff_t __n = __last - __first; + if (_M_end_of_storage - _M_finish >= __n + 1) { + const ptrdiff_t __elems_after = _M_finish - __position; + iterator __old_finish = _M_finish; + if (__elems_after >= __n) { + uninitialized_copy((_M_finish - __n) + 1, _M_finish + 1, + _M_finish + 1); + _M_finish += __n; + _Traits::move(__position + __n, + __position, (__elems_after - __n) + 1); + _M_copy(__first, __last, __position); + } + else { + const _CharT* __mid = __first; + advance(__mid, __elems_after + 1); + uninitialized_copy(__mid, __last, _M_finish + 1); + _M_finish += __n - __elems_after; + __STL_TRY { + uninitialized_copy(__position, __old_finish + 1, _M_finish); + _M_finish += __elems_after; + } + __STL_UNWIND((destroy(__old_finish + 1, _M_finish), + _M_finish = __old_finish)); + _M_copy(__first, __mid, __position); + } + } + else { + const size_type __old_size = size(); + const size_type __len + = __old_size + max(__old_size, static_cast(__n)) + 1; + pointer __new_start = _M_allocate(__len); + pointer __new_finish = __new_start; + __STL_TRY { + __new_finish = uninitialized_copy(_M_start, __position, __new_start); + __new_finish = uninitialized_copy(__first, __last, __new_finish); + __new_finish + = uninitialized_copy(__position, _M_finish, __new_finish); + _M_construct_null(__new_finish); + } + __STL_UNWIND((destroy(__new_start,__new_finish), + _M_deallocate(__new_start,__len))); + destroy(_M_start, _M_finish + 1); + _M_deallocate_block(); + _M_start = __new_start; + _M_finish = __new_finish; + _M_end_of_storage = __new_start + __len; + } + } +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +basic_string<_CharT,_Traits,_Alloc>& +basic_string<_CharT,_Traits,_Alloc> + ::replace(iterator __first, iterator __last, size_type __n, _CharT __c) +{ + const size_type __len = static_cast(__last - __first); + if (__len >= __n) { + _Traits::assign(__first, __n, __c); + erase(__first + __n, __last); + } + else { + _Traits::assign(__first, __len, __c); + insert(__last, __n - __len, __c); + } + return *this; +} + +#ifdef __STL_MEMBER_TEMPLATES + +template +template +basic_string<_CharT,_Traits,_Alloc>& +basic_string<_CharT,_Traits,_Alloc> + ::replace(iterator __first, iterator __last, _InputIter __f, _InputIter __l, + input_iterator_tag) +{ + for ( ; __first != __last && __f != __l; ++__first, ++__f) + _Traits::assign(*__first, *__f); + + if (__f == __l) + erase(__first, __last); + else + insert(__last, __f, __l); + return *this; +} + +template +template +basic_string<_CharT,_Traits,_Alloc>& +basic_string<_CharT,_Traits,_Alloc> + ::replace(iterator __first, iterator __last, + _ForwardIter __f, _ForwardIter __l, + forward_iterator_tag) +{ + difference_type __n = 0; + distance(__f, __l, __n); + const difference_type __len = __last - __first; + if (__len >= __n) { + _M_copy(__f, __l, __first); + erase(__first + __n, __last); + } + else { + _ForwardIter __m = __f; + advance(__m, __len); + _M_copy(__f, __m, __first); + insert(__last, __m, __l); + } + return *this; +} + +#else /* __STL_MEMBER_TEMPLATES */ + +template +basic_string<_CharT,_Traits,_Alloc>& +basic_string<_CharT,_Traits,_Alloc> + ::replace(iterator __first, iterator __last, + const _CharT* __f, const _CharT* __l) +{ + const ptrdiff_t __n = __l - __f; + const difference_type __len = __last - __first; + if (__len >= __n) { + _M_copy(__f, __l, __first); + erase(__first + __n, __last); + } + else { + const _CharT* __m = __f + __len; + _M_copy(__f, __m, __first); + insert(__last, __m, __l); + } + return *this; +} + +#endif /* __STL_MEMBER_TEMPLATES */ + +template +basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc> + ::find(const _CharT* __s, size_type __pos, size_type __n) const +{ + if (__pos + __n > size()) + return npos; + else { + const const_iterator __result = + search(_M_start + __pos, _M_finish, + __s, __s + __n, _Eq_traits<_Traits>()); + return __result != _M_finish ? __result - begin() : npos; + } +} + +template +basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc> + ::find(_CharT __c, size_type __pos) const +{ + if (__pos >= size()) + return npos; + else { + const const_iterator __result = + find_if(_M_start + __pos, _M_finish, + bind2nd(_Eq_traits<_Traits>(), __c)); + return __result != _M_finish ? __result - begin() : npos; + } +} + +template +basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc> + ::rfind(const _CharT* __s, size_type __pos, size_type __n) const +{ + const size_t __len = size(); + + if (__n > __len) + return npos; + else if (__n == 0) + return min(__len, __pos); + else { + const const_iterator __last = begin() + min(__len - __n, __pos) + __n; + const const_iterator __result = find_end(begin(), __last, + __s, __s + __n, + _Eq_traits<_Traits>()); + return __result != __last ? __result - begin() : npos; + } +} + +template +basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc> + ::rfind(_CharT __c, size_type __pos) const +{ + const size_type __len = size(); + + if (__len < 1) + return npos; + else { + const const_iterator __last = begin() + min(__len - 1, __pos) + 1; + const_reverse_iterator __rresult = + find_if(const_reverse_iterator(__last), rend(), + bind2nd(_Eq_traits<_Traits>(), __c)); + return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos; + } +} + +template +basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc> + ::find_first_of(const _CharT* __s, size_type __pos, size_type __n) const +{ + if (__pos >= size()) + return npos; + else { + const_iterator __result = __STD::find_first_of(begin() + __pos, end(), + __s, __s + __n, + _Eq_traits<_Traits>()); + return __result != _M_finish ? __result - begin() : npos; + } +} + + +template +basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc> + ::find_last_of(const _CharT* __s, size_type __pos, size_type __n) const +{ + const size_type __len = size(); + + if (__len < 1) + return npos; + else { + const const_iterator __last = _M_start + min(__len - 1, __pos) + 1; + const const_reverse_iterator __rresult = + __STD::find_first_of(const_reverse_iterator(__last), rend(), + __s, __s + __n, + _Eq_traits<_Traits>()); + return __rresult != rend() ? (__rresult.base() - 1) - _M_start : npos; + } +} + + +template +basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc> + ::find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const +{ + if (__pos > size()) + return npos; + else { + const_iterator __result = find_if(_M_start + __pos, _M_finish, + _Not_within_traits<_Traits>(__s, __s + __n)); + return __result != _M_finish ? __result - _M_start : npos; + } +} + +template +basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc> + ::find_first_not_of(_CharT __c, size_type __pos) const +{ + if (__pos > size()) + return npos; + else { + const_iterator __result + = find_if(begin() + __pos, end(), + not1(bind2nd(_Eq_traits<_Traits>(), __c))); + return __result != _M_finish ? __result - begin() : npos; + } +} + +template +basic_string<_CharT,_Traits,_Alloc>::size_type +basic_string<_CharT,_Traits,_Alloc> + ::find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const +{ + + const size_type __len = size(); + + if (__len < 1) + return npos; + else { + const const_iterator __last = begin() + min(__len - 1, __pos) + 1; + const const_reverse_iterator __rresult = + find_if(const_reverse_iterator(__last), rend(), + _Not_within_traits<_Traits>(__s, __s + __n)); + return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos; + } +} + +template +basic_string<_Tp, _Traits, _Alloc>::size_type +basic_string<_Tp, _Traits, _Alloc> + ::find_last_not_of(_Tp __c, size_type __pos) const +{ + const size_type __len = size(); + + if (__len < 1) + return npos; + else { + const const_iterator __last = begin() + min(__len - 1, __pos) + 1; + const_reverse_iterator __rresult = + find_if(const_reverse_iterator(__last), rend(), + not1(bind2nd(_Eq_traits<_Traits>(), __c))); + return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos; + } +} + +// ------------------------------------------------------------ +// Non-member functions. + +// Operator+ + +template +inline basic_string<_CharT,_Traits,_Alloc> +operator+(const basic_string<_CharT,_Traits,_Alloc>& __x, + const basic_string<_CharT,_Traits,_Alloc>& __y) +{ + typedef basic_string<_CharT,_Traits,_Alloc> _Str; + typedef typename _Str::_Reserve_t _Reserve_t; + _Reserve_t __reserve; + _Str __result(__reserve, __x.size() + __y.size(), __x.get_allocator()); + __result.append(__x); + __result.append(__y); + return __result; +} + +template +inline basic_string<_CharT,_Traits,_Alloc> +operator+(const _CharT* __s, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + typedef basic_string<_CharT,_Traits,_Alloc> _Str; + typedef typename _Str::_Reserve_t _Reserve_t; + _Reserve_t __reserve; + const size_t __n = _Traits::length(__s); + _Str __result(__reserve, __n + __y.size()); + __result.append(__s, __s + __n); + __result.append(__y); + return __result; +} + +template +inline basic_string<_CharT,_Traits,_Alloc> +operator+(_CharT __c, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + typedef basic_string<_CharT,_Traits,_Alloc> _Str; + typedef typename _Str::_Reserve_t _Reserve_t; + _Reserve_t __reserve; + _Str __result(__reserve, 1 + __y.size()); + __result.push_back(__c); + __result.append(__y); + return __result; +} + +template +inline basic_string<_CharT,_Traits,_Alloc> +operator+(const basic_string<_CharT,_Traits,_Alloc>& __x, + const _CharT* __s) { + typedef basic_string<_CharT,_Traits,_Alloc> _Str; + typedef typename _Str::_Reserve_t _Reserve_t; + _Reserve_t __reserve; + const size_t __n = _Traits::length(__s); + _Str __result(__reserve, __x.size() + __n, __x.get_allocator()); + __result.append(__x); + __result.append(__s, __s + __n); + return __result; +} + +template +inline basic_string<_CharT,_Traits,_Alloc> +operator+(const basic_string<_CharT,_Traits,_Alloc>& __x, + const _CharT __c) { + typedef basic_string<_CharT,_Traits,_Alloc> _Str; + typedef typename _Str::_Reserve_t _Reserve_t; + _Reserve_t __reserve; + _Str __result(__reserve, __x.size() + 1, __x.get_allocator()); + __result.append(__x); + __result.push_back(__c); + return __result; +} + +// Operator== and operator!= + +template +inline bool +operator==(const basic_string<_CharT,_Traits,_Alloc>& __x, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return __x.size() == __y.size() && + _Traits::compare(__x.data(), __y.data(), __x.size()) == 0; +} + +template +inline bool +operator==(const _CharT* __s, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + size_t __n = _Traits::length(__s); + return __n == __y.size() && _Traits::compare(__s, __y.data(), __n) == 0; +} + +template +inline bool +operator==(const basic_string<_CharT,_Traits,_Alloc>& __x, + const _CharT* __s) { + size_t __n = _Traits::length(__s); + return __x.size() == __n && _Traits::compare(__x.data(), __s, __n) == 0; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return !(__x == __y); +} + +template +inline bool +operator!=(const _CharT* __s, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return !(__s == __y); +} + +template +inline bool +operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x, + const _CharT* __s) { + return !(__x == __s); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// Operator< (and also >, <=, and >=). + +template +inline bool +operator<(const basic_string<_CharT,_Traits,_Alloc>& __x, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return basic_string<_CharT,_Traits,_Alloc> + ::_M_compare(__x.begin(), __x.end(), __y.begin(), __y.end()) < 0; +} + +template +inline bool +operator<(const _CharT* __s, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + size_t __n = _Traits::length(__s); + return basic_string<_CharT,_Traits,_Alloc> + ::_M_compare(__s, __s + __n, __y.begin(), __y.end()) < 0; +} + +template +inline bool +operator<(const basic_string<_CharT,_Traits,_Alloc>& __x, + const _CharT* __s) { + size_t __n = _Traits::length(__s); + return basic_string<_CharT,_Traits,_Alloc> + ::_M_compare(__x.begin(), __x.end(), __s, __s + __n) < 0; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline bool +operator>(const basic_string<_CharT,_Traits,_Alloc>& __x, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return __y < __x; +} + +template +inline bool +operator>(const _CharT* __s, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return __y < __s; +} + +template +inline bool +operator>(const basic_string<_CharT,_Traits,_Alloc>& __x, + const _CharT* __s) { + return __s < __x; +} + +template +inline bool +operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return !(__y < __x); +} + +template +inline bool +operator<=(const _CharT* __s, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return !(__y < __s); +} + +template +inline bool +operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x, + const _CharT* __s) { + return !(__s < __x); +} + +template +inline bool +operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return !(__x < __y); +} + +template +inline bool +operator>=(const _CharT* __s, + const basic_string<_CharT,_Traits,_Alloc>& __y) { + return !(__s < __y); +} + +template +inline bool +operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x, + const _CharT* __s) { + return !(__x < __s); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// Swap. + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline void swap(basic_string<_CharT,_Traits,_Alloc>& __x, + basic_string<_CharT,_Traits,_Alloc>& __y) { + __x.swap(__y); +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +// I/O. + +#ifndef __STL_USE_NEW_IOSTREAMS +__STL_END_NAMESPACE +#include +__STL_BEGIN_NAMESPACE +#endif /* __STL_USE_NEW_IOSTREAMS */ + +#ifdef __STL_USE_NEW_IOSTREAMS + +template +inline bool +__sgi_string_fill(basic_ostream<_CharT, _Traits>& __os, + basic_streambuf<_CharT, _Traits>* __buf, + size_t __n) +{ + _CharT __f = __os.fill(); + size_t __i; + bool __ok = true; + + for (__i = 0; __i < __n; __i++) + __ok = __ok && !_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof()); + return __ok; +} + +template +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const basic_string<_CharT,_Traits,_Alloc>& __s) +{ + typename basic_ostream<_CharT, _Traits>::sentry __sentry(__os); + bool __ok = false; + + if (__sentry) { + __ok = true; + size_t __n = __s.size(); + size_t __pad_len = 0; + const bool __left = (__os.flags() & ios::left) != 0; + const size_t __w = __os.width(0); + basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf(); + + if (__w != 0 && __n < __w) + __pad_len = __w - __n; + + if (!__left) + __ok = __sgi_string_fill(__os, __buf, __pad_len); + + __ok = __ok && + __buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n); + + if (__left) + __ok = __ok && __sgi_string_fill(__os, __buf, __pad_len); + } + + if (!__ok) + __os.setstate(ios_base::failbit); + + return __os; +} + +template +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT,_Traits,_Alloc>& __s) +{ + typename basic_istream<_CharT, _Traits>::sentry __sentry(__is); + + if (__sentry) { + basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf(); + const ctype<_CharT>& __ctype = use_facet >(__is.getloc()); + + __s.clear(); + size_t __n = __is.width(0); + if (__n == 0) + __n = static_cast(-1); + else + __s.reserve(__n); + + + while (__n-- > 0) { + typename _Traits::int_type __c1 = __buf->sbumpc(); + if (_Traits::eq_int_type(__c1, _Traits::eof())) { + __is.setstate(ios_base::eofbit); + break; + } + else { + _CharT __c = _Traits::to_char_type(__c1); + + if (__ctype.is(ctype<_CharT>::space, __c)) { + if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof())) + __is.setstate(ios_base::failbit); + break; + } + else + __s.push_back(__c); + } + } + + // If we have read no characters, then set failbit. + if (__s.size() == 0) + __is.setstate(ios_base::failbit); + } + else + __is.setstate(ios_base::failbit); + + return __is; +} + +template +basic_istream<_CharT, _Traits>& +getline(istream& __is, + basic_string<_CharT,_Traits,_Alloc>& __s, + _CharT __delim) +{ + size_t __nread = 0; + typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true); + if (__sentry) { + basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf(); + __s.clear(); + + int __c1; + while (__nread < __s.max_size()) { + int __c1 = __buf->sbumpc(); + if (_Traits::eq_int_type(__c1, _Traits::eof())) { + __is.setstate(ios_base::eofbit); + break; + } + else { + ++__nread; + _CharT __c = _Traits::to_char_type(__c1); + if (!_Traits::eq(__c, __delim)) + __s.push_back(__c); + else + break; // Character is extracted but not appended. + } + } + } + if (__nread == 0 || __nread >= __s.max_size()) + __is.setstate(ios_base::failbit); + + return __is; +} + +template +inline basic_istream<_CharT, _Traits>& +getline(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT,_Traits,_Alloc>& __s) +{ + return getline(__is, __s, '\n'); +} + +#else /* __STL_USE_NEW_IOSTREAMS */ + +inline void __sgi_string_fill(ostream& __os, streambuf* __buf, size_t __n) +{ + char __f = __os.fill(); + size_t __i; + + for (__i = 0; __i < __n; __i++) __buf->sputc(__f); +} + +template +ostream& operator<<(ostream& __os, + const basic_string<_CharT,_Traits,_Alloc>& __s) +{ + streambuf* __buf = __os.rdbuf(); + if (__buf) { + size_t __n = __s.size(); + size_t __pad_len = 0; + const bool __left = (__os.flags() & ios::left) != 0; + const size_t __w = __os.width(); + + if (__w > 0) { + __n = min(__w, __n); + __pad_len = __w - __n; + } + + if (!__left) + __sgi_string_fill(__os, __buf, __pad_len); + + const size_t __nwritten = __buf->sputn(__s.data(), __n); + + if (__left) + __sgi_string_fill(__os, __buf, __pad_len); + + if (__nwritten != __n) + __os.clear(__os.rdstate() | ios::failbit); + + __os.width(0); + } + else + __os.clear(__os.rdstate() | ios::badbit); + + return __os; +} + +template +istream& operator>>(istream& __is, basic_string<_CharT,_Traits,_Alloc>& __s) +{ + if (!__is) + return __is; + + streambuf* __buf = __is.rdbuf(); + if (__buf) { + +#ifdef __USLC__ +/* Jochen Schlick '1999 - operator >> modified. Work-around to get the + * output buffer flushed (necessary when using + * "cout" (without endl or flushing) followed by + * "cin >>" ...) + */ + if (__is.flags() & ios::skipws) { + _CharT __c; + do + __is.get(__c); + while (__is && isspace(__c)); + if (__is) + __is.putback(__c); + } +#else + if (__is.flags() & ios::skipws) { + int __c; + do { + __c = __buf->sbumpc(); + } + while (__c != EOF && isspace((unsigned char)__c)); + + if (__c == EOF) { + __is.clear(__is.rdstate() | ios::eofbit | ios::failbit); + } + else { + if (__buf->sputbackc(__c) == EOF) + __is.clear(__is.rdstate() | ios::failbit); + } + } +#endif + + // If we arrive at end of file (or fail for some other reason) while + // still discarding whitespace, then we don't try to read the string. + if (__is) { + __s.clear(); + + size_t __n = __is.width(); + if (__n == 0) + __n = static_cast(-1); + else + __s.reserve(__n); + + while (__n-- > 0) { + int __c1 = __buf->sbumpc(); + if (__c1 == EOF) { + __is.clear(__is.rdstate() | ios::eofbit); + break; + } + else { + _CharT __c = _Traits::to_char_type(__c1); + + if (isspace((unsigned char) __c)) { + if (__buf->sputbackc(__c) == EOF) + __is.clear(__is.rdstate() | ios::failbit); + break; + } + else + __s.push_back(__c); + } + } + + // If we have read no characters, then set failbit. + if (__s.size() == 0) + __is.clear(__is.rdstate() | ios::failbit); + } + + __is.width(0); + } + else // We have no streambuf. + __is.clear(__is.rdstate() | ios::badbit); + + return __is; +} + +template +istream& getline(istream& __is, + basic_string<_CharT,_Traits,_Alloc>& __s, + _CharT __delim) +{ + streambuf* __buf = __is.rdbuf(); + if (__buf) { + size_t __nread = 0; + if (__is) { + __s.clear(); + + while (__nread < __s.max_size()) { + int __c1 = __buf->sbumpc(); + if (__c1 == EOF) { + __is.clear(__is.rdstate() | ios::eofbit); + break; + } + else { + ++__nread; + _CharT __c = _Traits::to_char_type(__c1); + if (!_Traits::eq(__c, __delim)) + __s.push_back(__c); + else + break; // Character is extracted but not appended. + } + } + } + + if (__nread == 0 || __nread >= __s.max_size()) + __is.clear(__is.rdstate() | ios::failbit); + } + else + __is.clear(__is.rdstate() | ios::badbit); + + return __is; +} + +template +inline istream& +getline(istream& __is, basic_string<_CharT,_Traits,_Alloc>& __s) +{ + return getline(__is, __s, '\n'); +} + +#endif /* __STL_USE_NEW_IOSTREAMS */ + +template +void _S_string_copy(const basic_string<_CharT,_Traits,_Alloc>& __s, + _CharT* __buf, + size_t __n) +{ + if (__n > 0) { + __n = min(__n - 1, __s.size()); + copy(__s.begin(), __s.begin() + __n, __buf); + _Traits::assign(__buf[__n], + basic_string<_CharT,_Traits,_Alloc>::_M_null()); + } +} + +inline const char* __get_c_string(const string& __s) { return __s.c_str(); } + +// ------------------------------------------------------------ +// Typedefs + +#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) +#pragma reset woff 1174 +#pragma reset woff 1375 +#endif + +__STL_END_NAMESPACE + +#include + +__STL_BEGIN_NAMESPACE + +template +size_t __stl_string_hash(const basic_string<_CharT,_Traits,_Alloc>& __s) { + unsigned long __h = 0; + for (basic_string<_CharT,_Traits,_Alloc>::const_iterator __i = __s.begin(); + __i != __s.end(); + ++__i) + __h = 5*__h + *__i; + return size_t(__h); +} + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +struct hash > { + size_t operator()(const basic_string<_CharT,_Traits,_Alloc>& __s) const + { return __stl_string_hash(__s); } +}; + +#else + +__STL_TEMPLATE_NULL struct hash { + size_t operator()(const string& __s) const + { return __stl_string_hash(__s); } +}; + +__STL_TEMPLATE_NULL struct hash { + size_t operator()(const wstring& __s) const + { return __stl_string_hash(__s); } +}; + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_STRING */ + + +// Local Variables: +// mode:C++ +// End: + diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/tempbuf.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/tempbuf.h new file mode 100644 index 0000000..aa4f289 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/tempbuf.h @@ -0,0 +1,61 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_TEMPBUF_H +#define __SGI_STL_TEMPBUF_H + +#ifndef __SGI_STL_PAIR_H +#include +#endif +#include /* XXX should use */ +#include /* XXX should use */ +#include /* XXX should use */ +#ifndef __TYPE_TRAITS_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_UNINITIALIZED_H +#include +#endif +#ifndef __SGI_STL_INTERNAL_TEMPBUF_H +#include +#endif + +#ifdef __STL_USE_NAMESPACES + +using __STD::get_temporary_buffer; +using __STD::return_temporary_buffer; +using __STD::temporary_buffer; + +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_TEMPBUF_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/tree.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/tree.h new file mode 100644 index 0000000..77c57cb --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/tree.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + */ + +#ifndef __SGI_STL_TREE_H +#define __SGI_STL_TREE_H + +#ifndef __SGI_STL_INTERNAL_TREE_H +#include +#endif +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::rb_tree; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_TREE_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/type_traits.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/type_traits.h new file mode 100644 index 0000000..b6a7dfc --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/type_traits.h @@ -0,0 +1,373 @@ +/* + * + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __TYPE_TRAITS_H +#define __TYPE_TRAITS_H + +#ifndef __STL_CONFIG_H +#include +#endif + +/* +This header file provides a framework for allowing compile time dispatch +based on type attributes. This is useful when writing template code. +For example, when making a copy of an array of an unknown type, it helps +to know if the type has a trivial copy constructor or not, to help decide +if a memcpy can be used. + +The class template __type_traits provides a series of typedefs each of +which is either __true_type or __false_type. The argument to +__type_traits can be any type. The typedefs within this template will +attain their correct values by one of these means: + 1. The general instantiation contain conservative values which work + for all types. + 2. Specializations may be declared to make distinctions between types. + 3. Some compilers (such as the Silicon Graphics N32 and N64 compilers) + will automatically provide the appropriate specializations for all + types. + +EXAMPLE: + +//Copy an array of elements which have non-trivial copy constructors +template void copy(T* source, T* destination, int n, __false_type); +//Copy an array of elements which have trivial copy constructors. Use memcpy. +template void copy(T* source, T* destination, int n, __true_type); + +//Copy an array of any type by using the most efficient copy mechanism +template inline void copy(T* source,T* destination,int n) { + copy(source, destination, n, + typename __type_traits::has_trivial_copy_constructor()); +} +*/ + + +struct __true_type { +}; + +struct __false_type { +}; + +template +struct __type_traits { + typedef __true_type this_dummy_member_must_be_first; + /* Do not remove this member. It informs a compiler which + automatically specializes __type_traits that this + __type_traits template is special. It just makes sure that + things work if an implementation is using a template + called __type_traits for something unrelated. */ + + /* The following restrictions should be observed for the sake of + compilers which automatically produce type specific specializations + of this class: + - You may reorder the members below if you wish + - You may remove any of the members below if you wish + - You must not rename members without making the corresponding + name change in the compiler + - Members you add will be treated like regular members unless + you add the appropriate support in the compiler. */ + + + typedef __false_type has_trivial_default_constructor; + typedef __false_type has_trivial_copy_constructor; + typedef __false_type has_trivial_assignment_operator; + typedef __false_type has_trivial_destructor; + typedef __false_type is_POD_type; +}; + + + +// Provide some specializations. This is harmless for compilers that +// have built-in __types_traits support, and essential for compilers +// that don't. + +#ifndef __STL_NO_BOOL + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +#endif /* __STL_NO_BOOL */ + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +#ifdef __STL_HAS_WCHAR_T + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +#endif /* __STL_HAS_WCHAR_T */ + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +#ifdef __STL_LONG_LONG + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +#endif /* __STL_LONG_LONG */ + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION + +template +struct __type_traits<_Tp*> { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +__STL_TEMPLATE_NULL struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; + +#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ + + +// The following could be written in terms of numeric_limits. +// We're doing it separately to reduce the number of dependencies. + +template struct _Is_integer { + typedef __false_type _Integral; +}; + +#ifndef __STL_NO_BOOL + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +#endif /* __STL_NO_BOOL */ + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +#ifdef __STL_HAS_WCHAR_T + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +#endif /* __STL_HAS_WCHAR_T */ + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +#ifdef __STL_LONG_LONG + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +__STL_TEMPLATE_NULL struct _Is_integer { + typedef __true_type _Integral; +}; + +#endif /* __STL_LONG_LONG */ + +#endif /* __TYPE_TRAITS_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/utility b/src/UWE_projectCode/SGI STL源码/SGI STL源码/utility new file mode 100644 index 0000000..df8c224 --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/utility @@ -0,0 +1,38 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996,1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_UTILITY +#define __SGI_STL_UTILITY + +#include +#include +#include + +#endif /* __SGI_STL_UTILITY */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/valarray b/src/UWE_projectCode/SGI STL源码/SGI STL源码/valarray new file mode 100644 index 0000000..814197d --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/valarray @@ -0,0 +1,1773 @@ +/* + * Copyright (c) 1999 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_VALARRAY +#define __SGI_STL_VALARRAY + +#include +#include +#include +#include +#include +#include + + +__STL_BEGIN_NAMESPACE + +class slice; +class gslice; + +template class valarray; +template class slice_array; +template class gslice_array; +template class mask_array; +template class indirect_array; + +//---------------------------------------------------------------------- +// class valarray + +// Base class to handle memory allocation and deallocation. We can't just +// use vector<>, because vector would be unsuitable as an internal +// representation for valarray. + +template +struct _Valarray_base +{ + _Tp* _M_first; + size_t _M_size; + + _Valarray_base() : _M_first(0), _M_size(0) {} + _Valarray_base(size_t __n) : _M_first(0), _M_size(0) { _M_allocate(__n); } + ~_Valarray_base() { _M_deallocate(); } + + void _M_allocate(size_t __n) { + if (__n != 0) { + _M_first = static_cast<_Tp*>(malloc(__n * sizeof(_Tp))); + _M_size = __n; +# if !defined(__STL_NO_BAD_ALLOC) && defined(__STL_USE_EXCEPTIONS) + if (_M_first == 0) { + _M_size = 0; + throw std::bad_alloc(); + } +# endif + } + else { + _M_first = 0; + _M_size = 0; + } + } + + void _M_deallocate() { + free(_M_first); + _M_first = 0; + _M_size = 0; + } +}; + +template +class valarray : private _Valarray_base<_Tp> +{ + friend class gslice; + +public: + typedef _Tp value_type; + + // Basic constructors + valarray() : _Valarray_base<_Tp>() {} + valarray(size_t __n) : _Valarray_base<_Tp>(__n) + { uninitialized_fill_n(this->_M_first, this->_M_size, value_type()); } + valarray(const value_type& __x, size_t __n) : _Valarray_base<_Tp>(__n) + { uninitialized_fill_n(this->_M_first, this->_M_size, __x); } + valarray(const value_type* __p, size_t __n) : _Valarray_base<_Tp>(__n) + { uninitialized_copy(__p, __p + __n, this->_M_first); } + valarray(const valarray& __x) : _Valarray_base<_Tp>(__x._M_size) { + uninitialized_copy(__x._M_first, __x._M_first + __x._M_size, + this->_M_first); + } + + // Constructors from auxiliary array types + valarray(const slice_array<_Tp>&); + valarray(const gslice_array<_Tp>&); + valarray(const mask_array<_Tp>&); + valarray(const indirect_array<_Tp>&); + + // Destructor + ~valarray() { destroy(this->_M_first, this->_M_first + this->_M_size); } + + // Extension: constructor that doesn't initialize valarray elements to a + // specific value. This is faster for types such as int and double. +private: + void _M_initialize(__true_type) {} + void _M_initialize(__false_type) + { uninitialized_fill_n(this->_M_first, this->_M_size, value_type()); } + +public: + struct _NoInit {}; + valarray(size_t __n, _NoInit) : _Valarray_base<_Tp>(__n) { + typedef typename __type_traits<_Tp>::has_trivial_default_constructor + _Is_Trivial; + _M_initialize(_Is_Trivial()); + } + +public: // Assignment + // Basic assignment. Note that 'x = y' is undefined if x.size() != y.size() + valarray& operator=(const valarray& __x) { + if (this != &__x) + copy(__x._M_first, __x._M_first + __x._M_size, this->_M_first); + return *this; + } + + // Scalar assignment + valarray& operator=(const value_type& __x) { + fill_n(this->_M_first, this->_M_size, __x); + return *this; + } + + // Assignment of auxiliary array types + valarray& operator=(const slice_array<_Tp>&); + valarray& operator=(const gslice_array<_Tp>&); + valarray& operator=(const mask_array<_Tp>&); + valarray& operator=(const indirect_array<_Tp>&); + +public: // Element access + value_type operator[](size_t __n) const { return this->_M_first[__n]; } + value_type& operator[](size_t __n) { return this->_M_first[__n]; } + size_t size() const { return this->_M_size; } + +public: // Subsetting operations with auxiliary type + valarray operator[](slice) const; + slice_array<_Tp> operator[](slice); + valarray operator[](gslice) const; + gslice_array<_Tp> operator[](gslice); + valarray operator[](const valarray&) const; + mask_array<_Tp> operator[](const valarray&); + valarray operator[](const valarray&) const; + indirect_array<_Tp> operator[](const valarray&); + +public: // Unary operators. + valarray operator+() const { return *this; } + + valarray operator-() const { + valarray __tmp(this->size(), _NoInit()); + for (size_t __i = 0; __i < this->size(); ++__i) + __tmp[__i] = -(*this)[__i]; + return __tmp; + } + + valarray operator~() const { + valarray __tmp(this->size(), _NoInit()); + for (size_t __i = 0; __i < this->size(); ++__i) + __tmp[__i] = ~(*this)[__i]; + return __tmp; + } + + valarray operator!() const { + valarray __tmp(this->size(), valarray::_NoInit()); + for (size_t __i = 0; __i < this->size(); ++__i) + __tmp[__i] = !(*this)[__i]; + return __tmp; + } + +public: // Scalar computed assignment. + valarray& operator*= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] *= __x; + return *this; + } + + valarray& operator/= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] /= __x; + return *this; + } + + valarray& operator%= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] %= __x; + return *this; + } + + valarray& operator+= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] += __x; + return *this; + } + + valarray& operator-= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] -= __x; + return *this; + } + + valarray& operator^= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] ^= __x; + return *this; + } + + valarray& operator&= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] &= __x; + return *this; + } + + valarray& operator|= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] |= __x; + return *this; + } + + valarray& operator<<= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] <<= __x; + return *this; + } + + valarray& operator>>= (const value_type& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] >>= __x; + return *this; + } + +public: // Array computed assignment. + valarray& operator*= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] *= __x[__i]; + return *this; + } + + valarray& operator/= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] /= __x[__i]; + return *this; + } + + valarray& operator%= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] %= __x[__i]; + return *this; + } + + valarray& operator+= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] += __x[__i]; + return *this; + } + + valarray& operator-= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] -= __x[__i]; + return *this; + } + + valarray& operator^= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] ^= __x[__i]; + return *this; + } + + valarray& operator&= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] &= __x[__i]; + return *this; + } + + valarray& operator|= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] |= __x[__i]; + return *this; + } + + valarray& operator<<= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] <<= __x[__i]; + return *this; + } + + valarray& operator>>= (const valarray& __x) { + for (size_t __i = 0; __i < this->size(); ++__i) + (*this)[__i] >>= __x[__i]; + return *this; + } + +public: // Other member functions. + + // The result is undefined for zero-length arrays + value_type sum() const { + return accumulate(this->_M_first + 1, this->_M_first + this->_M_size, + (*this)[0]); + } + + // The result is undefined for zero-length arrays + value_type min() const { + return *min_element(this->_M_first + 0, this->_M_first + this->_M_size); + } + + value_type max() const { + return *max_element(this->_M_first + 0, this->_M_first + this->_M_size); + } + + valarray shift(int __n) const; + valarray cshift(int __n) const; + + valarray apply(value_type __f(value_type)) const { + valarray __tmp(this->size()); + transform(this->_M_first, this->_M_first + this->_M_size, __tmp._M_first, + __f); + return __tmp; + } + valarray apply(value_type __f(const value_type&)) const { + valarray __tmp(this->size()); + transform(this->_M_first, this->_M_first + this->_M_size, __tmp._M_first, + __f); + return __tmp; + } + + void resize(size_t __n, value_type __x = value_type()) { + destroy(this->_M_first, this->_M_first + this->_M_size); + this->_Valarray_base<_Tp>::_M_deallocate(); + this->_Valarray_base<_Tp>::_M_allocate(__n); + uninitialized_fill_n(this->_M_first, this->_M_size, __x); + } +}; + +//---------------------------------------------------------------------- +// valarray non-member functions. + +// Binary arithmetic operations between two arrays. Behavior is +// undefined if the two arrays do not have the same length. + +template +inline valarray<_Tp> operator*(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] * __y[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator/(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] / __y[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator%(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] % __y[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator+(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] + __y[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator-(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] - __y[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator^(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] ^ __y[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator&(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] & __y[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator|(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] | __y[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator<<(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] << __y[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator>>(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] >> __y[__i]; + return __tmp; +} + +// Binary arithmetic operations between an array and a scalar. + +template +inline valarray<_Tp> operator*(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] * __c; + return __tmp; +} + +template +inline valarray<_Tp> operator*(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c * __x[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator/(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] / __c; + return __tmp; +} + +template +inline valarray<_Tp> operator/(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c / __x[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator%(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] % __c; + return __tmp; +} + +template +inline valarray<_Tp> operator%(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c % __x[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator+(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] + __c; + return __tmp; +} + +template +inline valarray<_Tp> operator+(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c + __x[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator-(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] - __c; + return __tmp; +} + +template +inline valarray<_Tp> operator-(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c - __x[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator^(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] ^ __c; + return __tmp; +} + +template +inline valarray<_Tp> operator^(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c ^ __x[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator&(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] & __c; + return __tmp; +} + +template +inline valarray<_Tp> operator&(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c & __x[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator|(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] | __c; + return __tmp; +} + +template +inline valarray<_Tp> operator|(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c | __x[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator<<(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] << __c; + return __tmp; +} + +template +inline valarray<_Tp> operator<<(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c << __x[__i]; + return __tmp; +} + +template +inline valarray<_Tp> operator>>(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] >> __c; + return __tmp; +} + +template +inline valarray<_Tp> operator>>(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c >> __x[__i]; + return __tmp; +} + +// Binary logical operations between two arrays. Behavior is undefined +// if the two arrays have different lengths. Note that operator== does +// not do what you might at first expect. + +template +inline valarray operator==(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] == __y[__i]; + return __tmp; +} + +template +inline valarray operator<(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] < __y[__i]; + return __tmp; +} + +#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER + +template +inline valarray operator!=(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] != __y[__i]; + return __tmp; +} + +template +inline valarray operator>(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] > __y[__i]; + return __tmp; +} + +template +inline valarray operator<=(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] <= __y[__i]; + return __tmp; +} + +template +inline valarray operator>=(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] >= __y[__i]; + return __tmp; +} + +#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ + +template +inline valarray operator&&(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] && __y[__i]; + return __tmp; +} + +template +inline valarray operator||(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] || __y[__i]; + return __tmp; +} + +// Logical operations between an array and a scalar. + +template +inline valarray operator==(const valarray<_Tp>& __x, const _Tp& __c) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] == __c; + return __tmp; +} + +template +inline valarray operator==(const _Tp& __c, const valarray<_Tp>& __x) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c == __x[__i]; + return __tmp; +} + +template +inline valarray operator!=(const valarray<_Tp>& __x, const _Tp& __c) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] != __c; + return __tmp; +} + +template +inline valarray operator!=(const _Tp& __c, const valarray<_Tp>& __x) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c != __x[__i]; + return __tmp; +} + +template +inline valarray operator<(const valarray<_Tp>& __x, const _Tp& __c) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] < __c; + return __tmp; +} + +template +inline valarray operator<(const _Tp& __c, const valarray<_Tp>& __x) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c < __x[__i]; + return __tmp; +} + +template +inline valarray operator>(const valarray<_Tp>& __x, const _Tp& __c) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] > __c; + return __tmp; +} + +template +inline valarray operator>(const _Tp& __c, const valarray<_Tp>& __x) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c > __x[__i]; + return __tmp; +} + +template +inline valarray operator<=(const valarray<_Tp>& __x, const _Tp& __c) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] <= __c; + return __tmp; +} + +template +inline valarray operator<=(const _Tp& __c, const valarray<_Tp>& __x) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c <= __x[__i]; + return __tmp; +} + +template +inline valarray operator>=(const valarray<_Tp>& __x, const _Tp& __c) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] >= __c; + return __tmp; +} + +template +inline valarray operator>=(const _Tp& __c, const valarray<_Tp>& __x) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c >= __x[__i]; + return __tmp; +} + +template +inline valarray operator&&(const valarray<_Tp>& __x, const _Tp& __c) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] && __c; + return __tmp; +} + +template +inline valarray operator&&(const _Tp& __c, const valarray<_Tp>& __x) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c && __x[__i]; + return __tmp; +} + +template +inline valarray operator||(const valarray<_Tp>& __x, const _Tp& __c) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __x[__i] || __c; + return __tmp; +} + +template +inline valarray operator||(const _Tp& __c, const valarray<_Tp>& __x) +{ + valarray __tmp(__x.size(), valarray::_NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = __c || __x[__i]; + return __tmp; +} + +// valarray "transcendentals" (the list includes abs and sqrt, which, +// of course, are not transcendental). + +template +inline valarray<_Tp> abs(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = abs(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> acos(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = acos(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> asin(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = asin(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> atan(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = atan(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> atan2(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = atan2(__x[__i], __y[__i]); + return __tmp; +} + +template +inline valarray<_Tp> atan2(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = atan2(__x[__i], __c); + return __tmp; +} + +template +inline valarray<_Tp> atan2(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = atan2(__c, __x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> cos(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = cos(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> cosh(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = cosh(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> exp(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = exp(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> log(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = log(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> log10(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = log10(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> pow(const valarray<_Tp>& __x, + const valarray<_Tp>& __y) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = pow(__x[__i], __y[__i]); + return __tmp; +} + +template +inline valarray<_Tp> pow(const valarray<_Tp>& __x, const _Tp& __c) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = pow(__x[__i], __c); + return __tmp; +} + +template +inline valarray<_Tp> pow(const _Tp& __c, const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = pow(__c, __x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> sin(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = sin(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> sinh(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = sinh(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> sqrt(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = sqrt(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> tan(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = tan(__x[__i]); + return __tmp; +} + +template +inline valarray<_Tp> tanh(const valarray<_Tp>& __x) { + typedef typename valarray<_Tp>::_NoInit _NoInit; + valarray<_Tp> __tmp(__x.size(), _NoInit()); + for (size_t __i = 0; __i < __x.size(); ++__i) + __tmp[__i] = tanh(__x[__i]); + return __tmp; +} + +//---------------------------------------------------------------------- +// slice and slice_array + +class slice { +public: + slice() : _M_start(0), _M_length(0), _M_stride(0) {} + slice(size_t __start, size_t __length, size_t __stride) + : _M_start(__start), _M_length(__length), _M_stride(__stride) + {} + + size_t start() const { return _M_start; } + size_t size() const { return _M_length; } + size_t stride() const { return _M_stride; } + + +private: + size_t _M_start; + size_t _M_length; + size_t _M_stride; +}; + +template +class slice_array { + friend class valarray<_Tp>; +public: + typedef _Tp value_type; + + void operator=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] = __x[__i]; + } + + void operator*=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] *= __x[__i]; + } + + void operator/=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] /= __x[__i]; + } + + void operator%=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] %= __x[__i]; + } + + void operator+=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] += __x[__i]; + } + + void operator-=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] -= __x[__i]; + } + + void operator^=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] ^= __x[__i]; + } + + void operator&=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] &= __x[__i]; + } + + void operator|=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] |= __x[__i]; + } + + void operator<<=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] <<= __x[__i]; + } + + void operator>>=(const valarray& __x) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] >>= __x[__i]; + } + + void operator=(const value_type& __c) const { + size_t __index = _M_slice.start(); + for (size_t __i = 0; + __i < _M_slice.size(); + ++__i, __index += _M_slice.stride()) + _M_array[__index] = __c; + } + + ~slice_array() {} + +private: + slice_array(const slice& __slice, valarray<_Tp>& __array) + : _M_slice(__slice), _M_array(__array) + {} + + slice _M_slice; + valarray<_Tp>& _M_array; + +private: // Disable assignment and default constructor + slice_array(); +}; + +// valarray member functions dealing with slice and slice_array + +template +inline valarray<_Tp>::valarray(const slice_array<_Tp>& __x) + : _Valarray_base<_Tp>(__x._M_slice.size()) +{ + typedef typename __type_traits<_Tp>::has_trivial_default_constructor + _Is_Trivial; + _M_initialize(_Is_Trivial()); + *this = __x; +} + +// Behavior is undefined if __x and *this have different sizes +template +valarray<_Tp>& valarray<_Tp>::operator=(const slice_array<_Tp>& __x) +{ + size_t __index = __x._M_slice.start(); + for (size_t __i = 0; + __i < __x._M_slice.size(); + ++__i, __index += __x._M_slice.stride()) + (*this)[__i] = __x._M_array[__index]; + return *this; +} + +template +valarray<_Tp> valarray<_Tp>::operator[](slice __slice) const { + valarray<_Tp> __tmp(__slice.size(), _NoInit()); + size_t __index = __slice.start(); + for (size_t __i = 0; + __i < __slice.size(); + ++__i, __index += __slice.stride()) + __tmp[__i] = (*this)[__index]; + return __tmp; +} + +template +inline slice_array<_Tp> valarray<_Tp>::operator[](slice __slice) { + return slice_array<_Tp>(__slice, *this); +} + +//---------------------------------------------------------------------- +// gslice and gslice_array + +struct _Gslice_Iter; + +class gslice { + friend struct _Gslice_Iter; +public: + gslice() : _M_start(0), _M_lengths(0), _M_strides(0) {} + gslice(size_t __start, + const valarray& __lengths, const valarray& __strides) + : _M_start(__start), _M_lengths(__lengths), _M_strides(__strides) + {} + + size_t start() const { return _M_start; } + valarray size() const { return _M_lengths; } + valarray stride() const { return _M_strides; } + + // Extension: check for an empty gslice. + bool _M_empty() const { return _M_lengths.size() == 0; } + + // Extension: number of indices this gslice represents. (For a degenerate + // gslice, they're not necessarily all distinct.) + size_t _M_size() const { + return !this->_M_empty() + ? accumulate(_M_lengths._M_first + 1, + _M_lengths._M_first + _M_lengths._M_size, + _M_lengths[0], + multiplies()) + : 0; + } + +private: + size_t _M_start; + valarray _M_lengths; + valarray _M_strides; +}; + +// This is not an STL iterator. It is constructed from a gslice, and it +// steps through the gslice indices in sequence. See 23.3.6 of the C++ +// standard, paragraphs 2-3, for an explanation of the sequence. At +// each step we get two things: the ordinal (i.e. number of steps taken), +// and the one-dimensional index. + +struct _Gslice_Iter { + _Gslice_Iter(const gslice& __gslice) + : _M_step(0), _M_1d_idx(__gslice.start()), + _M_indices(size_t(0), __gslice._M_lengths.size()), + _M_gslice(__gslice) + {} + + bool _M_done() const { return _M_indices[0] == _M_gslice._M_lengths[0]; } + + bool _M_incr() { + size_t __dim = _M_indices.size() - 1; + ++_M_step; + while (true) { + _M_1d_idx += _M_gslice._M_strides[__dim]; + if (++_M_indices[__dim] != _M_gslice._M_lengths[__dim]) + return true; + else if (__dim != 0) { + _M_1d_idx -= + _M_gslice._M_strides[__dim] * _M_gslice._M_lengths[__dim]; + _M_indices[__dim] = 0; + --__dim; + } + else + return false; + } + } + + size_t _M_step; + size_t _M_1d_idx; + + valarray _M_indices; + const gslice& _M_gslice; +}; + +template +class gslice_array { + friend class valarray<_Tp>; +public: + typedef _Tp value_type; + + void operator= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] = __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator*= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] *= __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator/= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] /= __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator%= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] %= __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator+= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] += __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator-= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] -= __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator^= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] ^= __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator&= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] &= __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator|= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] |= __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator<<= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] <<= __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator>>= (const valarray& __x) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] >>= __x[__i._M_step]; while(__i._M_incr()); + } + } + + void operator= (const value_type& __c) const { + if (!_M_gslice._M_empty()) { + _Gslice_Iter __i(_M_gslice); + do _M_array[__i._M_1d_idx] = __c; while(__i._M_incr()); + } + } + + ~gslice_array() {} + +private: + gslice_array(gslice __gslice, valarray<_Tp>& __array) + : _M_gslice(__gslice), _M_array(__array) + {} + + gslice _M_gslice; + valarray& _M_array; + +private: // Disable assignment + void operator=(const gslice_array&); +}; + +// valarray member functions dealing with gslice and gslice_array. Note +// that it is illegal (behavior is undefined) to construct a gslice_array +// from a degenerate gslice. + +template +inline valarray<_Tp>::valarray(const gslice_array<_Tp>& __x) + : _Valarray_base<_Tp>(__x._M_gslice._M_size()) +{ + typedef typename __type_traits<_Tp>::has_trivial_default_constructor + _Is_Trivial; + _M_initialize(_Is_Trivial()); + *this = __x; +} + +// Behavior is undefined if __x and *this have different sizes, or if +// __x was constructed from a degenerate gslice. +template +valarray<_Tp>& valarray<_Tp>::operator=(const gslice_array<_Tp>& __x) +{ + if (this->size() != 0) { + _Gslice_Iter __i(__x._M_gslice); + do + (*this)[__i._M_step] = __x._M_array[__i._M_1d_idx]; + while(__i._M_incr()); + } + return *this; +} + +template +inline gslice_array<_Tp> valarray<_Tp>::operator[](gslice __slice) { + return gslice_array<_Tp>(__slice, *this); +} + +template +valarray<_Tp> valarray<_Tp>::operator[](gslice __slice) const +{ + valarray __tmp(__slice._M_size(), _NoInit()); + if (__tmp.size() != 0) { + _Gslice_Iter __i(__slice); + do __tmp[__i._M_step] = (*this)[__i._M_1d_idx]; while(__i._M_incr()); + } + return __tmp; +} + +//---------------------------------------------------------------------- +// mask_array + +template +class mask_array { + friend class valarray<_Tp>; +public: + typedef _Tp value_type; + + void operator=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] = __x[__idx++]; + } + + void operator*=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] *= __x[__idx++]; + } + + void operator/=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] /= __x[__idx++]; + } + + void operator%=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] %= __x[__idx++]; + } + + void operator+=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] += __x[__idx++]; + } + + void operator-=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] -= __x[__idx++]; + } + + void operator^=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] ^= __x[__idx++]; + } + + void operator&=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] &= __x[__idx++]; + } + + void operator|=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] |= __x[__idx++]; + } + + void operator<<=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] <<= __x[__idx++]; + } + + void operator>>=(const valarray& __x) const { + size_t __idx = 0; + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] >>= __x[__idx++]; + } + + void operator=(const value_type& __c) const { + for (size_t __i = 0; __i < _M_array.size(); ++__i) + if (_M_mask[__i]) _M_array[__i] = __c; + } + + ~mask_array() {} + + // Extension: number of true values in the mask + size_t _M_num_true() const { + size_t __result = 0; + for (size_t __i = 0; __i < _M_mask.size(); ++__i) + if (_M_mask[__i]) ++__result; + return __result; + } + +private: + mask_array(const valarray& __mask, valarray<_Tp>& __array) + : _M_mask(__mask), _M_array(__array) + {} + + valarray _M_mask; + valarray<_Tp>& _M_array; + +private: // Disable assignment + void operator=(const mask_array&); +}; + +// valarray member functions dealing with mask_array + +template +inline valarray<_Tp>::valarray(const mask_array<_Tp>& __x) + : _Valarray_base<_Tp>(__x._M_num_true()) +{ + typedef typename __type_traits<_Tp>::has_trivial_default_constructor + _Is_Trivial; + _M_initialize(_Is_Trivial()); + *this = __x; +} + +// Behavior is undefined if __x._M_num_true() != this->size() +template +inline valarray<_Tp>& valarray<_Tp>::operator=(const mask_array<_Tp>& __x) { + size_t __idx = 0; + for (size_t __i = 0; __i < __x._M_array.size(); ++__i) + if (__x._M_mask[__i]) (*this)[__idx++] = __x._M_array[__i]; + return *this; +} + +template +inline mask_array<_Tp> valarray<_Tp>::operator[](const valarray& __mask) +{ + return mask_array<_Tp>(__mask, *this); +} + +template +valarray<_Tp> valarray<_Tp>::operator[](const valarray& __mask) const +{ + size_t __size = 0; + { + for (size_t __i = 0; __i < __mask.size(); ++__i) + if (__mask[__i]) ++__size; + } + + valarray __tmp(__size, _NoInit()); + size_t __idx = 0; + { + for (size_t __i = 0; __i < __mask.size(); ++__i) + if (__mask[__i]) __tmp[__idx++] = (*this)[__i]; + } + + return __tmp; +} + +//---------------------------------------------------------------------- +// indirect_array + +template +class indirect_array { + friend class valarray<_Tp>; +public: + typedef _Tp value_type; + + void operator=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] = __x[__i]; + } + + void operator*=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] *= __x[__i]; + } + + void operator/=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] /= __x[__i]; + } + + void operator%=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] %= __x[__i]; + } + + void operator+=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] += __x[__i]; + } + + void operator-=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] -= __x[__i]; + } + + void operator^=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] ^= __x[__i]; + } + + void operator&=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] &= __x[__i]; + } + + void operator|=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] |= __x[__i]; + } + + void operator<<=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] <<= __x[__i]; + } + + void operator>>=(const valarray& __x) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] >>= __x[__i]; + } + + void operator=(const value_type& __c) const { + for (size_t __i = 0; __i < _M_addr.size(); ++__i) + _M_array[_M_addr[__i]] = __c; + } + + ~indirect_array() {} + +private: + indirect_array(const valarray& __addr, valarray<_Tp>& __array) + : _M_addr(__addr), _M_array(__array) + {} + + valarray _M_addr; + valarray<_Tp>& _M_array; + +private: // Disable assignment + void operator=(const indirect_array&); +}; + +// valarray member functions dealing with indirect_array + +template +inline valarray<_Tp>::valarray(const indirect_array<_Tp>& __x) + : _Valarray_base<_Tp>(__x._M_addr.size()) +{ + typedef typename __type_traits<_Tp>::has_trivial_default_constructor + _Is_Trivial; + _M_initialize(_Is_Trivial()); + *this = __x; +} + +template +valarray<_Tp>& valarray<_Tp>::operator=(const indirect_array<_Tp>& __x) { + for (size_t __i = 0; __i < __x._M_addr.size(); ++__i) + (*this)[__i] = __x._M_array[__x._M_addr[__i]]; + return *this; +} + +template +inline indirect_array<_Tp> +valarray<_Tp>::operator[](const valarray& __addr) +{ + return indirect_array<_Tp>(__addr, *this); +} + +template +valarray<_Tp> +valarray<_Tp>::operator[](const valarray& __addr) const +{ + valarray<_Tp> __tmp(__addr.size(), _NoInit()); + for (size_t __i = 0; __i < __addr.size(); ++__i) + __tmp[__i] = (*this)[__addr[__i]]; + return __tmp; +} + +//---------------------------------------------------------------------- +// Other valarray noninline member functions + +// Shift and cshift + +template +valarray<_Tp> valarray<_Tp>::shift(int __n) const +{ + valarray<_Tp> __tmp(this->size()); + + if (__n >= 0) { + if (__n < this->size()) + copy(this->_M_first + __n, this->_M_first + this->size(), + __tmp._M_first); + } + else { + if (-__n < this->size()) + copy(this->_M_first, this->_M_first + this->size() + __n, + __tmp._M_first - __n); + } + return __tmp; +} + +template +valarray<_Tp> valarray<_Tp>::cshift(int __m) const +{ + valarray<_Tp> __tmp(this->size()); + + // Reduce __m to an equivalent number in the range [0, size()). We + // have to be careful with negative numbers, since the sign of a % b + // is unspecified when a < 0. + long __n = __m; + if (this->size() < numeric_limits::max()) + __n %= long(this->size()); + if (__n < 0) + __n += this->size(); + + copy(this->_M_first, this->_M_first + __n, + __tmp._M_first + (this->size() - __n)); + copy(this->_M_first + __n, this->_M_first + this->size(), + __tmp._M_first); + + return __tmp; +} + +__STL_END_NAMESPACE + +#endif /* __SGI_STL_VALARRAY */ + + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/vector b/src/UWE_projectCode/SGI STL源码/SGI STL源码/vector new file mode 100644 index 0000000..272f60f --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/vector @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_VECTOR +#define __SGI_STL_VECTOR + +#include +#include +#include +#include +#include +#include +#include + +#endif /* __SGI_STL_VECTOR */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/SGI STL源码/SGI STL源码/vector.h b/src/UWE_projectCode/SGI STL源码/SGI STL源码/vector.h new file mode 100644 index 0000000..f48d4fd --- /dev/null +++ b/src/UWE_projectCode/SGI STL源码/SGI STL源码/vector.h @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Hewlett-Packard Company makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * + * Copyright (c) 1996 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +#ifndef __SGI_STL_VECTOR_H +#define __SGI_STL_VECTOR_H + +#include +#include +#include +#include + +#ifdef __STL_USE_NAMESPACES +using __STD::vector; +#endif /* __STL_USE_NAMESPACES */ + +#endif /* __SGI_STL_VECTOR_H */ + +// Local Variables: +// mode:C++ +// End: diff --git a/src/UWE_projectCode/Tcls/Tcls/.formality.tcl.swp b/src/UWE_projectCode/Tcls/Tcls/.formality.tcl.swp new file mode 100644 index 0000000000000000000000000000000000000000..e2892576bb5c13626e5f377e66d9a378dc95bb8a GIT binary patch literal 16384 zcmeI3Uu+yl9mgka2^2_LQK?U@H2CbQExMcYpZo&_)j6MKC%O3QbCO1B812o@-fg_M zyWN?)+E|w&cX#C_xzDn== z%Guj@X+2m4tO8a6tAJI&Dqt0`3RnfK0{=G(==cuu3|f0f*5b?Ae&4|U&g?tQ_R9n3 zv#)k%6|f3e1*`&A0jq#jz$#!BunJfOtO8a6tHA%D0uJ8VPoiBPn}i?l|JU>X*Y6?Z zpWqen5Ab{NJMcXCF<1r{z!RVV_Je;NB;#j-Z-V>5D+dVq1!w>d%z}r& zf4@w~2jG41XYdE`eeevp0#1T?@Bp|ET>BCse*wP*FN3RqgG=B^z`z*zkn#%i!CKJck!zY-jRv#tD%9zVWTIa-{UI>%?*K~QS? zakoo#Q-&y(8)755p7-I5NXyZpi8s_;k~7T|QK+;NYMR%pv7~X7XzG8RonKfy#TK2| zcjp(lj$+oT`$}^(vbeQfvW?wl5&FE}ssO!f8A7uh=@PQtWmik{Wxj-KR>BE+B2gY! zy_MDaMGt4SF7bwymXKEj%fr;P1Dl)IlXl~dFDR|%Gfi%&r7v1`Tuq#lAr6SGZg;KX#LDq0@A4 z-!0s8wHk`VY4M4eCo6m6R`1NMmZI5m;;lt!$WTPBcxP=)5YUv~=eWOpGatL^RcY5~ft?@ikz@GZ3(pwBJioCQo-rgSKMGUV z2+W9%h<1`lECt+jokD#@vvGAKUBA$aN+*8Upy{+rAN8<&5m>%Fx?b$kEv{o0mrhd= zxpK(SG#ho?`oKM~8Zx)el^CB0CXTXNrNmD-;c`W`3T}O1A!bfurth0s(oxvB4E%7J zqf-+nStY%}8HX3=YD+U*sbYNWSSOq+3gdIA1xRiYQxqN6im0fa2ubt3o*G^2n*_QH zBb*_M)vDsIC}7TQ$0NPzMs++oiVrhh582Y%x!K_?FcF|?nyyQI;b??cwgl$wFjdwJ zfn3NS;ISVn>N$ausSTzMKjc^*V?yIPaY7Y1T2h^~$ZZEw(R$#BWnPa~Qe8H>)oJU9rybi9#awdI4tcEmR5S-% zksTN=EK}D*cDHFm7Ft*xASkO{mPnIBtgpxlINg&>xguR?ZB@<{>Gk%n$*vbw?V#T! zlC^Zes#fW7npQiK8sqy#xgrIvJE}=XW!QPRR$82|rfa1~7@AwH7F6>R?u_2;G*V!( zgSCOwGU1;2t-QHwHqODIlJ?3O6v@t}{$0dof5B=JU6w*u9o?)+tuaXUN}K%uB=TgF zPn-OoW_jcb$mi$4yU5w!0@uJB;E&)p;5^s|UPA8vOYkCi0bBtAxF7rpdAbig-~s`j z1Q$UGoB$7jk5TtW;6LC4VA}E_u$xuDDqt0`3RnfK0#*U5fK|XMa4QPra;~hm8@U|v zk`-T@PvjsXrW^l-%aH~#P|z#7m#{FeWe%DH*Ne9b<{51-kMhzlnJ<%X(65bM;A5>Z zmygYjRS3!6{vhY>QnLOQqH_4~k*SRrOKch&Pmh^Dd3hF(cA50rN^MIG6R$HfCIS5Hmu{P+>3ifeDB$#|8wH#`b=v~& tmfOt&?v~e`3D{TLmI7{mx0!`t?;u`%q%x)vcuR4(+s^yN+-={G^iwEd`33+0 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/Tcls/Tcls/formality.tcl b/src/UWE_projectCode/Tcls/Tcls/formality.tcl new file mode 100644 index 0000000..0e757ec --- /dev/null +++ b/src/UWE_projectCode/Tcls/Tcls/formality.tcl @@ -0,0 +1,138 @@ +source "./Tcls/ProjectPathSetting.tcl" + +exec date + +source "./Tcls/setModuleName.tcl" + +source "./Tcls/parameter_fm.tcl" + +set PP [exec bash $env(SCRIPTPATH)/setPP.sh] +echo "PP = ${PP}" + +set netlistfile ./${PP}/result/$Design.sv +#set sdcfile ./${PP}/report/$Design.sdc +set svffile ./${PP}/report/$Design.svf + +############################################ +#setup +############################################ +set run_dc false +set run_pt false +set synopsys_auto_setup true +#set hdlin_unresolved_modules black_box +#set hdlin_dwroot /space/CAD_Front_End/Synopsys2013/H-2013.03-SP2/ +#set hdlin_dwroot /CAD/Synopsys2015/syn_vK-2015.06/ +#set hdlin_dwroot /space/CAD_Front_End/Synopsys2019/syn + +if {$Design=={PCIE_Top}} then { +set hdlin_ignore_translate true +set verification_verify_unread_tech_cell_pins false +} + +############################################ +#SVF +############################################ +set_svf $svffile + +source -echo "${PROJECTPATH}/syn/synopsys_dc.setup" + +############################################ +#Read db +############################################ +#read_db RHSTD_ss0p99vn40c.db +read_db $link_library + +if {$Design=={SMC_Top}} then { +read_db $PROJECTPATH/syn/db_sc12l28/SMC_BankMem.db +} + +############################################ +#RTL code +############################################ +if { [string match *fullchip* $Design]} then { +echo "current design is $Design" +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/stdlib/version.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/stdlib/config.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/stdlib/stdlib.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/stdlib/stdio.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/util/util.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/amba/amba.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/amba/devices.vhd +read_vhdl -container r -libname techmap $PROJECTPATH/src/SPI/rtl/gencomp.vhd +read_vhdl -container r -libname gaisler $PROJECTPATH/src/SPI/rtl/SPI_syncram_2p_tx.vhd +read_vhdl -container r -libname gaisler $PROJECTPATH/src/SPI/rtl/SPI_syncram_2p_rx.vhd +read_vhdl -container r -libname gaisler $PROJECTPATH/src/SPI/rtl/spictrlx_extended.vhd +} + +read_sverilog -container r -libname work -define {_USE_SYNED_COREPAC_} -f ./nc.work/sim_filelist.f + +###read_verilog -container r -libname work $PROJECTPATH/CorePac/MBIST_Ctrl/mgc_utility.v + +set_top r:/work/$Design + + +############################################ +#netlist +############################################ +read_verilog -container i -libname work -01 $netlistfile + +set_top i:/work/$Design + +if {$Design=={PCIE_Top}} then { +set_constant -type port r:/WORK/PCIE_Top/mbist_en 0 +set_constant -type port i:/WORK/PCIE_Top/mbist_en 0 +set_constant -type port r:/WORK/PCIE_Top/test_en 0 +set_constant -type port i:/WORK/PCIE_Top/test_en 0 +set_constant -type port r:/WORK/PCIE_Top/test_clk 0 +set_constant -type port i:/WORK/PCIE_Top/test_clk 0 +set_constant -type port r:/WORK/PCIE_Top/scan_reset 0 +set_constant -type port i:/WORK/PCIE_Top/scan_reset 0 + +} +############################################ +#match +############################################ +#if {$Design=={RapidIO_top}} then { +#set_constant -type port r:/WORK/RapidIO_top/mbist_en 0 +#set_constant -type port i:/WORK/RapidIO_top/mbist_en 0 +#} + +match + +############################################ +#verify +############################################ +if {$Design=={M8024V_FullChip}} then { +set_dont_verify { +r:/WORK/M8024V_FullChip/AAAA_M8024V_top/AAA_efuse/efuse_ctrl_state/u028efuhc01603218400/VDD +r:/WORK/M8024V_FullChip/AAAA_M8024V_top/AAA_efuse/efuse_ctrl_state/u028efuhc01603218400/VSS +r:/WORK/M8024V_FullChip/AAAA_M8024V_top/AAA_efuse/efuse_ctrl_state/u028efuhc01603218400/VQPS +} +} + +if {$Design=={M66AK_FullChip}} then { +set_dont_verify { +r:/WORK/M66AK_FullChip/AAAA_M66AK/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VDD +r:/WORK/M66AK_FullChip/AAAA_M66AK/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VSS +r:/WORK/M66AK_FullChip/AAAA_M66AK/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VQPS +} +} + +if {$Design=={M6674_FullChip}} then { +set_dont_verify { +r:/WORK/M6674_FullChip/AAAA_M6674/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VDD +r:/WORK/M6674_FullChip/AAAA_M6674/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VSS +r:/WORK/M6674_FullChip/AAAA_M6674/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VQPS +} +} + +verify + +exec date +%Y_%m%d_%H%M + +exec cp fm.log ${PP}/fm.log +exec cp formality_svf/svf.txt ${PP}/fm_svf.txt + +exit + +##debug## diff --git a/src/UWE_projectCode/Tcls/Tcls/lib_to_db.tcl b/src/UWE_projectCode/Tcls/Tcls/lib_to_db.tcl new file mode 100644 index 0000000..a168cc9 --- /dev/null +++ b/src/UWE_projectCode/Tcls/Tcls/lib_to_db.tcl @@ -0,0 +1,9 @@ +source "./Tcls/ProjectPathSetting.tcl" +source "./Tcls/parameter_pt.tcl" +set PP [exec bash $env(SCRIPTPATH)/setPP.sh] +echo "PP = ${PP}" + +source "./Tcls/setModuleName.tcl" +read_lib ./${PP}/result/$Design.lib +write_lib $Design -o ./${PP}/result/$Design.db +exit diff --git a/src/UWE_projectCode/Tcls/Tcls/pt.tcl b/src/UWE_projectCode/Tcls/Tcls/pt.tcl new file mode 100644 index 0000000..ce126a5 --- /dev/null +++ b/src/UWE_projectCode/Tcls/Tcls/pt.tcl @@ -0,0 +1,86 @@ +source "./Tcls/ProjectPathSetting.tcl" + +set sh_enable_page_mode true +set power_enable_analysis true +set run_dc false +set run_pt true + +source "./Tcls/setModuleName.tcl" +source "./Tcls/parameter_pt.tcl" + +set pt_date [exec date +%Y_%m%d_%H%M] + +set PP [exec bash $env(SCRIPTPATH)/setPP.sh] +echo "PP = ${PP}" + +source "${PROJECTPATH}/syn/synopsys_dc.setup" + +set timing_non_unate_clock_compatibility true + +echo $env(FLAT) +if { $env(FLAT) == "TRUE"} { +source "./dc.work/filelist_pt.v" +set sdcfile1 $env(SDCPATH)/${Design}_flatten.sdc +} else { +set netlistfile ./${PP}/result/$Design.sv +set sdcfile1 $env(SDCPATH)/${Design}.sdc +} +#set sdcfile1 ./${PP}/report/$Design.sdc +set sdcfile2 ${PROJECTPATH}/syn/sdc/synopsys.sdc +set specialfile ./dc.work/syn_specific.tcl + +read_verilog $netlistfile +current_design $Design + +link_design + +source -echo $sdcfile1 +source -echo $sdcfile2 +source -echo $specialfile +#source -echo "${PROJECTPATH}/syn/set_library.tcl" + +echo $env(DEBUGSDC) +if { $env(DEBUGSDC) == "TRUE"} { + return +} + +check_timing -include {clock_crossing} -verbose > check_timing_pt.txt +if { $env(FLAT) == "TRUE"} { +exec perl $env(SCRIPTPATH)/clock_cross.pl check_timing_pt.txt ${Design}_FLAT_clock_cross.log +} else { +exec perl $env(SCRIPTPATH)/clock_cross.pl check_timing_pt.txt ${Design}_clock_cross.log +} + +group_path -name in2reg -from [all_inputs] +group_path -name reg2out -to [all_outputs] +group_path -name in2out -from [all_inputs] -to [all_outputs] +group_path -name reg2reg -from [all_registers] -to [all_registers] + +report_timing -group [get_path_groups] -max_paths 1000 -transition_time -capacitance > report_timing_pt.txt + +echo $env(CHECKTIMING) +if { $env(CHECKTIMING) == "TRUE"} { + return +} + +if { ! [string match *FullChip $Design]} then { +echo "current design is $Design" +set extract_model_clock_transition_limit 0.4 +set extract_model_capacitance_limit 0.4 +set extract_model_data_transition_limit 0.4 +set extract_model_num_capacitance_points 5 +set extract_model_num_clock_transition_points 5 +set extract_model_num_data_transition_points 5 +extract_model -output ./${PP}/result/$Design -format lib -library_cell +} + +exec cp pt.log ${PP}/pt.log +exec cp check_timing_pt.txt ${PP}/check_timing_pt.txt +exec cp report_timing_pt.txt ${PP}/report_timing_pt.txt +if { $env(FLAT) == "TRUE"} { +exec cp ${Design}_FLAT_clock_cross.log ${PP}/${Design}_FLAT_clock_cross.log +} else { +exec cp ${Design}_clock_cross.log ${PP}/${Design}_clock_cross.log +} + +exit diff --git a/src/UWE_projectCode/Tcls/Tcls/syn_main.tcl b/src/UWE_projectCode/Tcls/Tcls/syn_main.tcl new file mode 100644 index 0000000..766e519 --- /dev/null +++ b/src/UWE_projectCode/Tcls/Tcls/syn_main.tcl @@ -0,0 +1,348 @@ +set run_dc true +set run_pt false + +set RTL_DC_ID "" +set RTL_SIM_ID "" + +source -echo "./Tcls/ProjectPathSetting.tcl" +source -echo "./Tcls/parameter_syn.tcl" + +#-------------------------------------------------------------- +# NOTE: CHANGE DESIGN NAME TO YOUR OWN + +source -echo "./synopsys_dc.setup" +source -echo "./Tcls/setModuleName.tcl" + +if { [string match *FullChip $Design]} then { + echo "current design is $Design" + #source -echo "RTL_SIM_ID.tcl" + #source -echo "RTL_DC_ID.tcl" + if { $RTL_DC_ID != $RTL_SIM_ID} then { + echo "RTL_DC_ID != RTL_SIM_ID" + echo "RTL_DC_ID = $RTL_DC_ID" + echo "RTL_SIM_ID = $RTL_SIM_ID" + return + } +} + +#-------------------------------------------------------------- +#Reload ddc +echo $LOADDDC +if { $LOADDDC == "TRUE"} { + read_ddc $env(PP)/report/${Design}.ddc + return +} +#-------------------------------------------------------------- +set dc_date [exec date +%Y_%m%d_%H%M] +exec mkdir dc.work/${Design}_${dc_date} +exec mkdir dc.work/${Design}_${dc_date}/result +exec mkdir dc.work/${Design}_${dc_date}/report + +remove_design -all + +#-------------------------------------------------------------- + +set view_command_win {true} +set_host_options -max_cores 16 + +set compile_enable_async_mux_mapping {true} +set template_naming_style {%s_%p} +set template_parameter_style {%d} +set template_separator_style {_} + +set hdl_keep_licenses {false} +set hdlin_ff_always_async_set_reset {true} +set hdlin_latch_always_async_set_reset {true} +set hdlin_ff_always_sync_set_reset {false} +##set hdlin_use_carry_in true +set hdlin_check_no_latch {true} +set hdlin_mux_size_limit {32} +set hdlin_shorten_long_module_name true +set hdlin_while_loop_iterations 8192 +set hdlin_module_name_limit 128 + +set verilogout_equation {false} +set verilogout_single_bit {false} +set verilogout_higher_designs_first {true} +set verilogout_no_tri {true} +#set verilogout_show_unconnected_pins {false} +set verilogout_show_unconnected_pins {true} + +define_name_rules M2G_MODULE_LEVEL -allowed "A-Z a-z 0-9 _" ; +define_name_rules M2G_MODULE_LEVEL -first_restricted "0-9" ; +define_name_rules M2G_MODULE_LEVEL -replacement_char "_" ; +define_name_rules M2G_MODULE_LEVEL -collapse_name_space ; +define_name_rules M2G_MODULE_LEVEL -case_insensitive ; +define_name_rules M2G_MODULE_LEVEL -remove_internal_net_bus ; +define_name_rules M2G_MODULE_LEVEL -equal_ports_nets ; +define_name_rules M2G_MODULE_LEVEL -add_dummy_nets ; +define_name_rules M2G_MODULE_LEVEL -max_length 128 -type port ; +define_name_rules M2G_MODULE_LEVEL -max_length 64 -type cell ; +define_name_rules M2G_MODULE_LEVEL -max_length 64 -type net ; + +set default_name_rules M2G_MODULE_LEVEL ; + +set bus_dimension_separator_style {_} +set bus_naming_style {%s[%d]} +set bus_range_separator_style {:} +set bus_inference_descending_sort {true} +set bus_inference_style {%s[%d]} +#set write_name_nets_same_as_ports {false} +set write_name_nets_same_as_ports {true} +set bus_minus_style {-%d} +set bus_extraction_style {%s[%d:%d]} + +set change_names_dont_change_bus_members {false} +set uniquify_naming_style %s_%d + +set compile_instance_name_prefix {U} +set compile_instance_name_suffix {} + +set compile_preserve_subdesign_interfaces {true} +set compile_assume_fully_decoded_three_state_busses {false} +set compile_disable_hierarchical_inverter_opt {true} +set enable_recovery_removal_arcs {false} + +set fsm_auto_inferring {true} +set gen_show_created_symbols {true} +set case_analysis_with_logic_constants {true} +set power_cg_auto_identify {true} +set compile_auto_ungroup_count_leaf_cells {true} +set compile_auto_ungroup_override_wlm {true} + +set compile_delete_unloaded_sequential_cells {true} +set compile_seqmap_propagate_constants {true} +set compile_seqmap_propagate_high_effort {true} +set compile_seqmap_propagate_constants_size_only {true} + +set_svf dc.work/${Design}_${dc_date}/report/${Design}.svf + +#-------------------------------------------------------------- +#void warning Info # +#-------------------------------------------------------------- +#suppress_message HDL-193 +#suppress_message LINT-45 +#suppress_message OPT-1056 +#suppress_message PWR-877 +#set suppress_errors {VHDL-2285} + +#-------------------------------------------------------------- +#read↦ link↦ Check design# +#-------------------------------------------------------------- +set DESIGN_RTL_DIR ../cv32e40p-master/rtl + +source -echo "./dc.work/specific_filelist.tcl" +analyze -f SVERILOG -library work -vcs "-f ./nc.work/sim_filelist.f" +redirect -append -file dc.log {elaborate $Design} +current_design $Design +#link +if { [link] == 0} { + echo "Link failed!" + echo $CHECKCODE + if { $CHECKCODE == "TRUE"} { + exit + } + return +} + +#**set timing_enable_multiple_clocks_per_reg true +check_design > dc.work/${Design}_${dc_date}/report/${Design}_check_design.txt + +echo $CHECKCODE +if { $CHECKCODE == "TRUE"} { + echo "Link success!" + exit +} + +#-------------------------------------------------------------- +# set library +# NOTE: ADD YOUR OWN LIBRARY +# ------------------------------------------------------------- +#set_operating_conditions ssg_cworst_max_0p81v_m40c +#set zerowireload Zero +#set auto_wire_load_selection false +#set_wire_load_mode top +##set_wire_load_model -name "$zerowireload" [current_design] +#current_design $Design +source -echo "${PROJECTPATH}/syn/set_library.tcl" + +#------------------------------------------------------------------ +#set_dont_use +source -echo "${PROJECTPATH}/syn/dont_use.tcl" +#------------------------------------------------------------------ + +#remove_license HDL-Compiler + +#change name before compile +report_names -rules verilog -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_1.rpt +redirect -append -file dc.log {change_names -rules verilog -hierarchy -verbose} +report_names -rules M2G_MODULE_LEVEL -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_2.rpt +redirect -append -file dc.log {change_names -rules M2G_MODULE_LEVEL -hierarchy -verbose} + + +#-------------------------------------------------------------- +# read clock set and input output constraints +# NOTE: CHANGE FILE NAME TO YOUR OWN +# --------------------------------------------------------------- +echo $DEBUGSDC +if { $DEBUGSDC == "TRUE"} { + return +} + +redirect -append -file dc.log {source -echo "$SDCPATH/${Design}.sdc"} +source -echo "$SDCPATH/synopsys.sdc" + +#----------------------------------------------------------------- +#set dont_touch design +#----------------------------------------------------------------- +source -echo ./dc.work/syn_specific.tcl + +uniquify -dont_skip_empty_designs + +#---------------------------------------------------------------------------- +#set UPF file +#NOTE: +# +#load_upf MatrixIP_top_u2.upf +#set upf_allow_DD_primary_with_supply_sets true +#set_voltage 0.81 -object_list {VDD VDD1sw VDD2sw} +#set_voltage 0.0 -object_list {VSS} +##insert_mv_cells -isolation -verbose +#check_mv_design -verbose + +#-------------------------------------------------------------- +#check design +report_port -verbose > dc.work/${Design}_${dc_date}/report/${Design}_port.txt +report_clock > dc.work/${Design}_${dc_date}/report/${Design}_clock.txt + + +set_fix_multiple_port_nets -all -buffer_constants -feedthroughs [ get_designs "*" ] + +current_design $Design + +#set_ultra_optimization true + +set_max_dynamic_power 0.0 + +#ungroup -all -flatten + +#set ports_clock_root [filter_collection [get_attribute [get_clocks] sources] object_class==port] +#group_path -name REGOUT -to [all_outputs] +#group_path -name REGIN -from [remove_from_collection [all_inputs] $ports_clock_root] +#group_path -name FEEDTHROUGH -from [remove_from_collection [all_inputs] $ports_clock_root] -to [all_outputs] + +group_path -name in2reg -from [all_inputs] -critical_range 1000.0 +group_path -name reg2out -to [all_outputs] -critical_range 1000.0 +group_path -name in2out -from [all_inputs] -to [all_outputs] -critical_range 1000.0 +group_path -name reg2reg -from [all_registers] -to [all_registers] -critical_range 1000.0 + +#set_compile_directives -constant_propagation true [get_cells -hierarchical *] + +set_cost_priority -delay +set_critical_range 0.2 $Design +redirect -append -file dc.log {remove_unconnected_ports [get_cells -hier * ] } + +check_design > dc.work/${Design}_${dc_date}/report/${Design}_check_design_aftercom.txt +analyze_datapath_extraction > dc.work/${Design}_${dc_date}/report/${Design}_analyze_datapath_extraction.rpt + +compile_ultra -no_autoungroup -timing_high_effort -gate_clock -no_seq_output_inversion -scan +#compile_ultra -no_autoungroup -timing_high_effort -gate_clock -no_seq_output_inversion + +#foreach_in_collection desig [remove_from_collection [get_designs "*"] [get_designs {FADDSUB_top}]] { +# lappend rename_design_list $desig +#} + +#rename_design $rename_design_list -prefix FADDSUB_ +rename_design [remove_from_collection [get_designs "*"] $Design] -prefix ${Design}_ + + +#-------------------------------------------------------------- +#write_report + +if { [llength [get_cells main_gate -hier -filter "clock_gating_logic == true"]] != 0 } { + remove_clock_gating_check [get_cells main_gate -hier -filter "clock_gating_logic == true"] +} + + +report_names -rules verilog -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_3.rpt +redirect -append -file dc.log {change_names -rules verilog -hierarchy -verbose} +report_names -rules M2G_MODULE_LEVEL -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_4.rpt +redirect -append -file dc.log {change_names -rules M2G_MODULE_LEVEL -hierarchy -verbose} + +#write_report +write -format verilog -hierarchy $Design -output dc.work/${Design}_${dc_date}/result/${Design}.sv +write -format ddc -hierarchy -output dc.work/${Design}_${dc_date}/report/${Design}.ddc +report_timing -max 1000 -transition_time -capacitance > dc.work/${Design}_${dc_date}/report/${Design}_timing.txt +report_constraint -all_violators > dc.work/${Design}_${dc_date}/report/${Design}_constraint.txt +write_script > dc.work/${Design}_${dc_date}/report/${Design}.sdc +write_sdc -nosplit dc.work/${Design}_${dc_date}/report/${Design}.sdc +report_design > dc.work/${Design}_${dc_date}/report/${Design}_design.txt +report_reference -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_reference.rpt +report_net > dc.work/${Design}_${dc_date}/report/${Design}_net.rpt +report_names -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_names.rpt +report_resources -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_resource.rpt +report_multibit -hier > dc.work/${Design}_${dc_date}/report/${Design}_multibit.rpt +report_power > dc.work/${Design}_${dc_date}/report/${Design}_power.txt +report_qor > dc.work/${Design}_${dc_date}/report/${Design}_qor.txt +report_clock_tree_power > dc.work/${Design}_${dc_date}/report/${Design}_clkpower.txt +report_clock_gating > dc.work/${Design}_${dc_date}/report/${Design}_clock_gating.txt +report_area -nosplit -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_area.txt +report_timing -max 100 -transition_time -capacitance -group in2reg > dc.work/${Design}_${dc_date}/report/${Design}_in2reg +report_timing -max 100 -transition_time -capacitance -group reg2out > dc.work/${Design}_${dc_date}/report/${Design}_reg2out +report_timing -max 100 -transition_time -capacitance -group in2out > dc.work/${Design}_${dc_date}/report/${Design}_in2out +report_timing -max 100 -transition_time -capacitance -group reg2reg > dc.work/${Design}_${dc_date}/report/${Design}_reg2reg +check_timing -include {gated_clock clock_crossing} > dc.work/${Design}_${dc_date}/report/${Design}_check_timing.rpt +#report_timing \ +# -path full_clock \ +# -transition_time \ +# -crosstalk_delta \ +# -capacitance \ +# -input_pins \ +# -nets \ +# -delay max \ +# -derate \ +# -max_paths 100 > ${dc_date}/timing/${DESIGN}_${dc_date}_timing_dc.txt +# + +set_svf -off + +check_mv_design -verbose > dc.work/${Design}_${dc_date}/report/${Design}_check_upf.log + +#remove_design -hierarchy MatrixIP_Core_Scalar_PG +#remove_design -hierarchy MatrixIP_Core_Vector_PG + +#write -format verilog -hierarchy $Design -output dc.work/${Design}_${dc_date}/result/${Design}_hier.sv +#exec rm ../Netlist_9T_125C/${Design}.v +#exec cp dc.work/${Design}_${dc_date}/result/${Design}.sv ../Netlist_9T_125C/${Design}.v +#-------------------------------------------------------------- +#quit + +set dc_date0 [exec date +%Y_%m%d_%H%M] +echo ${dc_date} ${dc_date0} + +exec $SCRIPTPATH/get_DBs_info.sh +exec $SCRIPTPATH/report_dc_summary.sh +exec cp dc.work/${Design}_${dc_date}/report/${Design}_check_design.txt dc.work/${Design}_${dc_date}/check_design.txt +exec cp dc.work/${Design}_${dc_date}/report/${Design}_check_timing.rpt dc.work/${Design}_${dc_date}/check_timing.txt +exec cp dc.log dc.work/${Design}_${dc_date}/dc.log +exec cp command.log dc.work/${Design}_${dc_date}/command.log +exec cp RTL_DC_info.log dc.work/${Design}_${dc_date}/RTL_DC_info.log +exec cp RTL_DC_ID.tcl dc.work/${Design}_${dc_date}/RTL_DC_ID.tcl +exec cp update_RTL_SVN.sh dc.work/${Design}_${dc_date}/update_RTL_SVN.sh + +#remove_sdc +#source -echo "${PROJECTPATH}/syn/SDC/${Design}.sdc" + +source -echo "./dc.work/syn_specific_after.tcl" + +if { [file exists dc.work/${Design}_${dc_date}/result/${Design}.sv] == 1} { +exec mkdir NetlistSubmit/${Design}_${dc_date} +exec cp dc.work/${Design}_${dc_date}/result/${Design}.sv NetlistSubmit/${Design}_${dc_date}/ +exec cp dc.work/${Design}_${dc_date}/report/${Design}_qor.txt NetlistSubmit/${Design}_${dc_date}/ +#exec cp dc.work/${Design}_${dc_date}/report/${Design}_memory_clock.rpt NetlistSubmit/${Design}_${dc_date}/ +} + +echo $FLOW +if { $FLOW == "TRUE"} { + exit +} diff --git a/src/UWE_projectCode/finddialog查找搜索代码/UWE_file.pro b/src/UWE_projectCode/finddialog查找搜索代码/UWE_file.pro deleted file mode 100644 index e73f5e1..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/UWE_file.pro +++ /dev/null @@ -1,26 +0,0 @@ -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -CONFIG += c++11 - -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - finddialog.cpp \ - main.cpp \ - mainwindow.cpp - -HEADERS += \ - finddialog.h \ - mainwindow.h - -FORMS += \ - mainwindow.ui - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target diff --git a/src/UWE_projectCode/finddialog查找搜索代码/UWE_file.pro.user b/src/UWE_projectCode/finddialog查找搜索代码/UWE_file.pro.user deleted file mode 100644 index 1ec1387..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/UWE_file.pro.user +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - EnvironmentId - {9ae9cba5-5ab5-4831-839f-36c967a0caed} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - false - true - false - 0 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - - 0 - true - - -fno-delayed-template-parsing - - true - Builtin.BuildSystem - - true - true - Builtin.DefaultTidyAndClazy - 4 - - - - true - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop - Desktop Qt 5.12.12 MinGW 32-bit - Desktop Qt 5.12.12 MinGW 32-bit - qt.qt5.51212.win32_mingw73_kit - 0 - 0 - 0 - - 0 - E:\QTUWE\UWEproject\build-UWE_file-Desktop_Qt_5_12_12_MinGW_32_bit-Debug - E:/QTUWE/UWEproject/build-UWE_file-Desktop_Qt_5_12_12_MinGW_32_bit-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - - - E:\QTUWE\UWEproject\build-UWE_file-Desktop_Qt_5_12_12_MinGW_32_bit-Release - E:/QTUWE/UWEproject/build-UWE_file-Desktop_Qt_5_12_12_MinGW_32_bit-Release - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - E:\QTUWE\UWEproject\build-UWE_file-Desktop_Qt_5_12_12_MinGW_32_bit-Profile - E:/QTUWE/UWEproject/build-UWE_file-Desktop_Qt_5_12_12_MinGW_32_bit-Profile - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - 0 - - 3 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - true - - 2 - - Qt4ProjectManager.Qt4RunConfiguration:E:/QTUWE/UWEproject/UWE_file/UWE_file.pro - E:/QTUWE/UWEproject/UWE_file/UWE_file.pro - false - false - true - false - false - E:/QTUWE/UWEproject/build-UWE_file-Desktop_Qt_5_12_12_MinGW_32_bit-Debug - - 1 - - - - ProjectExplorer.Project.Target.1 - - Desktop - Desktop Qt 5.12.12 MinGW 64-bit - Desktop Qt 5.12.12 MinGW 64-bit - qt.qt5.51212.win64_mingw73_kit - 0 - 0 - 0 - - 0 - E:\QTUWE\UWEproject\build-UWE_file-Desktop_Qt_5_12_12_MinGW_64_bit-Debug - E:/QTUWE/UWEproject/build-UWE_file-Desktop_Qt_5_12_12_MinGW_64_bit-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - - - E:\QTUWE\UWEproject\build-UWE_file-Desktop_Qt_5_12_12_MinGW_64_bit-Release - E:/QTUWE/UWEproject/build-UWE_file-Desktop_Qt_5_12_12_MinGW_64_bit-Release - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - E:\QTUWE\UWEproject\build-UWE_file-Desktop_Qt_5_12_12_MinGW_64_bit-Profile - E:/QTUWE/UWEproject/build-UWE_file-Desktop_Qt_5_12_12_MinGW_64_bit-Profile - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - 0 - - 3 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - true - - 2 - - ProjectExplorer.CustomExecutableRunConfiguration - - false - false - false - false - - 1 - - - - ProjectExplorer.Project.TargetCount - 2 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - diff --git a/src/UWE_projectCode/finddialog查找搜索代码/finddialog.cpp b/src/UWE_projectCode/finddialog查找搜索代码/finddialog.cpp deleted file mode 100644 index c488191..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/finddialog.cpp +++ /dev/null @@ -1,135 +0,0 @@ -#include "finddialog.h" -#include "mainwindow.h" -#include -#include -#include -#include -#include -#include -#include -FindDialog::FindDialog(QWidget *parent, QPlainTextEdit* pText) - : QDialog(parent, Qt::WindowCloseButtonHint | Qt::Drawer) -{ - initControl(); - connectSlot(); - setLayout(&m_layout); - setWindowTitle("Find"); - setPlainTextEdit(pText); -} - -void FindDialog::initControl() -{ - m_findLbl.setText("Find What:"); - m_findBtn.setText("Find Next"); - m_closeBtn.setText("Close"); - m_matchChkBx.setText("Match Case"); - m_backwardBtn.setText("Backward"); - m_forwardBtn.setText("Forward"); - m_forwardBtn.setChecked(true); - m_radioGrpBx.setTitle("Direction"); - - m_hbLayout.addWidget(&m_forwardBtn); - m_hbLayout.addWidget(&m_backwardBtn); - - m_radioGrpBx.setLayout(&m_hbLayout); - - m_layout.setSpacing(10); - m_layout.addWidget(&m_findLbl, 0, 0); - m_layout.addWidget(&m_findEdit, 0, 1); - m_layout.addWidget(&m_findBtn, 0, 2); - m_layout.addWidget(&m_matchChkBx, 1, 0); - m_layout.addWidget(&m_radioGrpBx, 1, 1); - m_layout.addWidget(&m_closeBtn, 1, 2); - -} - -void FindDialog::connectSlot() -{ - connect(&m_findBtn, SIGNAL(clicked()), this, SLOT(onFindClicked())); - connect(&m_closeBtn, SIGNAL(clicked()), this, SLOT(onCloseClicked())); -} - -void FindDialog::setPlainTextEdit(QPlainTextEdit* pText) -{ - m_pText = pText; -} - -QPlainTextEdit* FindDialog::getPlainTextEdit() -{ - return m_pText; -} - -bool FindDialog::event(QEvent* evt) -{ - if( evt->type() == QEvent::Close ) - { - hide(); - - return true; - } - - return QDialog::event(evt); -} - -void FindDialog::onFindClicked() -{ - QString target = m_findEdit.text(); - - if( (m_pText != NULL) && (target != "") ) - { - QString text = m_pText->toPlainText(); - QTextCursor c = m_pText->textCursor(); - int index = -1; - if( m_forwardBtn.isChecked() ) - { - index = text.indexOf(target, c.position(), m_matchChkBx.isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive); - - if( index >= 0 ) - { - c.setPosition(index); - c.setPosition(index + target.length(), QTextCursor::KeepAnchor); - m_pText->setTextCursor(c); - QTextCharFormat highlight; - highlight.setBackground(Qt::red); - c.mergeCharFormat(highlight); - m_pText->mergeCurrentCharFormat(highlight); - } - } - - if( m_backwardBtn.isChecked() ) - { - index = text.lastIndexOf(target, c.position() - text.length() - 1, m_matchChkBx.isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive); - - if( index >= 0 ) - { - c.setPosition(index + target.length()); - c.setPosition(index, QTextCursor::KeepAnchor); - - m_pText->setTextCursor(c); - QTextCharFormat highlight; - highlight.setBackground(Qt::red); - c.mergeCharFormat(highlight); - m_pText->mergeCurrentCharFormat(highlight); - } - } - - if( index < 0 ) - { - QMessageBox msg(this); - - msg.setWindowTitle("Find"); - msg.setText("Can not find \"" + target + "\" any more..."); - msg.setIcon(QMessageBox::Information); - msg.setStandardButtons(QMessageBox::Ok); - - msg.exec(); - } - } -} - - - -void FindDialog::onCloseClicked() -{ - close(); -} diff --git a/src/UWE_projectCode/finddialog查找搜索代码/finddialog.h b/src/UWE_projectCode/finddialog查找搜索代码/finddialog.h deleted file mode 100644 index 393866f..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/finddialog.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef _FINDDIALOG_H_ -#define _FINDDIALOG_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class FindDialog : public QDialog -{ - Q_OBJECT - -protected: - QGroupBox m_radioGrpBx; - - QGridLayout m_layout; - QHBoxLayout m_hbLayout; - - QLabel m_findLbl; - QLineEdit m_findEdit; - QPushButton m_findBtn; - QPushButton m_closeBtn; - QCheckBox m_matchChkBx; - QRadioButton m_forwardBtn; - QRadioButton m_backwardBtn; - - QPointer m_pText; // FindDialog 聚合使用 QPlainTextEdit - QSharedPointer m_pFindDlg; - QTextCharFormat m_format; - void initControl(); - void connectSlot(); - -protected slots: - void onFindClicked(); - void onCloseClicked(); -public: - explicit FindDialog(QWidget* parent = 0, QPlainTextEdit* pText = 0); - void setPlainTextEdit(QPlainTextEdit* pText); - void highlightText(QPlainTextEdit* pText); - QPlainTextEdit* getPlainTextEdit(); - bool event(QEvent* evt); -}; - - - -#endif // _FINDDIALOG_H_ diff --git a/src/UWE_projectCode/finddialog查找搜索代码/main.cpp b/src/UWE_projectCode/finddialog查找搜索代码/main.cpp deleted file mode 100644 index fd3e533..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/main.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "mainwindow.h" - -#include - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - MainWindow w; - w.show(); - return a.exec(); -} diff --git a/src/UWE_projectCode/finddialog查找搜索代码/mainwindow.cpp b/src/UWE_projectCode/finddialog查找搜索代码/mainwindow.cpp deleted file mode 100644 index 79fdef1..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/mainwindow.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "mainwindow.h" -#include "ui_mainwindow.h" -#include //QFileDialog类是Qt提供的一个用于指定操作文件的对话框小部件,使用前要先导入 -#include //弹出对话框 -#include //调试 -#include -#include -#include "finddialog.h" -MainWindow::MainWindow(QWidget *parent): - QMainWindow(parent), - ui(new Ui::MainWindow) -{ - ui->setupUi(this); - connect(ui->actionFind,SIGNAL(triggered()),this,SLOT(onFindClicked())); - connect(ui->newAction,&QAction::triggered,this,&MainWindow::newActionSlot);//创建链接,newAcion发出取地址信号(newAction),triggered 单击信号,this类mainwindow窗口处理信号 - //mainwindow.h创建槽函数 - //newActionSlot创建链接 - connect(ui->openAction,&QAction::triggered,this,&MainWindow::openActionSlot);//打开文件的槽点链接 - connect(ui->saveAction,&QAction::triggered,this,&MainWindow::saveActionSlot); - connect(ui->changeAction,&QAction::triggered,this,&MainWindow::changeActionSlot); - m_pFindDlg = QSharedPointer(new FindDialog(this, &plainTextEdit)); - m_format.setBackground(Qt::yellow); - m_format.setForeground(Qt::red); -} -MainWindow::~MainWindow() -{ - delete ui; -} -void MainWindow::on_actionFind_clicked() -{ - QPlainTextEdit* pText = ui->plainTextEdit; - FindDialog dlg(this,pText); - dlg.exec(); -} -void MainWindow::newActionSlot() -{ - ui->textEdit->clear(); - this->setWindowTitle("新建文本文档.txt"); - //ctrl+R运行 - //实现新建文本文档功能 - //之后仿照实现openAction(打开文件)等功能,添加槽函数 -} -void MainWindow::openActionSlot() -{ - //getOpenFileName和getOpenFileNames一个是获取单个文件路径,另一个是多个文件 - - //获取单个文件的本地或者网络路径 - //QUrl getOpenFileUrl(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QUrl &dir = QUrl(), const QString &filter = QString(), QString *selectedFilter = Q_NULLPTR, Options options = Options(), const QStringList &supportedSchemes = QStringList()) - - //获取多个文件的本地或者网络路径 - //QList getOpenFileUrls(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QUrl &dir = QUrl(), const QString &filter = QString(), QString *selectedFilter = Q_NULLPTR, Options options = Options(), const QStringList &supportedSchemes = QStringList()) - - QString fileName=QFileDialog::getOpenFileName(this,"选择一个文件", - QCoreApplication::applicationFilePath(), - "images(*.png *jpeg *bmp);;text files(*.txt *.doc *.docx);;video files(*.avi *.mp4 *.wmv);;*.cpp;;All files(*.*)");//静态函数用以返回用户当前选择的目录,(&dir默认打开文件目录,需要获取路径,Linux可以直接输入,window需要用QCoreApplication::applicationFilePath()获取) - if (fileName.isEmpty()) - { - QMessageBox::warning(this,"警告","请选择一个文件"); - } - else - { - //返回文件路径 - //qDebug()<textEdit->setText(QString(ba));//toPlainText获取string文本 - file.close(); - } -} -void MainWindow::saveActionSlot() -{ - QString fileName=QFileDialog::getSaveFileName(this,"选择一个文件",QCoreApplication::applicationFilePath()); - if(fileName.isEmpty()) - { - QMessageBox::warning(this,"警告","请选择一个文件"); - } - else - { - QFile file(fileName); - file.open(QIODevice::WriteOnly); - //ui->textEdit->toPlainText();//获取打开文件的内容 String格式 - QByteArray ba;//进行格式转换,变成字节格式 - ba.append(ui->textEdit->toPlainText()); - file.write(ba); - file.close(); - } -} -//事件:鼠标点击,键盘点击在客户端都叫做事件,通过捕捉事件来实现一些响应,事件被封装成QEvent类 -void MainWindow::changeActionSlot(){ - -} -void MainWindow::keyPressEvent(QKeyEvent *k) -{ - if(k->modifiers()==Qt::ControlModifier&&k->key()==Qt::Key_S)//modifiers()表示按键的附加信息 - { - saveActionSlot(); - } - if(k->modifiers()==Qt::ControlModifier&&k->key()==Qt::Key_F){ - on_actionFind_clicked(); - } -} -void MainWindow::mousePressEvent(QMouseEvent *m) -{ - //QPoint类被用于获取位置 - QPoint pt=m->pos(); - qDebug()<button()==Qt::LeftButton) - { - qDebug()<<"左键被按下"; - } - else if(m->button()==Qt::RightButton) - { - qDebug()<<"右键被按下"; - } -} diff --git a/src/UWE_projectCode/finddialog查找搜索代码/mainwindow.h b/src/UWE_projectCode/finddialog查找搜索代码/mainwindow.h deleted file mode 100644 index c8c9ff9..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/mainwindow.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include -#include -#include //QFileDialog类是Qt提供的一个用于指定操作文件的对话框小部件,使用前要先导入 -#include -#include -#include -#include -//头文件用来写 类的声明 (包括类的成员的声明和方法声明)、函数原型、#define 常数等 -//必须按照以下格式来写 -/* -#ifndef MYCLASS_H -#define MYCLASS_H - -// code here - -#endif*/ -//源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件 -QT_BEGIN_NAMESPACE -namespace Ui { class MainWindow; } -QT_END_NAMESPACE - -class MainWindow : public QMainWindow -{ - Q_OBJECT - - -public: - MainWindow(QWidget *parent = nullptr); - ~MainWindow(); - void keyPressEvent(QKeyEvent *k); - void mousePressEvent(QMouseEvent *m); - -private slots://创建槽函数 slot插槽 - void newActionSlot();//新建文件的槽点 创建之后进入mainwindow.cpp继续处理信息编辑 - void openActionSlot();//打开文件的槽点 - void saveActionSlot(); - void changeActionSlot(); - void on_actionFind_clicked(); - -private: - Ui::MainWindow *ui; - QPlainTextEdit plainTextEdit; // mainEditor为文本编辑框对象 - QSharedPointer m_pFindDlg; // MainWindow 组合使用 FindDialog 和 QPlainTextEdit - QTextCharFormat m_format; -}; -#endif // MAINWINDOW_H !!!必须要有的东西 diff --git a/src/UWE_projectCode/finddialog查找搜索代码/mainwindow.ui b/src/UWE_projectCode/finddialog查找搜索代码/mainwindow.ui deleted file mode 100644 index 98ecc89..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/mainwindow.ui +++ /dev/null @@ -1,109 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - - - - - - - - PushButton - - - - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600; font-style:italic; text-decoration: underline; vertical-align:sub;">sdasdasda</span></p></body></html> - - - - - - - - - 0 - 0 - 800 - 26 - - - - - 文件(&F) - - - - - - - - - 编译(&E) - - - - - 构建(&B) - - - - - 修改(C) - - - - - - - - - - - 新建(&N) - - - - - 打开(&O) - - - - - 另存为(&S) - - - - - 修改(C) - - - - - - diff --git a/src/UWE_projectCode/finddialog查找搜索代码/widget.cpp b/src/UWE_projectCode/finddialog查找搜索代码/widget.cpp deleted file mode 100644 index 6f751ff..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/widget.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include "widget.h" -#include -#include - -Widget::Widget(QWidget *parent) - : QWidget(parent), m_button(this), m_edit(this), m_label(this) -{ - m_label.move(10, 10); - m_label.resize(150, 25); - m_label.setText("Test"); - - m_edit.move(10, 45); - m_edit.resize(150, 25); - - m_button.move(10, 80); - m_button.resize(150, 25); - m_button.setText("Test"); - - connect(&m_button, SIGNAL(clicked()), this, SLOT(onButtonClicked())); - connect(&m_edit, SIGNAL(textEdited(const QString&)), this, SLOT(onTextChange(const QString&))); - - QPalette p = m_button.palette(); // 获取m_button的调色板 - - p.setColor(QPalette::Active, QPalette::ButtonText, Qt::red); // 设置激活时,按钮文本为红色 - p.setColor(QPalette::Inactive, QPalette::ButtonText, Qt::red); // 设置非激活时,按钮文本为红色 - - m_button.setPalette(p); // 给m_button设置调色板 - - p = m_edit.palette(); - - p.setColor(QPalette::Active, QPalette::Highlight, Qt::red); // 高亮背景为红色 - p.setColor(QPalette::Active, QPalette::HighlightedText, Qt::white); // 高亮文本为白色 - - p.setColor(QPalette::Inactive, QPalette::Highlight, Qt::yellow); // 高亮背景为黄色 - p.setColor(QPalette::Inactive, QPalette::HighlightedText, Qt::green); // 高亮文本为白色 - - m_edit.setPalette(p); -} - -// 点击按钮更改m_label的调色板方案 -void Widget::onButtonClicked() -{ - QPalette p = m_label.palette(); - - p.setColor(QPalette::Active, QPalette::WindowText, Qt::green); - p.setColor(QPalette::Inactive, QPalette::WindowText, Qt::green); - - m_label.setPalette(p); -} - -void Widget::onTextChange(const QString&) -{ - if(m_edit.text().count() > 6) - { - m_edit.selectAll(); - QMessageBox::information(this, "tip", "字符超出限制", QMessageBox::Ok); - } -} - -Widget::~Widget() -{ - -} diff --git a/src/UWE_projectCode/finddialog查找搜索代码/widget.h b/src/UWE_projectCode/finddialog查找搜索代码/widget.h deleted file mode 100644 index b1406f6..0000000 --- a/src/UWE_projectCode/finddialog查找搜索代码/widget.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef WIDGET_H -#define WIDGET_H - -#include -#include -#include -#include - -class Widget : public QWidget -{ - Q_OBJECT - - QPushButton m_button; - QLineEdit m_edit; - QLabel m_label; -protected slots: - void onButtonClicked(); - void onTextChange(const QString&); -public: - Widget(QWidget *parent = 0); - ~Widget(); -}; - -#endif // WIDGET_H diff --git a/src/UWE_projectCode/tmp/tmp/.Makefile.swl b/src/UWE_projectCode/tmp/tmp/.Makefile.swl new file mode 100644 index 0000000000000000000000000000000000000000..808050952decbc215828aa485e7df321d1d400cb GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/.Makefile.swm b/src/UWE_projectCode/tmp/tmp/.Makefile.swm new file mode 100644 index 0000000000000000000000000000000000000000..7650bec3f97da83f54cce14d14daacb8b72139b6 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/.Makefile.swn b/src/UWE_projectCode/tmp/tmp/.Makefile.swn new file mode 100644 index 0000000000000000000000000000000000000000..8cd660fcef819a408763b44f105a2455d3b51e5a GIT binary patch literal 16384 zcmeHNPmCK^8Gi&C2vCZOxFAp;>{2D6p0SF`=kV?a#99T z22uu622uu622uu622uu62L1;ahG13(@g$9<9r^ce=JrY(c|55`cv`y#hLs#Ien!Jqzt4Cqzt4Cqzt4Cqzt4C zqzt4Cqzt4Cqzo)zz{0J49_cs4c^dcs$@%{$j}h`+;PZe6TnFC#5Fz)0mx1p9JHXSx zp}+YnpEAg>`eEIiB0^ z-lOy?T|QgaYQ<`!y5872r!t$HZO11&MrCt-LCpcU-Ym3eD`=O`74zb&)|cP8bH^H9sg-3zY0^6^w^#q+@$CjgVqV6KcWMgL-u>-)cLd zwAJl0nps_Gx)IH^`!3nhYlY&1I?@&)ZO%$*KCBcaXvPm?p2ZwhTQ8XMhgGKT+iHF2 z2R%OIDvAr3wM;&n&nmgR!kwt!qX$Gv9~UehPoyZW%7HN}_JGuQJRUApvuwv_j!;e= z#5K%(HhW>D=d{4M?~hP37O0L&$1fAVV!4>j=H`XQj&e+)acMPv&xj??elG|kS}&Hi zjrB&QMxVJx%UY6L(CfubG1D%egC4^($pC!ovA zQk$`s^>VdtlnSO%)bw&)mz^@zrN>nEh$a^`a*ixb%>ssoM&Cwb2ZU{uPEc4?_~%J! zR(QK+J{)D3i#&$EWO~b9$<(V0W~5^ir?$HIGwWg!&MDbdh+CPTi;hj5+6%F2jQ$@b z^w<=NQ6R8T;1Of=z)*?HZeR)&6X3?WQP-1+N$vu)NryK z1^wCW&H93j4Wn{vuC$z2SeW zEJBv6=`g&wqf0?*gLynDHEDK1!8!}wUc|=}&9oR4S33cE+_Jl_uVP2fI+ov7<$90h z-rVqly`+_e6(_%>PKr&LBei+Zk`$LSg*np;Qne}wR@6jZVP=6U#0%7TaT-iYju$8U zfr}GGul|=y6Cw32-7x4H*lL0%#yeQ3GAHst5N&iEs1&)OL;WCfnM18+FmPzM&m-D& zXz299!0t20rr2#-Sm3RG)CofO1*Bk?>pEP493ct?F@&AS3Wqcb=<21M$UzG($K2V9 zuwjIB-=-1Tv^Wo#YekS^2dv+P4pt;Kw4x9T{FaL?RODJ{55K8jqExF?pQ{x&w;J@U zc8-dz6@~PZ;X$1L|A;g7eVnt!`Twc-;QMEs_kRQY8u%ITbzm2`16aTYpaW-tCxBDH z-w^|N1Nc2~3AlsvzYE+3%D~gW_i^U`9`H@zYrp{bE6)9Y0sa8|4){6nBJd4h2y}rj z05^ala2Zg5SE2Kd0HOO2h5qT2GLSNmGLSNmGLSNmGVuS%z?th|muA8iHiwos6kAct zbDNoqd1^Z?tM5e$AGBx^0kIj4V_S+%MI2Pwb%vu4*qcTH_NxY>`{!{I=*GcV6OnO_ zg8(1)+8*|*GTfx{wi!Ac;yDV73xV@W(2wGZ`#wY5iXv#N46IOwXcgOXZ8xNhhm4AV zC6pWm-$i?VFtE5HazyOWl$+kRjC;jdB8B#u=SqDC%p<4EshHirP;G=S`A%4 zg1Llwj-cIJBT99vQhsiYCMkrBI|fnZK3C2o0d-i1j=qC4B0tF*69JR7DG`UVFL>X_ zV~Ktkw=zlL?U^Rxgem#s!W1Vq(VM+UzFI-pg*!#V(YLNCPm$=KE<(AsOsq8w6K6va z&X(V&^N#D1imqw6wAe20HJI)5Nv(J!qZLl$NoRCfC1ob_ z&w`GD=gf3Wl7f@;gCAs4&Cu7&hnFH}4&KE+-*?$A=(fU$R1rqN!F~-6z-+20s@=?7 z&gNHC5z)rH9C&uA)0oLHfq~C`44SU@qPdR literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/.Makefile.swo b/src/UWE_projectCode/tmp/tmp/.Makefile.swo new file mode 100644 index 0000000000000000000000000000000000000000..f26781644a99bf2e1a4f6dfc348c32e92b163d5e GIT binary patch literal 16384 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 ZZ?CU}N+-ePFYLvXlgGXMMZBmM|1Zt&tHA&O literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/.dc.log.swo b/src/UWE_projectCode/tmp/tmp/.dc.log.swo new file mode 100644 index 0000000000000000000000000000000000000000..87042741d898644c5dc9a844316b4c5e4836208c GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/.setModuleName.tcl.swp b/src/UWE_projectCode/tmp/tmp/.setModuleName.tcl.swp new file mode 100644 index 0000000000000000000000000000000000000000..cf737481d050025a1f583bf5f867c12ab6dcd056 GIT binary patch literal 12288 zcmeI&ziYxk6u|MPyR_)k?fPRjsS&z#v_c099sIG0#zPcMf;l@V)qkr0NI|Iof&WG? zm<&!CTok?!j?2B|9xtCQT!wDvy`^5Nb+K_P^7`xf?q{#KyAx@5-;!)@G#6oDbTG<$ zaAONPtEpq=krQjv3P;PC{us=4)%df#&D=)-fine4;?(} ze{Mwfb|mNj+4uh;&HW{L0s#aNKmY**5I_I{1Q0*~0R%2mAX=JOJ*^u$o{WQUvA^4^ S ez.work/lib.f +ls /space/PRJ_Front_End/M7004V/src/DSPCORE/VRF/lib/*WC.lib >> ez.work/lib.f +ls /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/CoreLib/Latest/LVT/lib/RHSTD_LVT_ssg0p72vm40c_ccs.lib >> ez.work/lib.f + +cp ${PROJECTPATH}/syn/dont_use.tcl ez.work/dont_use_cells.tcl +sed -i "s?set_dont_use?dont_use_cell?" ez.work/dont_use_cells.tcl + +${SCRIPTPATH}/ezeco_setup.sh dc + +${SCRIPTPATH}/ezlec.sh + +ezeco -in ./ez.work/$ECO_COMM/easyeco_setup.script -rtl_eco_info ./ez.work/$ECO_COMM/eco_module_info.txt + +cp ez.work/$ECO_COMM/${moduleName}_eco.sv.v $R1_PATH/result/${moduleName}_eco.sv + +cp ${TCLPATH}/formality.tcl ez.work/$ECO_COMM/ + +fm_eco_to_svf ./ez.work/R1src/rtl ./src/rtl > ./ez.work/$ECO_COMM/eco_change.svf + +sed -i 's?./${PP}/result/${Design}.sv?./${R1_PATH}/result/${Design}_eco.sv?' ez.work/$ECO_COMM/formality.tcl +sed -i 's?./${PP}/report/$Design.svf?./${R1_PATH}/report/$Design.svf?' ez.work/$ECO_COMM/formality.tcl +sed -i "s?Design.svf?Design.svf ./ez.work/$ECO_COMM/eco_change.svf?" ez.work/$ECO_COMM/formality.tcl +sed -i "s?fm.log?fm_ez.log?" ez.work/$ECO_COMM/formality.tcl +sed -i "s?fm_svf?fm_ez_svf?" ez.work/$ECO_COMM/formality.tcl + +fm_shell -64 -f ./ez.work/$ECO_COMM/formality.tcl | tee fm_ez.log ${DCWORK}/Logs/fm_ez_${current_date}.log + +fm_result=`grep "Verification SUCCEEDED" fm_ez.log` +if [[ ${fm_result} == "" ]]; then + echo "ECO FM CHECK FAILED!!!" + exit +else + echo "ECO FM CHECK SUCCEEDED!" +fi + +${SCRIPTPATH}/ezeco_setup.sh dft + +ezeco -in ./ez.work/$ECO_COMM/easyeco_dft_setup.script -rtl_eco_info ./ez.work/$ECO_COMM/eco_module_info.txt + +cp ez.work/$ECO_COMM/${moduleName}_dft_eco.sv.v $R1_PATH/result/${moduleName}_dft_eco.v + +#ls /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/CoreLib/Latest/RVT/lib/RHSTD_RVT_ssg0p72vm40c_ccs.lib >> ez.work/lib.f +#ls /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/CoreLib/Latest/ULVT/lib/RHSTD_ULVT_ssg0p72vm40c_ccs.lib >> ez.work/lib.f +# +#${SCRIPTPATH}/ezeco_setup.sh pr +# +#ezeco -in ./ez.work/$ECO_COMM/easyeco_pr_setup.script -rtl_eco_info ./ez.work/$ECO_COMM/eco_module_info.txt +# +#cp ez.work/$ECO_COMM/${moduleName}_pr_eco.sv.v $R1_PATH/result/${moduleName}_pr_eco.v + +#if [ -e $R1_PATH/result/${moduleName}.v ]; then +# mv $R1_PATH/result/${moduleName}.v $R1_PATH/result/${moduleName}_B4_$ECO_COMM.v +#else +# mv $R1_PATH/result/${moduleName}.sv $R1_PATH/result/${moduleName}_B4_$ECO_COMM.sv +#fi + +echo ez.work/$ECO_COMM > ez.work/LastECO.txt diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/calc_dff_count.sh b/src/UWE_projectCode/tmp/tmp/Scripts/calc_dff_count.sh new file mode 100644 index 0000000..b4030fb --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/calc_dff_count.sh @@ -0,0 +1,14 @@ +echo "FullChip"; grep "_D_" ./Syn_FullChip/20190418_1124/result/DM6672V_FullChip_20190418_1124_ultra.v | wc -l +echo "VPIF"; grep "_D_" ./Syn_SubModule/Syn_VPIF/20190408_0916/result/*.v | wc -l +echo "GMAC"; grep "_D_" ./Syn_SubModule/Syn_GMAC/20190108_1644/result/*.v | wc -l +echo "DDR"; grep "_D_" ./Syn_SubModule/Syn_DDR/20190108_1644/result/*.v | wc -l +echo "H264E"; grep "_D_" ./Syn_SubModule/Syn_H264E/20190108_1644/result/*.v | wc -l +echo "CD"; grep "_D_" ./Syn_SubModule/Syn_CrossNet_Data/20190407_2037/result/*.v | wc -l +echo "CC"; grep "_D_" ./Syn_SubModule/Syn_CrossNet_Config/20190407_2037/result/*.v | wc -l +echo "SMC_BankPort"; grep "_D_" ./Syn_SubModule/Syn_SMC_BankPort/20190108_1644/result/*.v | wc -l +echo "CorePac"; grep "_D_" ./Syn_SubModule/Syn_CorePac/*.v | wc -l +echo "H264D"; grep "_D_" ./Syn_SubModule/Syn_H264D/20190108_1644/result/*.v | wc -l +echo "SMC"; grep "_D_" ./Syn_SubModule/Syn_SMC/20190108_1708/result/*.v | wc -l +echo "DMAx"; grep "_D_" ./Syn_SubModule/Syn_DMAx/20190108_1644/result/*.v | wc -l +echo "PPC"; grep "_D_" ./Syn_SubModule/Syn_PowerPC/20190108_1644/result/*.v | wc -l +echo "SRIO"; grep "_D_" ./Syn_SubModule/Syn_SRIO/20190226_0837/result/*.v | wc -l diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/cds_gen b/src/UWE_projectCode/tmp/tmp/Scripts/cds_gen new file mode 100644 index 0000000..59410cd --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/cds_gen @@ -0,0 +1,26 @@ +#!/bin/sh +#Author: liusheng +#Date: 2019.09.03 +#Role: use it, users do not need to modify the path in cds.lib. + + +NC_PATH=`which simvision` + +CDS_LIB_PATH=${NC_PATH/\/bin\/simvision/.lnx86\/inca\/files\/cds.lib} + +echo "# Contain a project-wide cds.lib" > cds.lib +echo INCLUDE ${CDS_LIB_PATH} >> cds.lib +echo " " >> cds.lib +echo "# Bind library. Logic name <=> Physical Library path." >> cds.lib +echo "# ======LEON3's Library=====" >> cds.lib +echo "DEFINE grlib xncsim/grlib" >> cds.lib +echo "DEFINE techmap xncsim/techmap" >> cds.lib +echo "DEFINE gaisler xncsim/gaisler" >> cds.lib +echo "DEFINE work xncsim/work" >> cds.lib + +echo "WORK > DEFAULT" > synopsys_sim.setup +echo "DEFAULT:vcs_lib/work" >> synopsys_sim.setup +echo "grlib:vcs_lib/grlib" >> synopsys_sim.setup +echo "gaisler:vcs_lib/gaisler" >> synopsys_sim.setup +echo "techmap:vcs_lib/techmap" >> synopsys_sim.setup + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check.sh b/src/UWE_projectCode/tmp/tmp/Scripts/check.sh new file mode 100644 index 0000000..45268c5 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check.sh @@ -0,0 +1,11 @@ +find . -name "log.txt" | xargs grep "Error:" > check.result +find . -name "log.txt" | xargs grep "Can't" >> check.result +find . -name "log.txt" | xargs grep "unresolv" >> check.result +find . -name "fm.log" | xargs grep "Error:" >> check.result +find . -name "fm.log" | xargs grep "Can't" >> check.result +find . -name "pt.log" | xargs grep "Error:" >> check.result +find . -name "pt.log" | xargs grep "Can't" >> check.result +find . -name "lib2db.log" | xargs grep "Error:" >> check.result +find . -name "lib2db.log" | xargs grep "Can't" >> check.result + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check_R0.sh b/src/UWE_projectCode/tmp/tmp/Scripts/check_R0.sh new file mode 100644 index 0000000..57d6aac --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check_R0.sh @@ -0,0 +1,65 @@ +PP=`./Scripts/setPP.sh` +echo "PP = ${PP}" + +echo "Checking dc.log ..." > R0_check.result +find ${PP} -name "dc.log" | xargs grep "Error:" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "Latch " >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "Timing loop" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "FFGEN" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "have the default net type" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "unresolved" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "unmapped" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "(LINT-5)" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "sensiti" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "MV-038" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "MV-039" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "MV-513" >> R0_check.result +find ${PP} -name "dc.log" | xargs grep "MV-514" >> R0_check.result + +echo " " >> R0_check.result +echo "Checking check_timing.txt and check_design.txt ..." >> R0_check.result +find ${PP} -name "check_timing.txt" | xargs grep "timing loop" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-0)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-3)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-4)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-6)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-7)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-11)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-12)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-20)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-21)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-22)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-23)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-26)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-27)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-40)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-41)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-42)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-56)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-57)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-58)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-59)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-61)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-62)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-63)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-64)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-65)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-66)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-68)" >> R0_check.result +find ${PP} -name "check_design.txt" | xargs grep "(LINT-69)" >> R0_check.result + +echo " " >> R0_check.result +echo "Checking pt.log, check_timing_pt.txt ..." >> R0_check.result +find ${PP} -name "pt.log" | xargs grep "Error:" >> R0_check.result +find ${PP} -name "pt.log" | xargs grep "(LNT-005)" >> R0_check.result +find ${PP} -name "check_timing_pt.txt" | xargs grep "Error:" >> R0_check.result +find ${PP} -name "check_timing_pt.txt" | xargs grep "Warning:" >> R0_check.result + +echo " " >> R0_check.result +echo "Checking fm.log ..." >> R0_check.result +find ${PP} -name "fm.log" | xargs grep "Error: " >> R0_check.result +find ${PP} -name "fm.log" | xargs grep "***** Verification Results *****" >> R0_check.result +find ${PP} -name "fm.log" | xargs grep "Verification SUCCEEDED" >> R0_check.result +find ${PP} -name "fm.log" | xargs grep "Verification FAILED" >> R0_check.result + +cp R0_check.result ${PP}/R0_check.result diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check_SRC_ID.sh b/src/UWE_projectCode/tmp/tmp/Scripts/check_SRC_ID.sh new file mode 100644 index 0000000..f910296 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check_SRC_ID.sh @@ -0,0 +1,44 @@ +dir=`tclsh ./ProjectPathSetting.tcl` +moduleName=`tclsh setModuleName.tcl` +cur_dir=`pwd` +echo $dir +echo $cur_dir +echo $moduleName +srcpath=`find $dir -maxdepth 1 -name '*src' -type d` +echo $srcpath + +cd src +svn info > $cur_dir/RTL_DC_info.log +svn list -vR >> $cur_dir/RTL_DC_info.log +ID=`svn list -vR | cksum | awk '{print $1}'` +echo "set RTL_DC_ID $ID" > $cur_dir/RTL_DC_ID.tcl + +cd $cur_dir +echo "#!/bin/sh" > update_RTL_SVN.sh +echo "" >> update_RTL_SVN.sh +while read line +do + #echo $line + r=`echo $line | cut -d' ' -f1` + f=`echo $line | cut -d' ' -f7` + if [ -n "$f" ]&&[ $r != "Last" ]; then + echo svn up -r$r $f >> update_RTL_SVN.sh + fi +done < RTL_DC_info.log + +cd $srcpath/PUBLIC +svn list -vR >> $cur_dir/RTL_DC_info.log +svn list -vR > $cur_dir/tmp.log + +cd $cur_dir +while read line +do + #echo $line + r=`echo $line | cut -d' ' -f1` + f=`echo $line | cut -d' ' -f7` + if [ -n "$f" ]&&[ $r != "Last" ]; then + echo svn up -r$r $srcpath/PUBLIC/$f >> update_RTL_SVN.sh + fi +done < tmp.log + +rm tmp.log diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check_Skeyword b/src/UWE_projectCode/tmp/tmp/Scripts/check_Skeyword new file mode 100644 index 0000000..84633a1 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check_Skeyword @@ -0,0 +1,6 @@ +#!/bin/bash +PROJECTPATH=`tclsh $RELATIVEPATH/ProjectPathSetting.tcl` +find $PROJECTPATH -name "*.v" | xargs grep -n 'full_case' +find $PROJECTPATH -name "*.v" | xargs grep -n 'parallel_case' +find $PROJECTPATH -name "*.v" | xargs grep -n 'translate on' +find $PROJECTPATH -name "*.v" | xargs grep -n 'translate off' diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check_code.sh b/src/UWE_projectCode/tmp/tmp/Scripts/check_code.sh new file mode 100644 index 0000000..4073b73 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check_code.sh @@ -0,0 +1,75 @@ +c_date=`date +%Y_%m%d_%H%M` + +echo "Checking filelist.v ..." > code_check.result +filelistpath=`find ./src/ -name '*flist*' -type f` +echo "filelistpath:" $filelistpath +for file in $filelistpath; do + filelistname+=${file#*src/}' ' +done +echo "filelistname:" $filelistname +if [ -z "$filelistname" ]; then + echo "Error: Filelist is not exist or the name is not matching '*_filelist' format. exit." + echo "Error: Filelist is not exist or the name is not matching '*_filelist' format. exit." >> code_check.result + exit +fi +SIMEMU=`grep -n "_SIMULATION_\|_EMULATION_" $filelistpath` +if [ -z "$SIMEMU" ]; then + echo "Info: There are no _SIMULATION_ or _EMULATION_ definition in file $filelistname ." +fi + +echo " " >> code_check.result +echo "Checking 'timescale' in *.v files ... (Warning)" >> code_check.result +find ./src/ -name "*.v" | xargs grep -n 'timescale' >> code_check.result + +echo " " >> code_check.result +echo "Checking Chinese words in *.v files .. (Warning)." >> code_check.result +find ./src/ -name "*.v" | xargs grep -nP '[\p{Han}]' >> code_check.result + +echo " " >> code_check.result +echo "Checking Synophsis key words in *.v files ... (Info)" >> code_check.result +find ./src/ -name "*.v" | xargs grep -n 'full_case' >> code_check.result +find ./src/ -name "*.v" | xargs grep -n 'parallel_case' >> code_check.result +find ./src/ -name "*.v" | xargs grep -n 'translate on' >> code_check.result +find ./src/ -name "*.v" | xargs grep -n 'translate off' >> code_check.result + +echo " " >> code_check.result +echo "Checking author notes in *.v files .. (Warning)." >> code_check.result +for file in `find ./src/ -regex ".*\.vh\|.*\.v\|.*\.h"` +do + authorname=`grep -n "author\|Author\|AUTHOR\|Generated by\|created" $file` + if [ -z "$authorname" ]; then + echo "Warning: Author notes is not exist or the name is not matching 'author|Author|AUTHOR|Generated by|created' format in file $file" + echo "Warning: Author notes is not exist or the name is not matching 'author|Author|AUTHOR|Generated by|created' format in file $file" >> code_check.result + fi +done + +echo " " >> code_check.result +echo "Checking NC log in xrun.log ... " >> code_check.result +find . -maxdepth 1 -name "xrun.log" | xargs grep "*E" >> code_check.result +find . -maxdepth 1 -name "xrun.log" | xargs grep "*W,RECOME" >> code_check.result +find . -maxdepth 1 -name "xrun.log" | xargs grep "*W,CUVWSP" >> code_check.result +find . -maxdepth 1 -name "xrun.log" | xargs grep "*W,CUVWSI" >> code_check.result +find . -maxdepth 1 -name "xrun.log" | xargs grep "*W,CUVMPW" >> code_check.result + +echo " " >> code_check.result +echo "Checking DC dc.log ..." >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "Error:" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "Latch " >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "Timing loop" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "FFGEN" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "have the default net type" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "unresolved" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "unmapped" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "(LINT-5)" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "sensiti" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "MV-038" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "MV-039" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "MV-513" >> code_check.result +find . -maxdepth 1 -name "dc.log" | xargs grep "MV-514" >> code_check.result + +echo " " >> code_check.result +echo "Checking SpyGlass Lint. ..." >> code_check.result +find ./spyglass.work/sg_results/*/consolidated_reports/ -name "moresimple.rpt" | xargs grep "Error" >> code_check.result +find ./spyglass.work/sg_results/*/consolidated_reports/ -name "moresimple.rpt" | xargs grep "WARNING" >> code_check.result + +cp code_check.result Logs/code_check_${c_date}.result diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check_code_auto.sh b/src/UWE_projectCode/tmp/tmp/Scripts/check_code_auto.sh new file mode 100644 index 0000000..771edd8 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check_code_auto.sh @@ -0,0 +1,108 @@ +MODULES=(DDR_top PCIE_Top RapidIO_top DMA0_wrapper RA14S_top SMC_BankMem) +MASK=( 1 1 1 1 0 1) + +i=0 +for m in ${MODULES[@]} +do + echo $i ${MASK[$i]} + if [ ${MASK[$i]} == 1 ]; then + echo $m + if [ $m == SMC_BankMem ]; then + gnome-terminal --geometry=100x30+100*$i+0 --window --title="$m" -x csh -c "cd Syn_SubModule/$m; make flow; cd ../SMC_Top; make flow; cd ../../; touch ${m}_done.tmp; exec csh" + else + gnome-terminal --geometry=100x30+100*$i+0 --window --title="$m" -x csh -c "cd Syn_SubModule/$m; make flow; cd ../../; touch ${m}_done.tmp; exec csh" + fi + fi + i=$(($i+1)) +done + +j=1 +while [ $j == 1 ] +do + echo "sleep 1" + sleep 1 + i=0 + k=0 + for m in ${MODULES[@]} + do + if [ ${MASK[$i]} == 1 ]; then + if [ -f ${m}_done.tmp ]; then + echo $i $m "continue" + i=$(($i+1)) + continue + else + echo $i $m "break" + k=1 + break + fi + fi + i=$(($i+1)) + done + if [ $k == 0 ]; then + j=0 + fi +done + +gnome-terminal --geometry=100x30+100*$i+0 --window --title="M8024V_SuperNode" -x csh -c "cd Syn_SubModule/M8024V_SuperNode; make flow; cd ../../; touch M8024V_SuperNode_done.tmp; exec csh" + +j=1 +while [ $j == 1 ] +do + echo "sleep 1" + sleep 1 + k=0 + if [ ! -f M8024V_SuperNode_done.tmp ]; then + echo "M8024V_SuperNode break" + k=1 + else + echo "M8024V_SuperNode continue" + fi + if [ $k == 0 ]; then + j=0 + fi +done + +date=`date +%Y_%m%d_%H%M` +echo $date +reportfile=flow_${date}.report +touch reportfile +i=0 +for m in ${MODULES[@]} +do + if [ ${MASK[$i]} == 1 ]; then + echo $m >> $reportfile + cat Syn_SubModule/${m}/R0_check.result >> $reportfile + echo " " >> $reportfile + echo " " >> $reportfile + fi + i=$(($i+1)) +done + +echo "M8024V_SuperNode:" >> $reportfile +cat Syn_SubModule/M8024V_SuperNode/R0_check.result >> $reportfile +echo " " >> $reportfile +echo " " >> $reportfile + +gnome-terminal --geometry=100x30+110*$i+0 --window --title="M8024V_FullChip" -x csh -c "cd Syn_Top; make flow; cd ..; touch M8024V_FullChip_done.tmp; exec csh" + +j=1 +while [ $j == 1 ] +do + echo "sleep 1" + sleep 1 + k=0 + if [ ! -f M8024V_FullChip_done.tmp ]; then + echo "M8024V_FullChip break" + k=1 + else + echo "M8024V_FullChip continue" + fi + if [ $k == 0 ]; then + j=0 + fi +done + +echo "M8024V_FullChip:" >> $reportfile +cat Syn_Top/R0_check.result >> $reportfile + +rm *_done.tmp diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check_file_occupy b/src/UWE_projectCode/tmp/tmp/Scripts/check_file_occupy new file mode 100644 index 0000000..825dd5b --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check_file_occupy @@ -0,0 +1,10 @@ +#!/bin/sh +ls | tee te.log +rm -f space_occupylist.log +touch space_occupylist.log +while read LINE +do + du -hs $LINE | tee -a space_occupylist.log +done < te.log +rm -f te.log +gedit space_occupylist.log diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check_files.sh b/src/UWE_projectCode/tmp/tmp/Scripts/check_files.sh new file mode 100644 index 0000000..3f4f242 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check_files.sh @@ -0,0 +1,15 @@ + +dir=`tclsh $RELATIVEPATH/ProjectPathSetting.tcl` +moduleName=`tclsh setModuleName.tcl` + +if [ ! -d ${dir}/src/${moduleName} ]; then + echo "Source code is not exist or the dir name is not moduleName. exit." + exit +fi + +if [ ! -e ${dir}/src/${moduleName}/${moduleName}_filelist.v ]; then + echo "Filelist is not exist or the name is not moduleName_filelist. exit." + exit +fi + +echo "Source codes and filelist is existing." diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check_han b/src/UWE_projectCode/tmp/tmp/Scripts/check_han new file mode 100644 index 0000000..5a5f602 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check_han @@ -0,0 +1,3 @@ +#!/bin/bash +PROJECTPATH=`tclsh $RELATIVEPATH/ProjectPathSetting.tcl` +find $PROJECTPATH -name "*.v" | xargs grep -nP '[\p{Han}]' diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/check_timescale b/src/UWE_projectCode/tmp/tmp/Scripts/check_timescale new file mode 100644 index 0000000..00a0ce1 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/check_timescale @@ -0,0 +1,3 @@ +#!/bin/bash +PROJECTPATH=`tclsh $RELATIVEPATH/ProjectPathSetting.tcl` +find $PROJECTPATH -name "*.v" | xargs grep -n 'timescale' diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/clock_cross.pl b/src/UWE_projectCode/tmp/tmp/Scripts/clock_cross.pl new file mode 100644 index 0000000..4b5d4f3 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/clock_cross.pl @@ -0,0 +1,18 @@ +#! /usr/bin/perl +$i=0; +$flag=0; +open(NEW,"> $ARGV[1]")||die "ERROR:can't create fzg_result\n"; +open(OLD,"$ARGV[0]")||die "ERROR:can't open clock_cross.v\n"; +while(){ + chomp; + if(/From Clock Crossing Clocks/) {$flag=1;next;} + if(/Information\: Checking \'no\_clock\'/) {$flag=0;} + if($flag==1) { + @array=split(/\s+/,$_); + print NEW "$array[0]\n"; + for($i=1;$i<@array;$i++) + {print NEW "-----> $array[$i]\n";} + print NEW "\n\n";} + + +} diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/copy_sdc.sh b/src/UWE_projectCode/tmp/tmp/Scripts/copy_sdc.sh new file mode 100644 index 0000000..ba78cbd --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/copy_sdc.sh @@ -0,0 +1,32 @@ +moduleName=`tclsh setModuleName.tcl` +echo $moduleName + +PP=`setPP.sh` +echo "PP = ${PP}" +PP_date=${PP#*dc.work/} +echo "PP_date = ${PP#*dc.work/}" + +cp $RELATIVEPATH/SDC/${moduleName}.sdc NetlistSubmit/${PP_date}/ +cp $RELATIVEPATH/SDC/${moduleName}_CDC_check.tcl NetlistSubmit/${PP}/ +sed -i 's/set BACKEND false/set BACKEND true/' NetlistSubmit/${PP_date}/${moduleName}.sdc +sed -i 's/set EXTRACT_MODEL true/set EXTRACT_MODEL false/' NetlistSubmit/${PP_date}/${moduleName}.sdc + +if [ ${moduleName} == "SRIO_top" ]; then +cp $RELATIVEPATH/SDC/dwc_e25mp_phy_x4_ns_phy_con.tcl NetlistSubmit/${PP}/ +#sed -i 's/set FLOW SYN/set FLOW STA/' NetlistSubmit/${PP}/const.srio3_ep_phy_top.tcl +fi + +if [ ${moduleName} == "fullchip_top" ]; then +cp ${PP}/result/*.sv NetlistSubmit/${PP} -rf +sed -i 's/set PR true/set PR false/' NetlistSubmit/${PP}/${moduleName}.sdc +cp $RELATIVEPATH/SDC/M66AK_FullChip_skew_check.tcl NetlistSubmit/${PP}/ +cp $RELATIVEPATH/SDC/MaxMinDelay.tcl NetlistSubmit/${PP}/ +#remove power and ground pins. +#$RELATIVEPATH/Scripts/emptyPortValue.pl NetlistSubmit/${PP}/M66AK_FullChip_CLC_Top.sv +#$RELATIVEPATH/Scripts/emptyPortValue.pl NetlistSubmit/${PP}/M66AK_FullChip_CrossNet.sv +#$RELATIVEPATH/Scripts/emptyPortValue.pl NetlistSubmit/${PP}/M66AK_FullChip_excluding_CLC_RESETC_CrossNet.sv +#$RELATIVEPATH/Scripts/emptyPortValue.pl NetlistSubmit/${PP}/M66AK_FullChip_RESETC.sv +#$RELATIVEPATH/Scripts/emptyPortValue.pl NetlistSubmit/${PP}/M66AK_FullChip.sv +fi + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/create_dummy.py b/src/UWE_projectCode/tmp/tmp/Scripts/create_dummy.py new file mode 100644 index 0000000..3655456 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/create_dummy.py @@ -0,0 +1,200 @@ +#!/usr/bin/python +#company: nudt-wdzs-671 +#filename: creat_dummy.py +#description: generate the dummy file of a verilog top file +#author: liusheng +#revision List: +#(rn: date : modifier: description) +#r1: 2019.01.12 the first copy +#r2: 2020.04.05 solve the problem that the signalname inlcudes "input" / "output" or "inout", such as "input bscan_select_jtag_input; " +#r3: 2020.05.05 solve the problem that the file inlcudes "`resetall or `timescale". +#r4: 2020.05.11 fix the bug in "\n" + +import sys +import re + +####main########################################################################################### +print "welcome to use".center(100,"-") +print 'This tool can generate the dummy file of a verilog file.' +print 'please type "creat_dummy.py src.v dst.v" it will geneate the dummy file (dst.v) of src.v.' +print 'The author of this sofware is liusheng from national university of defense technology, China.' +print "welcome to use".center(100,"-") +print "" + +filepath=sys.argv[1] +file_in=open(filepath,"r") +file_all_1=file_in.read() + +modulename=sys.argv[2]; + +realmodulename=modulename.strip('\.v'); + +#delete all the commenting +file_all_2=re.sub('\/\/.*?\n','\n',file_all_1) +file_all_3=re.sub('\/\*.*?\*\/','',file_all_2) +file_all_4=re.sub('\/\*[\s\S]*?\*\/','\n',file_all_3) +#delete all the `, such as "`resetall or `timescale". +file_all_4=re.sub('`.*?\n','\n',file_all_4) + +#print file_all_4 + +#delete declare +file_all_5=re.sub('.*module[\s\S]*?;','',file_all_4) + +#print file_all_5 + +#get declare +all_declare_1=re.findall('.*module[\s\S]*?\)',file_all_4) +all_declare=re.sub(',|\)',';',''.join(all_declare_1)) + +#print all_declare + +#fix \n +file_all_1=all_declare+file_all_5 +#file_all_2=file_all_1.replace("\n","") +file_all_3=file_all_1.replace(";",";\n") + +#fix reg wire +file_all_4=file_all_3.replace("reg","") +file_all=file_all_4.replace("wire","") + + + +#replace the true "parameter localparam input output inout" as "PARAMETER LOCALPARAM INPUT OUTPUT INOUT" + +file_all=re.sub(r'^parameter','PARAMETER',file_all); +file_all=re.sub(r'\sparameter','\nPARAMETER',file_all); +file_all=re.sub(r' parameter',' PARAMETER',file_all); +file_all=re.sub(r'^localparam','LOCALPARAM',file_all); +file_all=re.sub(r'\slocalparam','\nLOCALPARAM',file_all); +file_all=re.sub(r' localparam',' LOCALPARAM',file_all); +file_all=re.sub(r'^input','INPUT',file_all); +file_all=re.sub(r'\sinput','\nINPUT',file_all); +file_all=re.sub(r' input',' INPUT',file_all); +file_all=re.sub(r'\soutput','\nOUTPUT',file_all); +file_all=re.sub(r' output',' OUTPUT',file_all); +file_all=re.sub(r'^output','OUTPUT',file_all); +file_all=re.sub(r'\sinout','\nINOUT',file_all); +file_all=re.sub(r' inout',' INOUT',file_all); +file_all=re.sub(r'^inout','INOUT',file_all); + +#print file_all + + +#find all parameter +allparameter=re.findall('.*PARAMETER(.*?);',file_all) + +#find all localparam +alllocalparam=re.findall('.*LOCALPARAM(.*?);',file_all) + +#find all input +allinput_ini=re.findall('.*INPUT(.*?);',file_all) + +allinput=",".join(allinput_ini) + +#find all true input +alltrueinput=re.sub('\[.*?\]|\s','',allinput) + +#find all output +alloutput_ini=re.findall('.*OUTPUT(.*?);',file_all) +alloutput=",".join(alloutput_ini) + +#find all true output +alltrueoutput=re.sub('\[.*?\]|\s','',alloutput) + +#find all inout +allinout_ini=re.findall('.*inout(.*?);',file_all) +allinout=",".join(allinout_ini) + +#find all true input +alltrueinout=re.sub('\[.*?\]|\s','',allinout) + +file_out=open(modulename,"w") + +#print allparameter +i=0 +j=0 + +print>>file_out,"module "+realmodulename+"(" +print>>file_out,"//output" +for p in list(re.split(",",alltrueoutput)): + i=i+len(p)+2 + if(i>70): + print>>file_out,'\n'+p+',', + i=len(p)+2 + else: + print>>file_out,p+',', + +i=0 +if(alltrueinout!=''): + print>>file_out,"\n//inout" + for p in list(re.split(",",alltrueinout)): + i=i+len(p)+2 + if(i>70): + print>>file_out,'\n'+p+',', + i=len(p)+2 + else: + print>>file_out,p+',', + +print>>file_out,"" +print>>file_out,"//input" +i=0 +for p in list(re.split(",",alltrueinput)): + j=j+1 + i=i+len(p)+2 + if(i>70): + if(len(re.split(",",alltrueinput))==j): + print>>file_out,'\n'+p + else: + print>>file_out,'\n'+p+',', + i=len(p)+2 + else: + if(len(re.split(",",alltrueinput))==j): + print>>file_out,p + else: + print>>file_out,p+',', +print>>file_out,");" +print>>file_out,"" + +for p in list(allparameter): + p=re.sub('\s','',p) + print>>file_out,' parameter '+p+';' + +for p in list(alllocalparam): + p=re.sub('\s','',p) + print>>file_out,' localparam '+p+';' + + +print>>file_out,"" +for p in list(allinput_ini): + p=re.sub('\s','',p) + print>>file_out," input "+p+";" + +print>>file_out,"" +for p in list(allinout_ini): + p=re.sub('\s','',p) + print>>file_out," inout "+p+";" + +print>>file_out,"" +for p in list(alloutput_ini): + p=re.sub('\s','',p) + print>>file_out," output "+p+";" + +print>>file_out,"" +for p in list(re.split(",",alltrueoutput)): + if("rst" in p)|("reset" in p)|("RST" in p)|("RESET" in p): + print>>file_out," assign "+p+"=1'b1;" + elif ("JTAGC_TDO" in p): + print>>file_out," assign "+p+"=JTAGC_TDI;" + else: + print>>file_out," assign "+p+"='b0;" + + +print>>file_out,"" +for p in list(re.split(",",alltrueinout)): + if(p!=""): + print>>file_out," assign "+p+"='b0;" + +print>>file_out,"endmodule" + +####main########################################################################################### diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/.submethodology_help new file mode 100644 index 0000000..8c4d9f0 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/.submethodology_help @@ -0,0 +1,9 @@ +This step recommends goals to be used during the entire +RTL development cycle for new RTL blocks. + +When RTL is almost ready and final handoff checks are being performed. +At this time, majority of GuideWare New_RTL goals should be run after +every ECO. + +This step also includes a set of Optional goals at each stage. +Design teams should inspect these goals for applicability to their design. diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/.submethodology_help new file mode 100644 index 0000000..7acb53e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/.submethodology_help @@ -0,0 +1,3 @@ +The aim of this goal is to check the simulation readiness of the design. At this stage the designer is typically interested in the following + * The designs meets basic connectivity checks such as floating inputs, width mismatch + * The design meets basic simulation prerequisites that can cause functional errors or possible race conditions diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_setup.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_setup.spq new file mode 100644 index 0000000..5ab1bd1 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_setup.spq @@ -0,0 +1,34 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : adv_lint_setup +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +adv_lint_setup mixed +* +Defines Clocks and Resets +* +This step is used to find the clocks and resets in a design. Follow steps below +to complete initial clocks and resets constraints creation: + 1- Understand your design clocks architecture by exploring clocks and resets + as identified by rules run in this template. Black box clocks need to be + resolved. + 2- Copy autoclocks.sgdc and autoresets.sgdc into a new constraint file and + edit the clocks to provide valid clock/reset sources and remove all + non clocks/resets signals from the file +In addition you can also add known case-analysis under which you want to do the +analysis +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-mixed +-policy=clock-reset +-rules Clock_info01 +-rules Reset_info01 +-rules Info_Case_Analysis diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_setup_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_setup_debug_help.htm new file mode 100644 index 0000000..cfd2114 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_setup_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + adv_lint_setup + + + + + + + + + + + + + +
+ +
+

+adv_lint_setup +

+

+The aim of this goal is to help the user in finding the clocks and resets. Review clocks and resets reported by Clock_info01 and Reset_info01. For viewing constant propagation in the design, the user can look at Info_Case_Analysis. +

+ + + + +
+ +
+ + + +
+ + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_struct.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_struct.spq new file mode 100644 index 0000000..597016d --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_struct.spq @@ -0,0 +1,43 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : adv_lint_struct +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// 1.1.0 16-Apr-2014 Av_fsm01 deleted +// +// Copyright Atrenta Inc, 2013. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +adv_lint_verify_struct mixed +* +Helps identify and fix structural problems and explore assertion checking opportunities +in a design without performing the actual checks. +Reports design complexity characteristics. +* +The adv_lint_verify_struct goal analyzes structural problems and assertion checking +opportunities in the design. +=cut++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-mixed +-policies=auto-verify + +-rule=Av_Info_Case_Analysis // Highlights case-analysis settings +-rule=Av_fsminf01 // Reports all the FSMs in the design +-rule=Av_fsminf02 // Reports all the interacting FSMs in the design +-rule=Av_fsm_analysis // Reports all Fsm related issues like deadlock, livelock, unreachable state and dead transitions +-rules=Av_divide_by_zero // Report Divide/Modulus by zero issue +-rule=Av_case01 // Reports all the sensitive case items which are not specified +-rule=Av_case02 // Reports the case statements with parallel case pragma which have overlapping case items +-rule=Av_deadcode01 // Reports redundant logic in the design +-rule=Av_bus01 // Reports all the bus contentions in the design +-rule=Av_bus02 // Reports all the floating busses in the design +-rule=Av_dontcare01 // Reports sensitizable X-assignments in the design +-rule=Av_range01 // Reports array bound violation +-rule=Av_complexity01 // Reports design characteristics and complexity for all the RTL modules and FSMs in the design + +-audit=yes ++syntharg -ignoreHangingFF diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_struct_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_struct_debug_help.htm new file mode 100644 index 0000000..47cec03 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_struct_debug_help.htm @@ -0,0 +1,72 @@ + + + + + + + + + + adv_lint_verify_struct + + + + + + + + + + + + + +
+ +
+

+adv_lint_verify_struct +

+

+The aim of this goal is to identify and fix structural problems, report design complexity, and explore assertion checking opportunities in a design +The violations can be debugged and fixed in the following order +

+
    +
  1. Analyze reported FSMs
  2. +
  3. Analyze reported design complexity
  4. +
  5. Analyze assertion opportunities for functional rules
  6. +

    +
+ + + + +
+ +
+ + + +
+ + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_verify.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_verify.spq new file mode 100644 index 0000000..f1df021 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_verify.spq @@ -0,0 +1,41 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : adv_lint_verify +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// 1.1.0 16-Apr-2014 Av_fsm01 deleted +// +// Copyright Atrenta Inc, 2013. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +adv_lint_verify mixed +* +Helps identify and fix functional problems related to FSMs, case statements, dead and static code, +busses, and x assignment. +Reports design complexity characteristics. +* +The adv_lint_verify goal analyzes functional problems in the design. +=cut++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-mixed +-policies=auto-verify + +-rule=Av_Info_Case_Analysis // Highlights case-analysis settings +-rule=Av_fsminf01 // Reports all the FSMs in the design +-rule=Av_fsminf02 // Reports all the interacting FSMs in the design +-rule=Av_fsm_analysis // Reports all Fsm related issues like deadlock, livelock, unreachable state and dead transitions +-rule=Av_divide_by_zero // Report Divide/Modulus by zero issue +-rule=Av_case01 // Reports all the sensitive case items which are not specified +-rule=Av_case02 // Reports the case statements with parallel case pragma which have overlapping case items +-rule=Av_deadcode01 // Reports redundant logic in the design +-rule=Av_bus01 // Reports all the bus contentions in the design +-rule=Av_bus02 // Reports all the floating busses in the design +-rule=Av_dontcare01 // Reports sensitizable X-assignments in the design +-rule=Av_range01 // Reports array bound violation +-rule=Av_complexity01 // Reports design characteristics and complexity for all the RTL modules and FSMs in the design + ++syntharg -ignoreHangingFF diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_verify_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_verify_debug_help.htm new file mode 100644 index 0000000..cba3831 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/adv_lint_verify_debug_help.htm @@ -0,0 +1,72 @@ + + + + + + + + + + adv_lint_verify + + + + + + + + + + + + + +
+ +
+

+adv_lint_verify +

+

+The aim of this goal is to analyze all the functional problems in the design. This runs all the functional rules of the Advanced Lint policy. +The violations can be debugged and fixed in the following order +

+
    +
  1. Analyze and resolve x-assignments, divide/modulus by zero issues, generation and propagation problems in the design reported by the rules Av_dontcare01, Av_divide_by_zero, Av_bus01, Av_bus02 and Av_range01.
  2. +
  3. Fix the FSM-related issues and case statement related issues reported by the rules Av_fsm_analysis, Av_case01 and Av_case02
  4. +
  5. Fix the redundant code related violations reported by Av_deadcode01 and Av_staticnet01 rules.
  6. +

    +
+ + + + +
+ +
+ + + +
+ + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/lint_functional_rtl.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/lint_functional_rtl.spq new file mode 100644 index 0000000..c33863c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/lint_functional_rtl.spq @@ -0,0 +1,81 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : lint_functional_rtl +// Version: 5.6.1 +// +// Revision History: +// Ver Date Comments +// 1.0.0 26-Nov-2014 Initial version +// 5.4.1 04-Mar-2015 Made following changes +// Removed arg: +syntharg -ignoreHanginFF +// Added use_inferred_clocks & use_inferred_resets +// +// 5.5.0 16-Apr-2015 Added Av_signed_unsigned_mismatch and Av_width_mismatch_expr +// +// 5.6.0 18-Nov-2015 5.6 Added Following Rules +// Rule Name Policy GW Type +// =============================================== +// Av_width_mismatch_expr02 auto-verify MUST +// Av_width_mismatch_expr03 auto-verify MUST +// Av_dontcare_mismatch auto-verify MUST +// Av_case_default_missing auto-verify MUST +// Av_case_default_redundant auto-verify MUST +// +// 5.6.1 29-Mar-2015 Removed use_inferred_resets & use_inferred_clocks +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +lint_functional_rtl mixed +* +Helps identify width related issues in assignment, case expression-select, instance +port connection and function arguments using functional analysis +* +This goal uses functional analysis to identify width related issues in the design. +=cut++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ +-policies=auto-verify + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ +-nocheckoverflow='yes' // Width will be calculated as per LRM rather best fit. + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ +-rule=Av_Info_Case_Analysis // Highlights case-analysis settings + +-rule=Av_width_mismatch_assign // LHS width is less than RHS width of assignment (Truncation) + +-rule=Av_width_mismatch_case // Case expression width does not match case select expression width + +-rule=Av_width_mismatch_port // Instance port connection has different width compared to the port definition + +-rule=Av_width_mismatch_function // Bit-width of function call arguments must match bit-width of the corresponding function definition arguments + +// Do not mix signed & unsigned variables/constants in expressions, assignment statements or in comparisons +-rule=Av_signed_unsigned_mismatch + +//Bit-width of operands of a logical operator must match +-rule=Av_width_mismatch_expr + +-rule=Av_case_default_missing // A case statement(or selected signal assignment) does not have a default clause + +-rule=Av_width_mismatch_expr03 // Unequal length in arithmetic comparison operator + +-rule=Av_width_mismatch_expr02 // Unequal length operands in bit wise logical/arithmetic/relational operator + +-rule=Av_dontcare_mismatch // Use of don't-care except in case labels may lead to simulation/synthesis mismatch + +-rules Av_case_default_redundant // A case statement marked full_case or a priority/unique case statement have a default clause. + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/lint_functional_rtl_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/lint_functional_rtl_debug_help.htm new file mode 100644 index 0000000..4c48398 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/adv_lint/lint_functional_rtl_debug_help.htm @@ -0,0 +1,72 @@ + + + + + + + + + + adv_lint_verify + + + + + + + + + + + + + +
+ +
+

+adv_lint_verify +

+

+The aim of this goal is to analyze width related problems in the design. This runs all the functional rules of the Advanced Lint policy. +The violations can be debugged and fixed in the following order +

+
    +
  1. Analyze and resolve assignment width mismatch in the design reported by the rules Av_width_mismatch_assign.
  2. +
  3. Analyze and resolve case expression width mismatch in the design reported by the rules Av_width_mismatch_case
  4. +
  5. Fix the width mismatch in arguments of functional calls and port connection in instantiation reported by Av_width_mismatch_port and Av_width_mismatch_function rules.
  6. +

    +
+ + + + +
+ +
+ + + +
+ + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/.submethodology_help new file mode 100644 index 0000000..7acb53e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/.submethodology_help @@ -0,0 +1,3 @@ +The aim of this goal is to check the simulation readiness of the design. At this stage the designer is typically interested in the following + * The designs meets basic connectivity checks such as floating inputs, width mismatch + * The design meets basic simulation prerequisites that can cause functional errors or possible race conditions diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_abstract.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_abstract.spq new file mode 100644 index 0000000..1bbfcd8 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_abstract.spq @@ -0,0 +1,93 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : cdc_abstract +// Version: 1.7.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.1.0 26-Apr-2013 5.1 Parameter enable_handshake removed +// 1.4.0 12-Feb-2014 5.2.1 Clock_info18, enable_fifo=strict removed +// Setup_port01, Setup_blackbox01 added +// 1.7.0 30-Apr-2014 5.3.0 Guidware 2.0 Content Consistency +// 1.10.2 23-Feb-2015 5.4.1 Parameter decompile_block_constraints added +// Parameter sdc_generate_cfp added +// Rule FalsePathSetup added +// 1.13.0 03-Feb-2017 2017.03 Parameter reset_reduce_pessimism added +// 1.14.0 26-Apr-2017 2017.03-SP1 Parameters check_multiclock_bbox, cdc_qualifier_depth, clock_reduce_pessimism, reset_reduce_pessimism, cdc_reduce_pessimism, include_block_interface, use_block_interface added + +// 1.15.0 18-July-2017 2017.12 Parameter use_inferred_abstract_port added +// 1.17.0 22-Jan-2018 2017.12 Option use_advcdc_features added +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +cdc_abstract mixed +* +Abstraction of a block for CDC verification at a higher level of hierarchy +* +This step is used to abstract a block which is to be used at higher level of +hierarchy for CDC verification. The abstracted model helps in following: + - Less run-time at top-level + - Less noise at top-level as no violations will be reported inside the blocks + + Perform this step after doing CDC verification of block. +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=clock-reset + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //allow mixed language +-enable_const_prop_thru_seq //allow to propagate beyond the sequential elements +-use_advcdc_features //Run Advanced CDC Rules in restore mode + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-enable_mux_sync=all //MUX Synchronization schemes +-enable_and_sync=yes //Enables the AND Gate Synchronization Scheme +-distributed_fifo=yes //Enables detection of FIFOs based on distributed memories +-fa_disable_sync_fifo=yes //Specifies whether functional analysis should be performed on synchronous FIFO structures +-strict_sync_check=yes //Allows combinational logic between the source and destination flip-flops +-enable_debug_data=yes //Enables annotation of debug information, such as clock, reset, quasi_static signals, and domain information on nets in the schematic +-hier_wild_card=no //Specifies the format of specifying hierarchies by using wildcard expressions in all the constraints used by the SpyGlass CDC solution +-block_abstract //Generates relevant CDC constraints for block abstraction +-sdc_generate_cfp=yes //Inferring cdc_false_path for asynchronous clocks in different domains +-decompile_block_constraints // Create merged abstract model +-reset_reduce_pessimism=same_data_reset_flop,remove_overlap //Remove overlap between reset sync check and async reset (reset_sync02) rules + +-include_block_interface=abstract //Put SV interface information into the abstract model +-use_block_interface //Use the SV internface information in the abstract model +-check_multiclock_bbox=yes //Clock domain crossing involving the unconstrained pins of black-box instances on destination side and receiving multiple clock are ignored +-cdc_qualifier_depth=3 //Default is infinite. This leads to some wrong qualifiers +-clock_reduce_pessimism=latch_en,mux_sel_derived,check_enable_for_glitch,ignore_same_domain +-cdc_reduce_pessimism=mbit_macro,no_convergence_at_syncreset,no_convergence_at_enable,use_multi_arc,clock_crossing,no_unate_reconv,clock_on_ports,ignore_multi_domain //Let multi-domain source synchronizers will be recognized in Ac_sync but Ac_glitch03 will continue to report the issue. +-use_inferred_abstract_port=yes + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Setup_port01 //Reports unconstrained ports summary for top design unit + +-rules Setup_blackbox01 //Reports unconstrained pins summary for black-boxes + +-rules Ac_abstract01 //Generates relevant SpyGlass CDC constraints for block abstraction + +-rules Info_Case_Analysis // Constant propagation in schematic display + +-rules FalsePathSetup //Cases where cdc_false_path constraint is not used by any crossing in the design + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_abstract_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_abstract_debug_help.htm new file mode 100644 index 0000000..6f9b275 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_abstract_debug_help.htm @@ -0,0 +1,67 @@ + + + + + + + + + + cdc_abstract + + + + + + + + + + + + + +
+ +
+

+cdc_abstract +

+

+The aim of this goal is to generate abstract model of a block. This goal reports an informational message by rule Ac_abstract01, which points to the SGDC file containing abstract model. + + +

+
  • Use generated abstract models of blocks at SoC level for CDC verification and abstraction validation checks. You can provide the generated abstract model just with the RTL interface of blocks, without full definitions of blocks.
  • +

    + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup.spq new file mode 100644 index 0000000..6013c10 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup.spq @@ -0,0 +1,69 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : cdc_setup +// Version: 1.7.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.7.0 30-Apr-2014 5.3.0 Guidware 2.0 Content Consistency +// 1.12.0 18-Nov-2015 5.6.0 Parameter handle_combo_arc=yes added +// 1.17.0 22-Jan-2018 2017.12 Option use_advcdc_features added +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +cdc_setup mixed +* +Define Clocks and Resets +* +This step is used to find the clocks and resets in a design. Follow steps below +to complete initial clocks and resets constraints creation: + 1- Understand your design clocks architecture by exploring clocks and resets + as identified by rules run in this template. Black box clocks need to be + resolved by assuming path through black boxes (use assume_path constraint) + 2- Copy autoclocks.sgdc and autoresets.sgdc into a new constraint file and + edit the clocks to provide valid clock/reset sources and remove all + non clocks/resets signals from the file + In addition you can also add known case-analysis under which you want to do CDC analysis. +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=clock-reset + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //allow mixed language +-enable_const_prop_thru_seq //allow to propagate beyond the sequential elements +-use_advcdc_features //Run Advanced CDC Rules in restore mode + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-enable_debug_data=yes //Enables annotation of debug information, such as clock, reset, quasi_static signals, and domain information on nets in the schematic +-hier_wild_card=no //Specifies the format of specifying hierarchies by using wildcard expressions in all the constraints used by the SpyGlass CDC solution +-handle_combo_arc=yes //propagate clocks through lib cells + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Setup_clock01 // Generates information needed for Clock Setup + +-rules Clock_info01 // Clock candidates in the design + +-rules Reset_info01 // Asynchronous and synchronous preset and clear candidates in the design + +-rules Info_Case_Analysis // Constant propagation in schematic display + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_check.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_check.spq new file mode 100644 index 0000000..8d3689e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_check.spq @@ -0,0 +1,137 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : cdc_setup_check +// Version: 1.12.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.1.0 05-Oct-2013 5.2 Rule Clock_check10 added +// 1.4.0 12-Feb-2014 5.2.1 Clock_info18 removed +// Ar_converge01, Setup_req01, Setup_port01, Setup_blackbox01 added +// 1.7.0 30-Apr-2014 5.3.0 Guidware 2.0 Content Consistency +// 1.10.0 17-Dec-2014 5.4.1 Setup_req01 removed +// 1.10.2 23-Feb-2015 5.4.1 Rule FalsePathSetup added +// Rule Setup_library01 added +// Parameter sdc_generate_cfp added +// Rule Ac_clockperiod01 removed +// Rule Ac_clockperiod02 removed +// 1.12.0 16-Nov-2016 2016.06-SP2 Rules Clock_info02 and Reset_info02 removed +// 1.13.0 03-Feb-2017 2017.03 Added parameter report_common_reset +// 1.14.0 26-Apr-2017 2017.03-SP1 Rules Clock_info05c, Clock_info01, Reset_info01 added +// Rule Reset_check10 removed +// 1.15.0 18-July-2017 2017.12 Parameter use_inferred_abstract_port added +// 1.17.0 22-Jan-2018 2017.12 Option use_advcdc_features added +// 1.18.0 04-Dec-2018 2018.09 QualifierSetup rule removed due to unneccessary noise STAR #9001291972 +// +// Copyright Atrenta Inc, 2016. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +cdc_setup_check mixed +* +Clocks and Resets Setup Checks +* +This step is used to check setup correctness and completeness; it is very +important to fix all violations reported in this step to avoid false violations +due to incorrect/incomplete setup . Some examples, + 1- Ensure all flops are receiving a clock + 2- Ensure case analysis is defined preventing multiple clocks controlling + the same flop + 3- Ensure multiple clocks are not defined on the same clock path + 4- Periods, edge-list and domains are defined properly for clocks + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=clock-reset + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //allow mixed language +-enable_const_prop_thru_seq //allow to propagate beyond the sequential elements +-use_advcdc_features //Run Advanced CDC Rules in restore mode + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-enable_debug_data=yes //Enables annotation of debug information, such as clock, reset, quasi_static signals, and domain information on nets in the schematic +-hier_wild_card=no //Specifies the format of specifying hierarchies by using wildcard expressions in all the constraints used by the SpyGlass CDC solution +-sdc_generate_cfp=yes //Inferring cdc_false_path for asynchronous clocks in different domains +-report_common_reset=yes //Reports the common reset source skipping buf/inv and MUX/combo gates acting as buffer +-use_inferred_abstract_port=yes + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Clock_info03a // Reports unconstrained clock nets +-overloadrules Clock_info03a+severity=Error + +-rules Clock_info05 // MUX descriptions where two or more clock signals converge +-overloadrules Clock_info05+severity=Error + +## -rules Clock_info05a // Signals on which the set_case_analysis should be set to control MUXed clock selection +-overloadrules Clock_info05a+severity=Error + +-rules Clock_info05b // Combinational gates other than MUXes where two or more clock signals converge +-overloadrules Clock_info05b+severity=Error + +-rules Ac_resetvalue01 // Missing -value field of the reset constraint defined in an SGDC file +-overloadrules Ac_resetvalue01+severity=Error + +-rules Reset_info09a // Reports Unconstrained asynchronous reset nets +-overloadrules Reset_info09a+severity=Error + +-rules Clock_converge01 // Clocks whose multiple fan-outs converge +-overloadrules Clock_converge01+severity=Error + +-rules Ar_converge01 //Reports a reset signal whose multiple fan-outs converge + +-rules Reset_check03 //Reset signals that are being used at both levels to set or reset flip-flops synchronously +-overloadrules Reset_check03+severity=Error + +-rules Reset_check11 //Asynchronous resets used as both active-high and active-low +-overloadrules Reset_check11+severity=Error + +-rules Reset_check12 // Flops that do not get active reset during power on reset +-overloadrules Reset_check12+severity=Error + +-rules Clock_info03b //Flip-flops,latches where the data pins are tied to a constant value + +-rules Clock_info03c // Reports Flip-flops or latches where the clock/enable pin is set to a constant +-overloadrules Clock_info03c+severity=Error + +-rules Setup_port01 //Reports unconstrained ports summary for top design unit + +-rules Setup_blackbox01 //Reports unconstrained pins summary for black-boxes + +-rules Clock_check10 // Reports clocks being used as data + +-rules Clock_info15 // Generates clock domain information for primary ports + +-rules Ar_syncrst_setupcheck01 // Reports constant value on functional flops in synchronous reset deassert-mode + +-rules Info_Case_Analysis // Constant propagation in schematic display + +-rules Clock_info05c //Reports unconstrained MUXes which do not receive clocks in all its data inputs + +-rules FalsePathSetup //Cases where cdc_false_path constraint is not used by any crossing in the design + +-rules Setup_library01 //Reports incomplete definition of library pins for CDC + +-rules Clock_info01 // Clock candidates in the design + +-rules Reset_info01 // Asynchronous and synchronous preset and clear candidates in the design + +-ignorerules QualifierSetup //Removed due to unneccessary noise +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_check_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_check_debug_help.htm new file mode 100644 index 0000000..77bec19 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_check_debug_help.htm @@ -0,0 +1,82 @@ + + + + + + + + + + cdc_setup_check + + + + + + + + + + + + + +
    + +
    +

    +cdc_setup_check +

    +

    +The aim of this goal is to check setup correctness and completeness. To avoid false analysis due to incorrect/incomplete setup, the user should fix all violations reported during this step. The violations can be debugged and fixed in the following order: +

    +
      +
    1. Analyze and fix clock setup issues reported by the following rules:
    2. +

      +Clock_info03a, Clock_info03b, Clock_info03c, Clock_info05, Clock_info05c, Clock_info05b, Clock_info01, Reset_info01, Clock_converge01, Ar_converge01, FalsePathSetup, Setup_library01 +

      +
    3. Analyze and fix reset setup issues reported by the following rules:
    4. +

      +Reset_info09a, Ac_resetvalue01, Ar_syncrst_setupcheck01 +

      +
    5. Analyze and fix basic issues in reset logic reported by the following rules:
    6. +

      +Reset_check03, Reset_check11, Reset_check12 +

      +
    7. Review report and SGDC file generated by rules Clock_info15, Setup_port01, Setup_blackbox01 to ensure all IOs are properly constrained
    8. +

      +
    9. Review and prune the quasi_static constraints in SGDC file generated by Setup_quasi_static01 rule and provide the SGDC file in CDC verification goals
    10. +
    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_debug_help.htm new file mode 100644 index 0000000..591f6f4 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_setup_debug_help.htm @@ -0,0 +1,68 @@ + + + + + + + + + + cdc_setup + + + + + + + + + + + + + +
    + +
    +

    +cdc_setup +

    +

    +The aim of this goal is to help the user in finding the clocks and resets. Review clocks and resets reported by Clock_info01, and Reset_info01. +

    +

    +For an in-depth analysis and understanding of clocks architecture, the user can look at Setup_clock01. For viewing constant propagation in the design, the user can look at Info_Case_Analysis. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify.spq new file mode 100644 index 0000000..79f5add --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify.spq @@ -0,0 +1,245 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : cdc_verify +// Version: 1.14.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.1.0 26-Apr-2013 5.1 Rule Ar_syncrst_setupcheck01 added +// Parameter enable_handshake removed +// 1.2.0 06-Aug-2013 5.1.1 Rules Ac_handshake01 and Ac_handshake02 removed +// 1.3.0 04-Oct-2013 5.2 Rule Clock_check10 added +// Rules Ac_coherency01a, Ac_coherency02a added +// 1.4.0 12-Feb-2014 5.2.1 Clock_info18, Ac_fifo01, Ac_cdc08, enable_fifo removed +// Ar_converge01, Setup_req01, Ac_conv04, Ac_conv05, Ac_coherency06, Setup_port01, Setup_blackbox01 added +// 1.5.0 16-Apr-2014 5.3 Rules Ac_coherency01a and Ac_coherency02a deleted +// 1.6.0 30-Apr-2014 5.3 Rule Clock_sync09 removed +// 1.7.0 30-Apr-2014 5.3.0 Guidware 2.0 Content Consistency +// 1.8.0 21-Jul-2014 5.3.1 Enabled Ac_glitch03, allow_combo_logic +// 1.8.1 08-Aug-2014 5.3.1 Removed Ac_conv05. Ac_conv04 description updated +// 1.10.0 17-Dec-2014 5.4.1 Setup_req01 removed +// 1.10.2 23-Feb-2015 5.4.1 Parameter cdc_reduce_pessimism=ignore_multi_domain added +// Parameter reset_reduce_pessimism=remove_overlap added +// Parameter sdc_generate_cfp added +// Rule FalsePathSetup added +// Rule Setup_library01 added +// 1.11.0 11-Jun-2015 5.5.0 Rule parameter cdc_qualifier_depth added +// 1.11.1 31-Aug-2015 5.5.1 Parameter fa_disable_sync_fifo=yes removed +// 1.12.0 16-Nov-2016 2016.06-SP2 Rules Clock_info02 and Reset_info02 removed +// 1.13.0 03-Feb-2017 2017.03 Added parameter report_common_reset +// 1.14.0 26-Apr-2017 2017.03-SP1 Rules Clock_info05c, Clock_glitch05, Clock_info01, Reset_info01 added +// Parameters check_multiclock_bbox, cdc_qualifier_depth, conv_sync_seq_depth, conv_sync_seq_depth_opt, clock_reduce_pessimism, allow_merged_qualifier added +// Overloaded rule severity for rules Clock_sync05, Clock_sync06, Reset_sync02 +// Removed rules Reset_check10, Reset_info02, Clock_info02 +// 1.15.0 18-July-2017 2017.12 Rule Ac_glitch04, Clock_sync05a, Clock_sync06a added +// Parameter conv_sync_as_src added +// Parameter use_inferred_abstract_port added +// 1.17.0 22-Jan-2018 2017.12 Option use_advcdc_features added +// +// Copyright Atrenta Inc, 2016. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +cdc_verify mixed +* +Clock Domain Crossing Verification +* +This step is used to verify all aspects of clock domain crossings; main CDC +issues covered are: + 1- Metastability + 2- Data hold with regard to destination clock and enable + 3- Coherency problem on reconvergent crossings + 4- Functional correctness of FIFOs + 5- Ensure all synchronous resets follow convention specified by reset_sync_style + constraint + In this step any change that may affect the setup will also be monitored and +any setup issues (e.g. converging clocks, missing clocks definition) will be +reported. + For faster CDC verification closure, it is recommended to address structural +violations by running cdc_verify_struct prior to this step. + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=clock-reset + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //allow mixed language +-enable_const_prop_thru_seq //allow to propagate beyond the sequential elements +-use_advcdc_features //Run Advanced CDC Rules in restore mode + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-enable_mux_sync=all //MUX Synchronization schemes +-enable_and_sync=yes //Enables the AND Gate Synchronization Scheme +-distributed_fifo=yes //Enables detection of FIFOs based on distributed memories +-enable_debug_data=yes //Enables annotation of debug information, such as clock, reset, quasi_static signals, and domain information on nets in the schematic +-hier_wild_card=no //Specifies the format of specifying hierarchies by using wildcard expressions in all the constraints used by the SpyGlass CDC solution +-strict_sync_check=yes //Allows combinational logic between the source and destination flip-flops +-fa_vcdfulltrace=allnets //Specifies the type of data that is to be dumped to the VCD file +-fa_msgmode=all //Specifies the type of assertions +-reset_reduce_pessimism=same_data_reset_flop,remove_overlap //Remove overlap between reset sync check and async reset (reset_sync02) rules +-cdc_reduce_pessimism=mbit_macro,no_convergence_at_syncreset,no_convergence_at_enable,use_multi_arc,clock_crossing,no_unate_reconv,clock_on_ports,ignore_multi_domain //Let multi-domain source synchronizers will be recognized in Ac_sync but Ac_glitch03 will continue to report the issue. +-sdc_generate_cfp=yes //Inferring cdc_false_path for asynchronous clocks in different domains +-report_common_reset=yes //Reports the common reset source skipping buf/inv and MUX/combo gates acting as buffer +-use_inferred_abstract_port=yes +-conv_sync_as_src=yes + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Ac_clockperiod01 // Missing -period or -edge fields of the clock constraint defined in an SGDC file +-overloadrules Ac_clockperiod01+severity=Error + +-rules Ac_clockperiod02 //Clocks whose periods are rounded off by SpyGlass for lower design cycle for faster functional analysis + +-rules Ac_clockperiod03 // Clocks with design cycles greater than the threshold value +-overloadrules Ac_clockperiod03+severity=Error + +-rules Clock_info03a // Reports unconstrained clock nets +-overloadrules Clock_info03a+severity=Error + +-rules Clock_info05 // MUX descriptions where two or more clock signals converge +-overloadrules Clock_info05+severity=Error + +## -rules Clock_info05a // Signals on which the set_case_analysis should be set to control MUXed clock selection +-overloadrules Clock_info05a+severity=Error + +-rules Clock_info05b // Combinational gates other than MUXes where two or more clock signals converge +-overloadrules Clock_info05b+severity=Error + +-rules Ac_resetvalue01 // Missing -value field of the reset constraint defined in an SGDC file +-overloadrules Ac_resetvalue01+severity=Error + +-rules Reset_info09a // Reports Unconstrained asynchronous reset nets +-overloadrules Reset_info09a+severity=Error + +-rules Clock_converge01 // Clocks whose multiple fan-outs converge +-overloadrules Clock_converge01+severity=Error + +-rules Ar_converge01 //Reports a reset signal whose multiple fan-outs converge + +-rules Reset_check03 //Reset signals that are being used at both levels to set or reset flip-flops synchronously +-overloadrules Reset_check03+severity=Error + +-rules Reset_check11 //Asynchronous resets used as both active-high and active-low +-overloadrules Reset_check11+severity=Error + +-rules Reset_check12 // Flops that do not get active reset during power on reset +-overloadrules Reset_check12+severity=Error + +-rules Clock_info03b //Flip-flops,latches where the data pins are tied to a constant value + +-rules Clock_info03c // Reports Flip-flops or latches where the clock/enable pin is set to a constant +-overloadrules Clock_info03c+severity=Error + +-rules Setup_port01 //Reports unconstrained ports summary for top design unit + +-rules Setup_blackbox01 //Reports unconstrained pins summary for black-boxes + +-rules Clock_check10 // Reports clocks being used as data + +-rules Ac_initstate01 // Reports a valid state of the design from which the formal analysis would actually start + +-rules Ar_syncrstactive01 // Polarity on synchronous reset usage mismatches with -active field in sync_reset_style constraint + +-rules Ar_syncrstcombo01 // Combinational logic in synchronous reset path mismatches with -combo field in sync_reset_style constraint + +-rules Ar_syncrstload01 // Load on synchronous reset less than the specified max load + +-rules Ar_syncrstload02 // Load on synchronous reset exceeds the specified min load + +-rules Ar_syncrstpragma01 // Pragma specification on synchronous reset usage mismatches with -pragma field in sync_reset_style constraint + +-rules Ar_syncrstrtl01 // Reports if synchronous reset is not detected in condition of first if statement + +-rules Ac_unsync01 // Asynchronous clock domain crossings for scalar signals that have at least one unsynchronized source + +-rules Ac_unsync02 // Asynchronous clock domain crossings for vector signals having at least one unsynchronized source + +-rules Clock_sync05 // Checks for multi-sample inputs +-overloadrules Clock_sync05+severity=Error + +-rules Clock_sync05a //Reports primary inputs (for which domain is auto-inferred using abstract_module constraint) sampled by multiple clock domains +-rules Clock_sync06 // Checks for multi-transition outputs +-overloadrules Clock_sync06+severity=Error + +-rules Clock_sync06a // Reports primary outputs (for which domain is auto-inferred using abstract_module constraint) driven by multiple clock domain flip-flops or latches +-rules Ar_unsync01 // Reports unsynchronized reset signals in the design + +-rules Ar_asyncdeassert01 // Reports if reset signal is asynchronously de-asserted + +-rules Reset_sync02 // Asynchronous resets used in a clock domain and generated in one of its asynchronous clock domains +-overloadrules Reset_sync02+severity=Error + +-rules Reset_sync04 //Asynchronous resets synchronized more than once in the same clock domain + +-rules Ac_datahold01a // Reports synchronized data clock domain crossings where data can be unstable + +-rules Ac_conv01 //same domain signals synchronized in same destination domain, converge after any number of sequential elements + +-rules Ac_conv02 //same-domain signals synchronized in same destination domain and converge before sequential elements. + +-rules Ac_conv03 // Convergence of synchronized signals from different source domains + +-rules Ac_conv04 //For all control-bus clock domain crossings that do not converge, checks for uniform synchronization schemes and further checks gray encoding when formal is enabled + +-rules Ac_coherency06 //Reports signals synchronized more than once in the same clock domain + +-rules Ac_glitch03 // Reports clock domain crossings subject to glitches +-allow_combo_logic=yes //allows combinational logic between crossings only if the logic is within the modules specified using this constraint. +-rules Ac_glitch04 // Reports clock domain crossings subject to glitches + +-rules Ac_cdc01a // Checks data loss from fast to slow multi-flop or sync-cell synchronized clock domain crossings + +-rules Ac_crossing01 // Generate spreadsheet for Crossing Matrix view + +-rules Ac_sync01 // Asynchronous clock domain crossings for scalar signals that have all the sources synchronized + +-rules Ac_sync02 // Asynchronous clock domain crossings for vector signals that have all sources synchronized + +-rules Ar_sync01 // Reports synchronized reset signals in the design + +-rules Ar_syncdeassert01 // Reports if reset signal is synchronously de-asserted or not de-asserted at all + +-rules Clock_info15 // Generates clock domain information for primary ports + +-rules Setup_quasi_static01 // Reports likely quasi-static candidates in the design + +-rules Ar_syncrst_setupcheck01 // Reports constant value on functional flops in synchronous reset deassert-mode + +-rules Info_Case_Analysis // Constant propagation in schematic display + +-rules Clock_info05c //Reports unconstrained MUXes which do not receive clocks in all its data inputs + +-rules Clock_glitch05 //Flags asynchronous sources that converge with different domain clocks + +-check_multiclock_bbox=yes //Clock domain crossing involving the unconstrained pins of black-box instances on destination side and receiving multiple clock are ignored +-cdc_qualifier_depth=3 //Default is infinite. This leads to some wrong qualifiers +-conv_sync_seq_depth=1 //Default to only checking Ac_conv01 to 1 flop. User can override to go deeper +-conv_sync_seq_depth_opt=yes //Optimizes Ac_conv runtime when depth=1 +-clock_reduce_pessimism=latch_en,mux_sel_derived,check_enable_for_glitch,ignore_same_domain +-allow_merged_qualifier=strict + +-rules Clock_info01 //Reports likely clock signals + +-rules Reset_info01 //Reports likely asynchronous and synchronous preset and clear signals + +-rules FalsePathSetup //Cases where cdc_false_path constraint is not used by any crossing in the design + +-rules Setup_library01 //Reports incomplete definition of library pins for CDC + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_debug_help.htm new file mode 100644 index 0000000..fefe56a --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_debug_help.htm @@ -0,0 +1,85 @@ + + + + + + + + + + cdc_verify + + + + + + + + + + + + + +
    + +
    +

    +cdc_verify +

    +

    +The aim of this goal is to verify all aspects of clock domain crossings. Review and fix each category of CDC problems separately. The violations can be debugged and fixed in the following order +

    +
      +
    1. Ensure that the setup is clean: analyze and fix violations reported by the following rules
    2. +

      +Clock_info03a, Clock_info03b, Clock_info03c, Clock_info05, Clock_info05b, Clock_converge01, Ar_converge01, Reset_info09a, Ac_resetvalue01, Ac_clockperiod01, Ac_clockperiod02, Ac_clockperiod03, Clock_info15, Setup_port01, Setup_blackbox01, Reset_check03, Reset_check10, Reset_check11, Reset_check12, Ar_syncrstactive01, Ar_syncrstcombo01, Ar_syncrstload01, Ar_syncrstload02, Ar_syncrstpragma01, Ar_syncrstrtl01, FalsePathSetup, Setup_library01 +

      +
    3. Ensure that the design has been properly initialized: Review Ac_initstate01 to ensure at least 80% of flops are initialized and uninitialized flops are not important for functional verification (e.g. sometimes memories are not initialized and are initialized during the execution of the design).
    4. +
    5. Analyze and fix the unsynchronized crossings reported by Ac_unsync01 and Ac_unsync02 rules
    6. +
    7. Analyze and fix other clock and reset synchronization issues reported by the following rules:
    8. +

      +Clock_sync05, Clock_sync06, Ar_unsync01, Ar_asyncdeassert01, Reset_sync02, Reset_sync04 +

      +
    9. Analyze and fix convergence issues reported by following rules
    10. +

      +Ac_conv01, Ac_conv02, Ac_conv03, Ac_conv04, Ac_coherency06 +

      +
    11. Ensure that crossings functionality is correct: Analyze and fix following rules
    12. +

      +Ac_cdc01a, Ac_datahold01a +

      +
    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_struct.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_struct.spq new file mode 100644 index 0000000..ab74f67 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_struct.spq @@ -0,0 +1,244 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : cdc_verify_struct +// Version: 1.14.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.1.0 26-Apr-2013 5.1 Rules Ac_datahold01a, Ac_cdc01a, Ac_cdc08 removed +// Rule Ar_syncrst_setupcheck01 added +// Parameter enable_handshake removed +// 1.2.0 06-Aug-2013 5.1.1 Rules Ac_handshake01 and Ac_handshake02 removed +// 1.3.0 04-Oct-2013 5.2 Rule Clock_check10 added +// Rules Ac_coherency01a, Ac_coherency02a added +// 1.4.0 12-Feb-2014 5.2.1 Clock_info18, Ac_fifo01, enable_fifo removed +// Ar_converge01, Setup_req01, Ac_conv04, Ac_conv05, Ac_coherency06, Ac_abstract_validation01, SGDC_abstract_mapping01, validate_reduce_pessimism, abstract_validate_express,Setup_port01,Setup_blackbox01 added +// 1.5.0 16-Apr-2014 5.3 Rules Ac_coherency01a and Ac_coherency02a deleted +// 1.6.0 30-Apr-2014 5.3 Rule Clock_sync09 removed +// 1.7.0 30-Apr-2014 5.3.0 Guidware 2.0 Content Consistency +// 1.8.0 21-Jul-2014 5.3.1 Enabled Ac_glitch03, allow_combo_logic +// 1.8.1 08-Aug-2014 5.3.1 Removed Ac_conv05. Ac_conv04 description updated +// 1.10.0 17-Dec-2014 5.4.1 Setup_req01 removed +// 1.10.2 23-Feb-2015 5.4.1 Parameter cdc_reduce_pessimism=ignore_multi_domain added +// Parameter reset_reduce_pessimism=remove_overlap added +// Parameter sdc_generate_cfp added +// Rule FalsePathSetup added +// Rule Setup_library01 added +// Rule Ac_clockperiod01 removed +// Rule Ac_clockperiod02 removed +// 1.11.0 11-Jun-2015 5.5.0 Rule parameter cdc_qualifier_depth added +// 1.12.0 16-Nov-2016 2016.06-SP2 Rules Clock_info02 and Reset_info02 removed +// 1.13.0 03-Feb-2017 2017.03 Added parameter report_common_reset +// 1.14.0 26-Apr-2017 2017.03-SP1 Rule Ac_abstract_validation01 removed and Ac_abstract_validation02 added +// Rules Clock_info05c, Clock_glitch05, Clock_info01, Reset_info01 added +// Parameters autofix_abstract_port, check_multiclock_bbox, cdc_qualifier_depth, conv_sync_seq_depth, conv_sync_seq_depth_opt, clock_reduce_pessimism, allow_merged_qualifier added +// Overloaded rule severity for rules Clock_sync05, Clock_sync06, Reset_sync02 +// Removed rules Ac_clockperiod01, Ac_clockperiod02, Ac_clockperiod03, Reset_check10, Reset_info02, Clock_info02 +// 1.15.0 18-July-2017 2017.12 Rule Ac_glitch04, Clock_sync05a, Clock_sync06a added +// Parameter conv_sync_as_src added +// Parameter use_inferred_abstract_port added +// 1.17.0 22-Jan-2018 2017.12 Option use_advcdc_features added +// +// Copyright Atrenta Inc, 2016. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +cdc_verify_struct mixed +* +Clock Domain Crossing Verification +* +This step is used to verify all aspects of clock domain crossings; main CDC +issues covered are: + 1- Metastability + 2- Coherency problem on reconvergent crossings + 3- Ensure all synchronous resets follow convention specified by reset_sync_style + constraint + In this step any change that may affect the setup will also be monitored and +any setup issues (e.g. converging clocks, missing clocks definition) will be +reported. +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=clock-reset + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //allow mixed language +-enable_const_prop_thru_seq //allow to propagate beyond the sequential elements +-use_advcdc_features //Run Advanced CDC Rules in restore mode + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-enable_mux_sync=all //MUX Synchronization schemes +-enable_and_sync=yes //Enables the AND Gate Synchronization Scheme +-distributed_fifo=yes //Enables detection of FIFOs based on distributed memories +-fa_disable_sync_fifo=yes //Specifies whether functional analysis should be performed on synchronous FIFO structures +-enable_debug_data=yes //Enables annotation of debug information, such as clock, reset, quasi_static signals, and domain information on nets in the schematic +-hier_wild_card=no //Specifies the format of specifying hierarchies by using wildcard expressions in all the constraints used by the SpyGlass CDC solution +-strict_sync_check=yes //Allows combinational logic between the source and destination flip-flops +-fa_vcdfulltrace=allnets //Specifies the type of data that is to be dumped to the VCD file +-fa_msgmode=none //Specifies the type of assertions +-reset_reduce_pessimism=same_data_reset_flop,remove_overlap //Remove overlap between reset sync check and async reset (reset_sync02) rules +-sdc_generate_cfp=yes //Inferring cdc_false_path for asynchronous clocks in different domains +-cdc_reduce_pessimism=mbit_macro,no_convergence_at_syncreset,no_convergence_at_enable,use_multi_arc,clock_crossing,no_unate_reconv,clock_on_ports,ignore_multi_domain //Let multi-domain source synchronizers will be recognized in Ac_sync but Ac_glitch03 will continue to report the issue. +-report_common_reset=yes //Reports the common reset source skipping buf/inv and MUX/combo gates acting as buffer +-use_inferred_abstract_port=yes +-conv_sync_as_src=yes + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +#-rules Ac_clockperiod03 // Clocks with design cycles greater than the threshold value + +-rules Clock_info03a // Reports unconstrained clock nets +-overloadrules Clock_info03a+severity=Error + +-rules Clock_info05 // MUX descriptions where two or more clock signals converge +-overloadrules Clock_info05+severity=Error + +## -rules Clock_info05a // Signals on which the set_case_analysis should be set to control MUXed clock selection +-overloadrules Clock_info05a+severity=Error + +-rules Clock_info05b // Combinational gates other than MUXes where two or more clock signals converge +-overloadrules Clock_info05b+severity=Error + +-rules Ac_resetvalue01 // Missing -value field of the reset constraint defined in an SGDC file +-overloadrules Ac_resetvalue01+severity=Error + +-rules Reset_info09a // Reports Unconstrained asynchronous reset nets +-overloadrules Reset_info09a+severity=Error + +-rules Clock_converge01 // Clocks whose multiple fan-outs converge +-overloadrules Clock_converge01+severity=Error + +-rules Ar_converge01 //Reports a reset signal whose multiple fan-outs converge + +-rules Reset_check03 //Reset signals that are being used at both levels to set or reset flip-flops synchronously +-overloadrules Reset_check03+severity=Error + +#-rules Reset_check10 // Asynchronous resets used as non-reset signals +#-overloadrules Reset_check10+severity=Error + +-rules Reset_check11 //Asynchronous resets used as both active-high and active-low +-overloadrules Reset_check11+severity=Error + +-rules Reset_check12 // Flops that do not get active reset during power on reset +-overloadrules Reset_check12+severity=Error + +-rules Clock_info03b //Flip-flops,latches where the data pins are tied to a constant value + +-rules Clock_info03c // Reports Flip-flops or latches where the clock/enable pin is set to a constant +-overloadrules Clock_info03c+severity=Error + +-rules Setup_port01 //Reports unconstrained ports summary for top design unit + +-rules Setup_blackbox01 //Reports unconstrained pins summary for black-boxes + +-rules Clock_check10 // Reports clocks being used as data + +-rules Ac_initstate01 // Reports a valid state of the design from which the formal analysis would actually start + +-rules Ar_syncrstactive01 // Polarity on synchronous reset usage mismatches with -active field in sync_reset_style constraint + +-rules Ar_syncrstcombo01 // Combinational logic in synchronous reset path mismatches with -combo field in sync_reset_style constraint + +-rules Ar_syncrstload01 // Load on synchronous reset less than the specified max load + +-rules Ar_syncrstload02 // Load on synchronous reset exceeds the specified min load + +-rules Ar_syncrstpragma01 // Pragma specification on synchronous reset usage mismatches with -pragma field in sync_reset_style constraint + +-rules Ar_syncrstrtl01 // Reports if synchronous reset is not detected in condition of first if statement + +-rules Ac_unsync01 // Asynchronous clock domain crossings for scalar signals that have at least one unsynchronized source + +-rules Ac_unsync02 // Asynchronous clock domain crossings for vector signals having at least one unsynchronized source + +-rules Clock_sync05 // Checks for multi-sample inputs +-overloadrules Clock_sync05+severity=Error + +-rules Clock_sync05a //Reports primary inputs (for which domain is auto-inferred using abstract_module constraint) sampled by multiple clock domains +-rules Clock_sync06 // Checks for multi-transition outputs +-overloadrules Clock_sync06+severity=Error + +-rules Clock_sync06a // Reports primary outputs (for which domain is auto-inferred using abstract_module constraint) driven by multiple clock domain flip-flops or latches +-rules Ar_unsync01 // Reports unsynchronized reset signals in the design + +-rules Ar_asyncdeassert01 // Reports if reset signal is asynchronously de-asserted + +-rules Reset_sync02 // Asynchronous resets used in a clock domain and generated in one of its asynchronous clock domains +-overloadrules Reset_sync02+severity=Error + +-rules Reset_sync04 //Asynchronous resets synchronized more than once in the same clock domain + +-rules Ac_conv01 //same domain signals synchronized in same destination domain, converge after any number of sequential elements + +-rules Ac_conv02 //same-domain signals synchronized in same destination domain and converge before sequential elements. + +-rules Ac_conv03 // Convergence of synchronized signals from different source domains + +-rules Ac_conv04 //For all control-bus clock domain crossings that do not converge, checks for uniform synchronization schemes and further checks gray encoding when formal is enabled + +-rules Ac_coherency06 //Reports signals synchronized more than once in the same clock domain + +-rules Ac_glitch03 // Reports clock domain crossings subject to glitches +-allow_combo_logic=yes //allows combinational logic between crossings only if the logic is within the modules specified using this constraint. +-rules Ac_glitch04 //Reports clock domain crossings subject to glitches + +-rules Ac_crossing01 // Generate spreadsheet for Crossing Matrix view + +-rules Ac_sync01 // Asynchronous clock domain crossings for scalar signals that have all the sources synchronized + +-rules Ac_sync02 // Asynchronous clock domain crossings for vector signals that have all sources synchronized + +-rules Ar_sync01 // Reports synchronized reset signals in the design + +-rules Ar_syncdeassert01 // Reports if reset signal is synchronously de-asserted or not de-asserted at all + +-rules Clock_info15 // Generates clock domain information for primary ports + +-rules Setup_quasi_static01 // Reports likely quasi-static candidates in the design + +-rules Ar_syncrst_setupcheck01 // Reports constant value on functional flops in synchronous reset deassert-mode + +-rules Info_Case_Analysis // Constant propagation in schematic display + +-rules Ac_abstract_validation02 //Reports block abstraction mismatch with top level design + +-rules Clock_info05c //Reports unconstrained MUXes which do not receive clocks in all its data inputs + +-rules Clock_glitch05 //Flags asynchronous sources that converge with different domain clocks + +-rules Clock_info01 //Reports likely clock signals + +-rules Reset_info01 //Reports likely asynchronous and synchronous preset and clear signals + +-validate_reduce_pessimism=all //ignore reporting on the block ports that are hanging, or have a constant or quasi static signal reaching on them +-abstract_validate_express=no //Enables low noise and low effort validation checks for hierarchical SoC flow +-autofix_abstract_port=no //Used to turn on|off autofix feature +-check_multiclock_bbox=yes //Clock domain crossing involving the unconstrained pins of black-box instances on destination side and receiving multiple clock are ignored +-cdc_qualifier_depth=3 //Default is infinite. This leads to some wrong qualifiers +-conv_sync_seq_depth=1 //Default to only checking Ac_conv01 to 1 flop. User can override to go deeper +-conv_sync_seq_depth_opt=yes //Optimizes Ac_conv runtime when depth=1 +-clock_reduce_pessimism=latch_en,mux_sel_derived,check_enable_for_glitch,ignore_same_domain +-allow_merged_qualifier=strict + +-rules SGDC_abstract_mapping01 //Reports clock mapping of an abstracted instance + +-rules FalsePathSetup //Cases where cdc_false_path constraint is not used by any crossing in the design + +-rules Setup_library01 //Reports incomplete definition of library pins for CDC + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_struct_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_struct_debug_help.htm new file mode 100644 index 0000000..b0fc1b1 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/cdc_verify_struct_debug_help.htm @@ -0,0 +1,80 @@ + + + + + + + + + + cdc_verify_struct + + + + + + + + + + + + + +
    + +
    +

    +cdc_verify_struct +

    +

    +The aim of this goal is to verify structural aspects of clock domain crossings. Review and fix each category of CDC problems separately. The violations can be debugged and fixed in the following order: +

    +
      +
    1. Ensure that the setup is clean: analyze and fix violations reported by the following rules:
    2. +

      +Clock_info03a, Clock_info03b, Clock_info03c, Clock_info05, Clock_info05b, Clock_converge01, Ar_converge01, Reset_info09a, FalsePathSetup, Setup_library01, Ac_resetvalue01, Clock_info15, Setup_port01, Setup_blackbox01, Reset_check03, Reset_check11, Reset_check12, Ar_syncrstactive01 Ar_syncrstcombo01 Ar_syncrstload01 Ar_syncrstload02 Ar_syncrstpragma01 Ar_syncrstrtl01 Clock_info05c Clock_glitch05 Clock_info01 Reset_info01 +

      +
    3. Analyze and fix the unsynchronized crossings reported by Ac_unsync01 and Ac_unsync02 rules
    4. +
    5. Analyze and fix other clock and reset synchronization issues reported by the following rules:
    6. +

      +Clock_sync05, Clock_sync06, Ar_unsync01, Ar_asyncdeassert01, Reset_sync02, Reset_sync04 +

      +
    7. Analyze and fix convergence issues reported by the following rules:
    8. +

      +Ac_conv01, Ac_conv02, Ac_conv03, Ac_conv04, Ac_coherency06, Ac_abstract_validation02, SGDC_abstract_mapping01 +

      +
    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/clock_reset_integrity.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/clock_reset_integrity.spq new file mode 100644 index 0000000..8b57e37 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/clock_reset_integrity.spq @@ -0,0 +1,117 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : clock_reset_integrity +// Version: 1.14.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.4.0 12-Feb-2014 5.2.1 Ar_converge01 added +// 1.7.0 30-Apr-2014 5.3.0 Guidware 2.0 Content Consistency +// 1.10.1 22-Dec-2014 5.4.1 Adding starc2005 policy since STARC05-1.4.3.2 requires it +// 1.12.0 18-Nov-2015 5.6.0 Parameter handle_combo_arc=yes added +// 1.13.0 26-Apr-2017 2017.03 Removed timing policy and corresponding rule ClockEnableRace +// +//1.14.0 13-July-2017 2017.12 Overloaded rule severity for Reset_check12 +// 1.17.0 22-Jan-2018 2017.12 Option use_advcdc_features added +// 1.18.0 04-Dec-2018 2018.09 QualifierSetup rule removed due to unneccessary noise STAR #9001291972 +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +clock_reset_integrity mixed +* +Sanity check of Clocks and Resets +* +This step ensures that clocks and resets trees are properly designed and they +are free of glitches, races, and other hazards. + Note that most of the checks require the clocks and resets to be defined. If +you do not have the clocks and resets definitions, you must run the setup for +this step to define them before proceeding with verification. + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=clock-reset +// -policy=starc2005 +// -policy morelint + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //allow mixed language +-use_advcdc_features //Run Advanced CDC Rules in restore mode + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-handle_combo_arc=yes //propagate clocks through lib cells + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Clock_info05b //detect clock signals converging on a combinational gate other than a MUX + +-rules Clock_check01 //detect unexpected cells, such as latch, tristate, or XOR/XNOR gates in a clock tree + +-rules Clock_check04 //Reports the usage of both the edges (positive and negative) of a clock + +-rules Reset_check01 //Reports reset signals that are used in a different mode from their respective synthesis pragmas + +-rules Reset_check02 //Reports latches, tristate signals, or XOR/XNOR gates in a reset tree + +-rules Reset_check03 //Reports synchronous reset signals that are used as active high as well as active low + +-rules Reset_check04 //Reports reset signals that are used asynchronously as well as synchronously for different flip-flops + +-rules Reset_check06 //Reports high fan-out reset nets that are not driven by placeholder cells + +-rules Reset_check07 //Reports asynchronous reset pins driven by a combinational logic + +-rules Clock_Reset_info01 //Generates the Clock-Reset Matrix + +-rules Clock_glitch02 //Reports clocks that are gated without latching their enable signal properly +-overloadrules Clock_glitch02+severity=Warning + +-rules Clock_glitch03 //Reports clock signals that pass through a MUX and reconverge back on the same MUX +-overloadrules Clock_glitch03+severity=Warning + +-rules Clock_glitch04 //Reports flip-flops that converge on a clock pin of a flip-flop through a combinational logic +-overloadrules Clock_glitch04+severity=Warning + +-rules Clock_Reset_check02 //Reports potential race conditions between flip-flop output and its clock/reset pin + +-rules Clock_Reset_check01 //Reports unwanted cells found in clock or reset networks + +-rules Clock_Reset_check03 //Reports potential race condition between flip-flop clock and reset pins + +-rules Clock_converge01 //Reports the clock signal for which multiple fan-outs converge + +-rules Ar_converge01 //Reports a reset signal whose multiple fan-outs converge + +-rules Info_Case_Analysis //Constant propagation in schematic display + +// -rules STARC05-1.4.3.2 +//-overloadrules STARC05-1.4.3.2+severity=Warning + +// -rules Clock_check02 # high fanout clocks needed only for netlist audit + +// -rules Clock_check03 # bus bits used as clocks not a design problem +// -rules ResetFlop-ML # All the flip-flops should have either synchronous set/reset or asynchronous set/reset + +// -rules Reset_check12 # Reports flops that do not receive active reset when specified reset is active +-overloadrules Reset_check12+severity=Error+msgLabel=NORMAL_WARNING +-overloadrules Reset_check12+severity=Info+msgLabel=CORNER_WARNING + +-ignorerules QualifierSetup //Removed due to unneccessary noise +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/clock_reset_integrity_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/clock_reset_integrity_debug_help.htm new file mode 100644 index 0000000..c7dc839 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/cdc/clock_reset_integrity_debug_help.htm @@ -0,0 +1,79 @@ + + + + + + + + + + clock_reset_integrity + + + + + + + + + + + + + +
    + +
    +

    +clock_reset_integrity +

    +

    +The aim of this goal is to check the integrity of clock and reset logic in a design. The violations can be analyzed in the following order: +

    +
      +
    1. Analyze and fix basic clock issues reported by the following rules:
    2. +

      +Clock_check01, Clock_check04, Clock_info05b, Clock_converge01, Ar_converge01 +

      +
    3. Analyze and fix race and glitch issues reported by the following rules:
    4. +

      +Clock_glitch02, Clock_glitch03, Clock_glitch04, Clock_Reset_check01, Clock_Reset_check02, Clock_Reset_check03 +

      +
    5. Analyze and fix basic issues in reset logic reported by the following rules:
    6. +

      +Reset_check01, Reset_check02, Reset_check03, Reset_check04, Reset_check06, Reset_check07 +

      +
    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/connectivity_verify/connectivity_verification.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/connectivity_verify/connectivity_verification.spq new file mode 100644 index 0000000..ce8e6c6 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/connectivity_verify/connectivity_verification.spq @@ -0,0 +1,94 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare3.0-EarlyAdopter Goal File +// +// Goal Name : connectivity_verification +// Version : 5.5.0 +// +// Revision History: +// Ver Date Comments +// 5.5.0 18-Jun-2015 Initial version +// +// Copyright Atrenta Inc, 2017. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +connectivity_verification +* +Easy capture of connectivity inten across IPs/SoCs and static checks to +suppliment simulation based verification +* + Easy Capture of Connectivity-Intent across IP/SoC + + 1. Compact & portable constraints + 2. Verify 1:1, 1:many, many:1 connections + 3. Checking for illegal conditions + 4. Conditional connectivity + 5. Validate design methodology consistency across blocks and reuse at SoC level + + Static Checks Supplements Simulation Based Verification + + 1. Fast performance to quickly find basic connectivity bugs + 2. Supports regression use model + 3. Violations clearly state the failure root-cause + 4. GUI based design analysis + + For more details about this goal, please refer to the +SpyGlass_ConnectivityVerify_Rules_Reference.pdf file in the doc +subdirectory of your SpyGlass installation +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=dft_dsm,dft + + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Soc_01 // Expected node value must be achieved + +-rules Soc_02 // Paths between user specified nodes must exist + +-rules Soc_07 // Structure between user specified nodes exists + +-rules Soc_08 // Paths between user specified nodes exists or not + +-rules Soc_09 // Path between user specified nodes must not exist + +-rules Soc_10 // Specific value on user specified nodes must not exist + +-rules Soc_11 // Node must satisfy the specified constraint message tag expression + +-rules Soc_12 // Node must not have the specified constraint message tag expression + +-rules Atspeed_21 // Check required pulse pattern at specified node + +-rules Soc_01_Info // Expected node value is achieved + +-rules Soc_02_Info // Connection between user specified nodes exists + +-rules Soc_07_Info // Structure between user specified nodes exists + +-rules Soc_04 // Show design state for a given tag + +-rules Info_Atspeed_21 // Expected pulse pattern at specified node is achieved + +-rules Info_testmode // Display testmode simulation results + +-rules Diagnose_testmode // Display instances that blocks testmode propagation + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/.submethodology_help new file mode 100644 index 0000000..7706531 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/.submethodology_help @@ -0,0 +1,10 @@ +At RTL stage, the user may have two kind of issues +1) Generate SDC from scratch +2) Have the ability to check the correctness, consistency and completeness of the constraint to factilitate synthesis. This includes + + * Consistency of Clocks and Generated clock + * Overwritten or Duplicate Constraints + * Consistency of Input/Output delays, clock latency, clock uncertainty + * Analysis of Feedthrough paths + * Verify structural connectivity of exceptions + * Compare two SDCs for the same design diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_abstract.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_abstract.spq new file mode 100644 index 0000000..99410ec --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_abstract.spq @@ -0,0 +1,41 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : sdc_abstract +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +sdc_abstract +* +Generate Abstract Port for a design +* +Generates the abstract port for a design + +For more details about this goal, please refer to the SpyGlass-Constraints-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut+++++++++++ +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=constraints + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ +-block_abstract //for block abstraction + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ +-rules CONS_abstract01 // rule that generate abstract port for a design +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_abstract_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_abstract_debug_help.htm new file mode 100644 index 0000000..bb04f02 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_abstract_debug_help.htm @@ -0,0 +1,14 @@ + + +

    + SDC Abstract +

    + + +

    The purpose of this Goal is to generate abstract port for a design. + The abstracted view can be used in verifying the timing at system level.

    +

    The abstraction of the block is performed in correlation with the SDC +constraints specified through sdc_data constraints. All such sdc_data constraints are processed and corresponding abstract_port constraints generated by the rule. The mode field of the abstract_port constraint specifies the corresponding sdc_data constraint. These constraints are output into sgdc file. The sgdc file path is highlighted in the message given by the rule.

    + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit-setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit-setup.sgs new file mode 100644 index 0000000..c251335 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit-setup.sgs @@ -0,0 +1,121 @@ +########################################################################## +# SpyGlass Constraints Methodology +# +# Version: 1.2 +# +# Revision History: +# Ver Date Comments +# 1.0 18-Jun-2008 Initial version +# 1.1 28-Jul-2008 Fixed documentation issues and incorrect headers +# (31071) +# 1.2 23-Dec-2008 Fixed incorrect use of parameters (35516) +# +# Copyright Atrenta Inc, 2008. All rights reserved. +########################################################################## +# This is the setup file for SDC Validation +########################################################################## +########################################################################## +# Register Variables to be used in the script here +########################################################################## +# Variable to check if user has SGDC file that he wants to use +register_variable Q_ASK_FOR_SGDC 0 +# Variable to check if user has sdc file and no sgdc file +register_variable Q_ASK_FOR_SDC 0 +#variable for sdc file name +register_variable Q_SDC_FILE "" +#variable for Last Setup +register_variable Q_LAST_SETUP 0 +#Ask for current_design +register_variable Q_CURRENT_DESIGN "" +# Check if File Exists +register_variable Q_FILE_EXISTS 0 +# Global SGDC File Name - Eventually to be use tagging +register_variable Q_GLOBAL_SGDC "$PRJFILES_DIR/constraints.sgdc" + +set_property -show_index +set_property -hide_step_numbering + +sgsSet Q_FILE_EXISTS 0 +get_property system.fileExists $Q_GLOBAL_SGDC -result_variable Q_FILE_EXISTS +sgsIf { $Q_FILE_EXISTS == 1 } { + set_header_state "Configure SpyGlass Design Constraint File" complete +} + +set_property -step_header "Before You Start" -show_progress_bar -hide_quality_bar +sgsIf { $Q_FILE_EXISTS == 1 } { + create_form -label "CONFIGURE LAST SETUP" { + get_bool -text "A SGDC file from previous setup was detected. Do you want to use the last setup?" -result_variable Q_LAST_SETUP -buttons {"Yes" "No"} -auto_proceed -style radio -geometry { -side bottom -expand 0 } + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Analyze_the_Flavor_of_SDC.htm + } +} sgsElse { +show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Analyze_the_Flavor_of_SDC.htm +} +set_header_state "Before You Start" complete + +set_property -step_header "Configure SpyGlass Design Constraint File" +sgsIf { $Q_LAST_SETUP == 0} { + create_form -label "CONFIGURE SGDC FILE" { + get_bool -text "Do you have a SGDC file?" -result_variable Q_ASK_FOR_SGDC -buttons {"Yes" "No"} -auto_proceed -style radio -geometry { -side bottom -expand 0 } + get_bool -text "Do you have a SDC file" -result_variable Q_ASK_FOR_SDC -auto_proceed -style radio -geometry { -side bottom -expand 0 } + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm + } + set_property -disable_next_button + sgsIf { ( $Q_ASK_FOR_SGDC == 1 ) && ( $Q_ASK_FOR_SDC == 1 ) } { + show_text "You have to either specify SGDC file(with sdc_data refering to SDC file) or a SDC file which will enable spyglass to automatically create SGDC file for you. Please click back and select one of them. If you select no for both, setup will create a boilerplate SGDC file for you to populate." + } + + sgsIf { $Q_ASK_FOR_SGDC == 1 } { + set_property -enable_next_button + get_file -type {"SGDC Files" "*.sgdc"} -fileExt { "SGDC Files" "*.sgdc" } -result_variable Q_SGDC_FILE -text "Please select the SGDC file" + sgsExec { /bin/cp {get_variable $Q_SGDC_FILE } { get_variable $Q_GLOBAL_SGDC } } + set_constraints $Q_GLOBAL_SGDC -constraints {current_design sdc_data} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm + } sgsElse { + sgsIf {$Q_ASK_FOR_SDC == 1 } { + set_property -enable_next_button + create_form -label "CONFIGURE SDC FILE" { + get_file -type { "SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_FILE -text "Please select the SDC file" + set_sgdc_curr_design -text "Enter Current Design" -result_variable Q_CURRENT_DESIGN + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm + #get_property console.top -result_variable Q_CURRENT_DESIGN + #set_sgdc_curr_design -text "Please select the Top Design Unit" -result_variable Q_CURRENT_DESIGN + #get_string -text "Enter Current Design" -result_variable Q_CURRENT_DESIGN + } + + sgsIf {$Q_SDC_FILE == ""} { + set_property -disable_next_button + show_text " You have not selected the SDC file. Please click back and select the SDC file" + } + sgsIf {$Q_CURRENT_DESIGN == ""} { + set_property -disable_next_button + show_text " No current design has been specified or selected. Please click back and select the current design " + } + + set_property -enable_next_button + sgsExec { /bin/cp $SPYGLASS_HOME/.Methodology/Constraints/setup_template/constraints.sgdc {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo current_design {get_variable $Q_CURRENT_DESIGN} > {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_FILE} >> {get_variable $Q_GLOBAL_SGDC} } + set_constraints $Q_GLOBAL_SGDC -constraints {current_design sdc_data} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm + } sgsElse { + set_property -enable_next_button + sgsExec { /bin/cp $SPYGLASS_HOME/.Methodology/Constraints/setup_template/constraints.sgdc {get_variable $Q_GLOBAL_SGDC} } + set_constraints $Q_GLOBAL_SGDC -constraints {current_design sdc_data} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm + } + } + + set_header_state "Configure SpyGlass Design Constraint File" complete +} sgsElse { + set_header_state "Configure SpyGlass Design Constraint File" skipped + set_constraints $Q_GLOBAL_SGDC -constraints {current_design sdc_data} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm +} + +set_property -step_header "Setup Closure" +sgsSet Q_FILE_EXISTS 0 +get_property system.fileExists $Q_GLOBAL_SGDC -result_variable Q_FILE_EXISTS +sgsIf { $Q_FILE_EXISTS == 1 } { +set_header_state "Setup Closure" complete +show_text " Setup is complete and verified " +} sgsElse { + set_property -disable_next_button +show_text " Setup is incomplete. SGDC file is missing or corrupted. Please Restart or click Back button " +} + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit.spq new file mode 100644 index 0000000..37f547e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit.spq @@ -0,0 +1,52 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : sdc_audit +// Version: 1.0.1 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// 1.0.1 19-mar-2014 rule SDC_DataSheet added +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +sdc_audit Constraints Mixed +* +This goal gives designers the ability to compute Design Coverage and report uncovered objects. +* +This audit goal gives designers the ability to compute Design Coverage and reports uncovered design objects. The goal will generate a report providing a health card for the SDC, which will include ports and registers that are not constrainted and the reason why constraints are missing on these design objects. + +In addition, the goal is to extract the domain information from SDC Commands. Extracted information is checked for consistency with the SGDC domain information. It informs the user about the conflicting clock domain classifications in SDC. A SGDC file is generated containing all the clock_group information inferred from the SDC constraints, which can be used for further analysis. Generated clocks' corresponding to source clocks are reported in a tabular format. + + +For more details about this goal, please refer to the SpyGlass-Constraints-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +-mixed + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=constraints + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules SDC_Coverage // Reports how well SDC covers the design + +-rules DomainAnalysis //extract domain infromation from the SDC constraints +-rules DomainError //Flags clock domain errors extracted from SDC commands +-rules DomainInfo //Generate domain information for interacting clocks from SDC commands +-rules Domain_SGDC_Consis //clock_group specified in SGDC not consistent with clock_group extracted from SDC constraints + +-rules SDC_Report01 //Prints table of Generated clocks versus source clocks +-rules SDC_DataSheet //VI-85162 + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit_debug_help.htm new file mode 100644 index 0000000..d476e54 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_audit_debug_help.htm @@ -0,0 +1,68 @@ + + + + + + + + + + sdc_audit + + + + + + + + + + + + + +
    + +
    +

    +sdc_audit +

    +

    +This goal gives designers the ability to compute Constraints Coverage and report uncovered objects. Coverage is reported in terms of design objects left uncovered by the specified constraints. Design objects of interest for the rule are ports and registers. An uncovered design object is an indication of missing constraints. +

    +

    +The report will identify objects not covered by any constraints and reasons for lack of coverage. If registers are not constrained, run clock_consis goal to get more details. If ports are not constrained, run io_delay goal to get more details. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check.spq new file mode 100644 index 0000000..aacbdcb --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check.spq @@ -0,0 +1,108 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : sdc_check +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +sdc_check-mixed +* +Basic Consistency and Clean Clock Definition +* +The objective of this step is to detect the inconsistencies in specification of clocks, generated clocks, and perform basic checks on overwritten and conflicting constraints. Without the clean clock definitions, rest of the constraint validation and exception verification would be ineffective. Overwritten and conflicting constraints may not capture the design intent correctly. + +The step also detects the inconsistencies in specification of input/output delays, clock latency, clock uncertainty. Such inconsistencies not only result in synthesis or static timing analysis to produce incorrect results, they can potentially allow these tools to assume a greater slack than available. This translates to insufficient or incomplete optimization by synthesis, which directly affects the QoR. + +Finally this goal checks that all combinational paths are constrained correctly. If a combination path is unconstrained or incorrectly constrained, then tool will perform no timing check on these paths. As a result a device's +operation at any specified speed can not be guaranteed. + +For more details about this goal, please refer to the SpyGlass-Constraints-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut+++++++++++ + +-mixed + + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=constraints + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-tc_ignore_te=no +-ignore_io_if_fp=yes + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +// Check for Clock Issues +-rules Const_Struct04a // Overwritten constraint detected +-rules Const_Struct05 // Conflicting constraints detected +-overloadrules Const_Struct05+severity=Warning +-rules Clk_Gen01a // Clock not driven by a clock constraint +-overloadrules Clk_Gen01a+severity=Error +-rules Clk_Gen01b // Clock driven by a constant value or hanging +-rules Clk_Gen02 // Constrained clock not used as a clock +-overloadrules Clk_Gen02+severity=Info +-rules Clk_Gen03 // A generated clock is not in the fanout of it source clock +-overloadrules Clk_Gen03+severity=Error +-rules Clk_Gen05 // Some clocks in the same clock domain have a different root clock +-rules Clk_Gen06 // Multiple paths exist from the clock pin of a sequential cell to different clock sources +-rules Clk_Gen08 // Object on which clock is generated should not be a port +-rules Clk_Gen09 // Clock source pin is in the fanout of another clock, but is not generated by that clock +-overloadrules Clk_Gen09+severity=Error +-rules Clk_Gen22 // set_input_delay/set_output_delay has been specified on a clock port +-rules Clk_Gen23 // Incorrectly defined generated clock +//-rules Clk_Gen23a //Formal rule for Incorrectly defined Generated clock +-overloadrules Clk_Gen23+severity=Error + +-rules SDC_Methodology66 // set_case_analysis applied on a design object conflicts with the propagated value due to other set_case_analysis commands +-rules SDC_Methodology67 // set_case_analysis applied on the output of a flop conflicts with the value propagated at its input +-rules Clk_Lat08 // set_clock_latency is set to negative value +-rules Clk_Uncert01 // Clock_uncertainty constraint set on an object which is not a real or generated clock +-rules Clk_Uncert03 // Inter clock uncertainty not defined between synchronous clocks +-rules Clk_Uncert06 // set_clock_uncertainty is set to negative value + +// Check for I/O Delay Issues +-rules Inp_Del01b // Input not constrained by set_input_delay +-overloadrules Inp_Del01b+severity=Error +-rules Inp_Del03a // Input constraint associated with wrong (or, incomplete set of) clocks +-overloadrules Inp_Del03a+severity=Error +-rules Inp_Del08 // set_input_delay is set on the same input relative to multiple clocks but -add_delay missing +-overloadrules Inp_Del08+severity=Error +-rules Op_Del01b // Output has no set_output_delay constraint +-overloadrules Op_Del01b+severity=Error +-rules Op_Del03a // Output constraint associated with wrong (or, incomplete set of) clocks +-overloadrules Op_Del03a+severity=Error +-rules Op_Del08 // set_output_delay is set on the same output relative to multiple clocks but -add_delay is missing +-overloadrules Op_Del08+severity=Error +-rules Load02a // Load values are outside technology limits +-overloadrules Load02a+severity=Error +-rules Inp_Trans01a // Input transition or drive or driving cell is not defined for input +-overloadrules Inp_Trans01a+severity=Error +-rules SDC_Methodology07 // Delay value for constraint set_max_time_borrow is not within the clock period of the clock driving the latch + +// Check for Combinational Path Issues +-rules Combo_Paths01 // Combinational port to port path is unconstrained +-overloadrules Combo_Paths01+severity=Error +-rules Combo_Paths02 // Path specified in sdc file (through set_max_delay/set_min_delay) has max_delay < min_delay +-rules Combo_Paths03 // Combinational path has output_delay+input_delay > clock period or output_delay+input_delay > set_max_delay +-overloadrules Combo_Paths03+severity=Error +-rules Show_Case_Analysis +-rules Show_Clock_Propagation +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check_debug_help.htm new file mode 100644 index 0000000..3ff9f1c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check_debug_help.htm @@ -0,0 +1,16 @@ + + + sdc_check +

    SDC Check

    + + +

    The objective of this step is to detect the inconsistencies in specification of clocks, generated clocks, and perform basic checks on overwritten and conflicting constraints. Without the clean clock definitions, rest of the constraint validation and exception verification would be ineffective. Overwritten and conflicting constraints may not capture the design intent correctly.

    +

    The step also detects the inconsistencies in specification of input/output delays, clock latency, clock uncertainty. Such inconsistencies not only result in synthesis or static timing analysis to produce incorrect results, they can potentially allow these tools to assume a greater slack than available. This translates to insufficient or incomplete optimization by synthesis, which directly affects the QoR.

    +

    Finally this goal checks that all combinational paths are constrained correctly. If a combination path is unconstrained or incorrectly constrained, then tool will perform no timing check on these paths. As a result a device's + operation at any specified speed can not be guaranteed

    + +

    To debug issues with this goal, first debug all the SDC Parse violations. Such violations lead to incomplete parsing of the SDC file, and many constraints needed could have been ignored due to Parse errors

    + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check_setup.sgs new file mode 100644 index 0000000..f8a0422 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_check_setup.sgs @@ -0,0 +1,17 @@ +########################################################################## +# SpyGlass Constraints Methodology +# +# Version: 1.0 +# +# Revision History: +# Ver Date Comments +# 1.0 18-Jun-2008 Initial version +# +# Copyright Atrenta Inc, 2008. All rights reserved. +########################################################################## +# This is the setup file for SDC Validation +########################################################################## + +set_property -step_header "SDC Checks for Clocks, I/O and Feedthroughs" +set_parameters {pt chip clk_gen01_generate_report strict tc_ignore_latch_enable tc_ignore_te ignore_io_if_fp} + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv.spq new file mode 100644 index 0000000..5619ad7 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv.spq @@ -0,0 +1,41 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : sdc_equiv +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +sdc_equiv-mixed +* +Constriants Equivalece Checking +* +The objective of this step is to ensure that versions of constraints file are equivalent for the same design. As design goes through iterations, so does constraints. This steps helps designers to ensure that design intent is preserved on account of such iterations. + +For more details about this goal, please refer to the SpyGlass-Constraints-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut+++++++++++ +-mixed +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=const_mgmt,constraints + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Equiv_SDC // Check equivalence between two SDCs for the same design +-rules Show_Clock_Propagation +-rules Show_Case_Analysis +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv_debug_help.htm new file mode 100644 index 0000000..f89ec09 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv_debug_help.htm @@ -0,0 +1,85 @@ + + + + + + + + + + sdc_equiv + + + + + + + + + + + + + +
    + +
    +

    +sdc_equiv +

    +

    +The objective of this step is to ensure that versions of constraints file are equivalent for the same design. As design goes through iterations, so does constraints. This steps helps designers to ensure that design intent is preserved on account of such iterations. +

    +

    +This debug of this rule is typically iterative. The user would need to resolve equivalence issues in the following order - set_case_analysis, clocks (primary and generated), I/O Delay, Timing Exceptions and other constraints. Unless you fix set_case_analysis issues, you won't see clock related issues. This order is important to prevent noise from being reported in the equivalence. Consider the following example +

    +
    +SDC1 +
    +
    +create_clock -name c1 -period 10 -source [a/b/clk] 
    +set_input_delay 10 -clock [c1] [get_ports {in1}] 
    +
    +
    +SDC2 +
    +
    +create_clock -name c2 -period 11 -source [a/b/clk] 
    +set_input_delay 10 -clock [c2] [get_ports {in1}] 
    +
    +

    +In this example clocks C1 and C2 are not equivalent. If clocks are not checked before set_input_delay, the equivalence will unnecessarily report the input delays to be not equivalent. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv_setup.sgs new file mode 100644 index 0000000..6945fa9 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_equiv_setup.sgs @@ -0,0 +1,96 @@ +########################################################################## +# SpyGlass Constraints Methodology +# +# Version: 1.1 +# +# Revision History: +# Ver Date Comments +# 1.0 18-Jun-2008 Initial version +# 1.1 05-Aug-2010 Proper Setup manager for sdc_equiv +# Copyright Atrenta Inc, 2008. All rights reserved. +########################################################################## +# This is the setup file for SDC Validation +########################################################################## +register_variable Q_ASK_FOR_SGDC 0 +register_variable Q_ASK_FOR_SDC 0 +register_variable Q_FLOW_TYPE 0 +register_variable Q_SDC_FILE_1 +register_variable Q_SDC_FILE_2 +register_variable Q_BLOCK_NAME "" +register_variable Q_CURRENT_DESIGN "" +register_variable Q_GLOBAL_SGDC "$WDIR/constraints.sgdc" + +set_property -show_index +set_property -hide_step_numbering +#This step will show the help +set_property -step_header "Before You Start" -show_progress_bar -hide_quality_bar +show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/sdc_equivalence_before_you_start.htm +set_header_state "Before You Start" complete +#In this step we get the type of flow and sdc/sgdc files +set_property -step_header "Configure SpyGlass Design Constraint File" -prereq {"Before You Start"} + +create_form -label "CONFIGURE SGDC FILE" { +# show_text "If you have a SGDC file already added to the setup, then select no for both the options" + get_bool -text "Do you have a SGDC file?" -result_variable Q_ASK_FOR_SGDC -buttons {"Yes" "No"} -auto_proceed -style radio -geometry { -side bottom -expand 0 } + get_bool -text "Do you have a SDC file" -result_variable Q_ASK_FOR_SDC -auto_proceed -style radio -geometry { -side bottom -expand 0 } + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm +} +set_property -disable_next_button +sgsIf { ( $Q_ASK_FOR_SGDC == 1 ) && ( $Q_ASK_FOR_SDC == 1 ) } { + show_text "You have to either specify SGDC file(with sdc_data refering to SDC file) or a SDC file which will enable spyglass to automatically create SGDC file for you. Please click back and select one of them. If you select no for both, setup will create a boilerplate SGDC file for you to populate." +} + +sgsIf { $Q_ASK_FOR_SGDC == 1 } { + set_property -enable_next_button + get_file -type {"SGDC Files" "*.sgdc"} -fileExt { "SGDC Files" "*.sgdc" } -result_variable Q_SGDC_FILE -text "Please select the SGDC file" + sgsExec { /bin/cp {get_variable $Q_SGDC_FILE } { get_variable $Q_GLOBAL_SGDC } } + set_constraints $Q_GLOBAL_SGDC -constraints {current_design sdc_data} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm +} sgsElse { + sgsIf {$Q_ASK_FOR_SDC ==1} { + set_property -enable_next_button +# get_bool -text "Choose Yes if you would like to do block top equivalence, and no if you like to do reference implement equivalence for same top" -buttons {"Yes" "No"} -result_variable Q_FLOW_TYPE -auto_proceed -geometry { -side bottom -expand 0 } + + sgsIf {$Q_FLOW_TYPE == 1} { + create_form -label "Configure SDC File" { + get_file -type {"SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_FILE_1 -text "Please select the SDC file(s) for top module" + get_file -type {"SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_FILE_2 -text "Please select the SDC file(s) for block" + set_sgdc_curr_design -text "Enter Top Design" -result_variable Q_CURRENT_DESIGN + get_string -text "Please enter the block name" -result_variable Q_BLOCK_NAME + } + sgsExec { /bin/cp $SPYGLASS_HOME/.Methodology/Constraints/setup_template/constraints.sgdc {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo current_design {get_variable $Q_CURRENT_DESIGN} > {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo block -name {get_variable $Q_BLOCK_NAME} >> {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_FILE_1} -mode flatTop >> {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo current_design {get_variable $Q_BLOCK_NAME} >> {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_FILE_2} -mode block >> {get_variable $Q_GLOBAL_SGDC} } + } sgsElse { + create_form -label "Configure SDC File" { + get_file -type {"SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_FILE_1 -text "Please select the reference SDC file(s)" + get_file -type {"SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_FILE_2 -text "Please select the implement SDC file(s)" + set_sgdc_curr_design -text "Enter Top Design" -result_variable Q_CURRENT_DESIGN + } + sgsExec { /bin/cp $SPYGLASS_HOME/.Methodology/Constraints/setup_template/constraints.sgdc {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo current_design {get_variable $Q_CURRENT_DESIGN} > {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_FILE_1} -mode reference >> {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_FILE_2} -mode implement >> {get_variable $Q_GLOBAL_SGDC} } + } + } sgsElse { + + show_text "Please add a SGDC file or enable previously selected SGDC files" + set_constraints + } +} + +set_header_state "Configure SpyGlass Design Constraint File" complete + + +set_property -step_header "Set Parameters" -prereq {"Configure SpyGlass Design Constraint File"} +set_parameters {equiv_sdc_ambiguous_clock_file equiv_sdc_constraint_file equiv_sdc_tolerance} +set_header_state "Set Parameters" complete + +set_property -step_header "Setup Closure" -prereq {"Before You Start" "Configure SpyGlass Design Constraint File"} +show_text "Please review the SGDC files created in this setup" +set_constraints $Q_GLOBAL_SGDC +show_text "Setup is complete and verified" +set_header_state "Setup Closure" complete + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct.spq new file mode 100644 index 0000000..146bf11 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct.spq @@ -0,0 +1,53 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : sdc_exception_struct +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// 1.0.1 28-Feb-2014 VI-84582 (SCG01 to SCG05 rules are added to guideware2.0) +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +sdc_exception_struct-mixed +* +Check Timing Exceptions Structurally +* +The objective of this step is to check that Timing Exceptions specified in a constraints file as are on paths which are structurally connected. This step is a pre-requisite, before the paths can be verified formally to be correct. Exceptions set on paths that are structurally not connected are redundant and increase the runtime of implementation tools. + +For more details about this goal, please refer to the SpyGlass-Constraints-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut+++++++++++ +-mixed +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=constraints + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules False_Path01 // False path reference points are not connected +-rules False_Path09 // False path uses same clock in its -from and -to lists +-rules MCP01 // Multi cycle path reference points are not connected +-rules MCP05 // set_multicycle_path setup/hold over or under defined +-rules TE_Conflict01 // Overlap between different timing exceptions commands + +-rules Show_Case_Analysis +-rules Show_Clock_Propagation + +-rules SCG01 //SCG01 to SCG05 added for VI-84582 +-rules SCG02 +-rules SCG03 +-rules SCG04 +-rules SCG05 +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct_debug_help.htm new file mode 100644 index 0000000..f9e20d3 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct_debug_help.htm @@ -0,0 +1,68 @@ + + + + + + + + + + sdc_exception_struct + + + + + + + + + + + + + +
    + +
    +

    +sdc_exception_struct +

    +

    +The objective of this step is to check that Timing Exceptions specified in a constraints file are on paths which are structurally connected. This step is a pre-requisite, before the paths can be verified formally to be correct. Exceptions set on paths that are structurally not connected are redundant and indicate the possibility of typos in specifying the exceptions. +

    +

    +Before debugging this goal ensure that goal clock_consis has been cleaned. Incomplete/incorrect clock can result in noise to be generated for rules in this goal. The rules in this goal can be debugged in any order. To debug False_Path01 and MCP01, open the incremental schematic and try to traverse from the start point to see where the path is broken or blocked that causes the exceptions not to be structurally connected. If there are violations from TE_Conflict01, remove overlapping exceptions. Even though tools provide a well defined order of precedence when exceptions overlap (False Path > Multi Cycle Path > Max/Min Delay), however that order may not be what the designer intended. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct_setup.sgs new file mode 100644 index 0000000..1b1ff09 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_exception_struct_setup.sgs @@ -0,0 +1,16 @@ +########################################################################## +# SpyGlass Constraints Methodology +# +# Version: 1.0 +# +# Revision History: +# Ver Date Comments +# 1.0 18-Jun-2008 Initial version +# +# Copyright Atrenta Inc, 2008. All rights reserved. +########################################################################## +# This is the setup file for SDC Validation +########################################################################## + +set_property -step_header "Check for Structual Correctness of Exceptions" +set_parameters {tc_ignore_clk_to_clk tc_clk_pairs_for_fp strict} diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen.spq new file mode 100644 index 0000000..2092c66 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen.spq @@ -0,0 +1,48 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : sdc_gen +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Generates Constraints Mixed +* +This goal gives designers the ability to create SDC templates from RTL or netlist. +* +This goal gives designers the ability to create SDC templates from RTL or netlist. This requires the users to identify correct clock sources (in the .sgdc file) + +This goal is useful if you have an RTL, but, don't have the associated SDC. The template will help create a bare-bone structure, where, the actual numbers can be filled up later by the user. + +For more details about this goal, please refer to the SpyGlass-Constraints-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +-mixed +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=constraints + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +// The following rules belongs to constraints policy +-rules SDC_GenerateIncr // Generate a template constraints file for a block + +//The following rules belong to clock-reset policy and may be needed for debug +//-policies=clock-reset +//-rules Info_Case_Analysis +//-sdc2sgdc + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen_debug_help.htm new file mode 100644 index 0000000..c08f36a --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen_debug_help.htm @@ -0,0 +1,15 @@ + + + sdc_gen +

    SDC Generation

    + + + +

    This goal gives designers the ability to create SDC templates from RTL or netlist. This requires the users to identify correct clock sources (in the .sgdc file)

    + +

    This goal is useful if you have an RTL, but, don't have the associated SDC. The template will help create a bare-bone structure, where, the actual numbers can be filled up later by the user.

    + +

    For more details about this goal, please refer to the SpyGlass-Constraints-Methodology.pdf file in the doc subdirectory of your SpyGlass installation.

    + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen_setup.sgs new file mode 100644 index 0000000..907f822 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_gen_setup.sgs @@ -0,0 +1,234 @@ +########################################################################## +# SpyGlass Constraints Methodology +# +# Version: 1.4 +# +# Revision History: +# Ver Date Comments +# 1.0 18-Jun-2008 Initial version +# 1.1 28-Jul-2008 1) Fixed incorrect documentation in setup +# (29544, 31450) +# 2) Fixed redundancy in steps (31170) +# 3) Enhanced to edit gensdcConstraintsfile.txt (31468) +# 1.2 15-Dec-2008 1) New CDC Setup Manager integrated +# 2) Console Setup improved +# 1.3 24-Dec-2008 1) register output file issues fixed in Console +# 2) Added comments +# 1.4 20-Jan-2009 1) Fixed VIs 36448, 35958 +# Copyright Atrenta Inc, 2008. All rights reserved. +########################################################################## +# This is the SGS script to setup Constraints Generation +########################################################################## +########################################################################## +# Register Variables to be used in the script here +########################################################################## +# Variable to check if clock has been saved in SGDC +register_variable Q_SGDC_MOD 0 +# Variable to check if clock setup has been run once +register_variable Q_RUN_ONCE 0 +# Variable to check if user wants to run clock setup +register_variable Q_RUN_CLK_SETUP 0 +# Variable to check if file exists +register_variable Q_FILE_EXISTS 0 +# Variable to check, if user has SGDC that he wants to user instead of clock setup +register_variable Q_ASK_FOR_SGDC 0 +# Variable to check, if user want parametrized SDC +register_variable Q_ASK_FOR_PARAM 0 +# Variable to check, SDC Generation has been run once. This way when user hits back button +# and comes back to the step again, it will load the exisiting run +register_variable Q_SDC_GEN_ONCE 0 +# Variable to check, SDC Generation has been run once incrementall. This way when user hits back button +# and comes back to the step again, it will load the exisiting run +register_variable Q_SDC_GEN_INCR 0 +# Variable to store whether last run was with Param or not +register_variable Q_LAST_RUN_WITH_PARAM 0 + +source $SPYGLASS_HOME/auxi/common_setup/init_central.sgs + +########################################################################## +# Common Procedures +########################################################################## +## Before you start +set_property -show_index +set_property -hide_step_numbering + +register_variable USE_DESIGN_CLOCKS 1 +register_variable USE_BBOX_RESOLUTION 1 +source $SPYGLASS_HOME/auxi/common_setup/get_central_status.sgs + +set_property -step_header "Before You Start" -show_index +show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Constraints_Generation_Setup.htm +set_header_state "Before You Start" complete +## Resolve Blackboxes +source $SPYGLASS_HOME/auxi/common_setup/bb_resolution/bb_resolution.sgs +########################################################################## +# Setup Step 1 ................... +# Identify all clocks using CDC Setup +########################################################################## + +source $SPYGLASS_HOME/.Methodology/Clock-reset/CDC-Setup-Manager/CDC_Setup_Manager_clock_setup.sgs + +# Add generated SGDC file to the project with recommended constraint as clocks + set_constraints $PRJFILES_DIR/cdc_setup_clocks.sgdc -constraints {clock} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Copy_and_Modify_autoclocks.sgdc.htm -label "Identified Clocks" + +# set_header_state "Review Clocks" complete +#} sgsElse { +## User would have reached this when he created SGDC file and hence Review of Clock Setup Wizard setup is skipped +# set_header_state "Review Clocks" skipped +#} + +########################################################################## +# Setup Step 2 ................... +# Use the SGDC file and generate all clocks in SDC format +########################################################################## + +set_property -step_header "Choose Constraints" -hide_label -show_index -enable_next_button -set_prereq_steps {"Before You Start" "Design Clocks" } + +# Copy the default gensdcConstraintsFile.txt from installation and let the user edit it +#sgsExec { /bin/cp $SPYGLASS_HOME/policies/constraints/gensdcConstraintsFile.txt $WDIR/gensdcConstraintsFile.txt } + sgsCopyFile -file $SPYGLASS_HOME/policies/constraints/gensdcConstraintsFile.txt -target $WDIR/gensdcConstraintsFile.txt +edit_file $WDIR/gensdcConstraintsFile.txt -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Generating_Clocks.htm + +set_header_state "Choose Constraints" complete + +# Now Run the Generation. Ask the user if he/she wants parameterized SDC +set_property -step_header "Generate SDC file" -hide_label -show_index -enable_next_button -set_prereq_steps {"Before You Start" "Design Clocks" "Choose Constraints"} +set_sgdc_state -enable {get_variable $SETUP_CLOCKS_SGDC} +create_form -label "ASK_FOR_PARAMETRIZATION" { + get_bool -text "Do you create parametrizable SDC? (Default is No)" -result_variable Q_ASK_FOR_PARAM -button {"Yes" "No"} -auto_proceed -geometry { -side bottom } + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Generate_SDC_Template.htm +} +sgsIf { $Q_SDC_GEN_ONCE == 0 || $Q_ASK_FOR_PARAM != $Q_LAST_RUN_WITH_PARAM } { + sgsSet Q_SDC_GEN_ONCE 1 + sgsIf { $Q_ASK_FOR_PARAM == 0} { + sgsSet Q_LAST_RUN_WITH_PARAM 0 + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt" -auto_run -must_run -text "Running Goal Gen_Constraints to generate the chosen constraints." -auto_proceed + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Populate_SDC_Template.htm + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt" -text "Running Goal Gen_Constraints to generate the chosen constraints." + } sgsElse { + sgsSet Q_LAST_RUN_WITH_PARAM 1 + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt -gen_sdc_param_file=$SPYGLASS_HOME/policies/constraints/gensdcParamSdc.txt -tc_enable_param_sdc_flow='yes'" -auto_run -must_run -text "Running Goal Gen_Constraints to generate the chosen constraints." -auto_proceed + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Populate_SDC_Template.htm + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt -gen_sdc_param_file=$SPYGLASS_HOME/policies/constraints/gensdcParamSdc.txt" -text "Running Goal Gen_Constraints to generate the chosen constraints." + } +} sgsElse { + sgsIf { $Q_ASK_FOR_PARAM == 0} { + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Populate_SDC_Template.htm + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt" -text "Running Goal Gen_Constraints to generate the chosen constraints." + } sgsElse { + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Populate_SDC_Template.htm + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt -gen_sdc_param_file=$SPYGLASS_HOME/policies/constraints/gensdcParamSdc.txt -tc_enable_param_sdc_flow='yes'" -text "Running Goal Gen_Constraints to generate the chosen constraints." + } +} + + +set_header_state "Generate SDC file" complete +########################################################################## +# Setup Step 3 ................... +# Use the seed file from Step 2 to add generate more constraints +# This step is same as step2, except that SGDC input is different +########################################################################## +set_property -step_header "Choose More Constraints" -hide_label -show_index -enable_next_button -set_prereq_steps {"Before You Start" "Design Clocks" "Choose Constraints" "Generate SDC file"} + +# Set the constraints, so that user can now setup the seed file for a future run +#set_constraints -constraints {"sdc_data"} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Adding_Constraints_Incrementally.htm +# Copy the file generated in the last run, into the run directory so that user can specify the seed, without any +# references to the path +#sgsExec { /bin/cp $WDIR/spyglass_reports/constraints/*.sdc $PRJFILES_DIR/ } +# +register_variable ALL_OLD_FILE_LIST +get_property console.SGDClist -result_variable ALL_OLD_FILE_LIST +set_sgdc_state -disable { get_variable $ALL_OLD_FILE_LIST } + +register_variable Q_SDC_INCR_FILE +register_variable Q_CURRENT_DESIGN +create_form -label "CONFIGURE SDC FILE" { + get_file -type { "SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_INCR_FILE -text "Please select the SDC file generated from the gen_sdc run along with seed sdc file" + set_sgdc_curr_design -text "Enter Current Design" -result_variable Q_CURRENT_DESIGN + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Adding_Constraints_Incrementally.htm + } +sgsIf {$Q_SDC_INCR_FILE == ""} { + set_property -disable_next_button + show_text " You have not selected the SDC file. Please click back and select the SDC file" +} +sgsIf {$Q_CURRENT_DESIGN == ""} { + set_property -disable_next_button + show_text " No current design has been specified or selected. Please click back and select the current design " +} +set_property -enable_next_button +register_variable Q_INCREMENTAL_SGDC "$PRJFILES_DIR/incr.sgdc" +sgsExec { /bin/cp $SPYGLASS_HOME/.Methodology/Constraints/setup_template/constraints.sgdc {get_variable $Q_INCREMENTAL_SGDC} } +sgsExec { echo current_design {get_variable $Q_CURRENT_DESIGN} > {get_variable $Q_INCREMENTAL_SGDC} } +sgsExec { echo sdc_data -file {get_variable $Q_SDC_INCR_FILE} -mode seed >> {get_variable $Q_INCREMENTAL_SGDC} } +set_constraints $Q_INCREMENTAL_SGDC -constraints {current_design sdc_data} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm + +# Edit the side file constaining constraints to be generated +edit_file $WDIR/gensdcConstraintsFile.txt -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Choose_Constraints_to_be_added_incrementally.htm + +set_header_state "Choose More Constraints" complete + +set_property -step_header "Generate SDC incrementally" -hide_label -show_index -enable_next_button -set_prereq_steps {"Before You Start" "Design Clocks" "Choose Constraints" "Generate SDC file" "Choose More Constraints"} +show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Populate_SDC_Template.htm +# Now Run the Generation again. Based on what user chose last time, the option to generate parametrized SDC will be +# jsut inherited from the last run +sgsIf { $Q_SDC_GEN_INCR == 0 || $Q_ASK_FOR_PARAM != $Q_LAST_RUN_WITH_PARAM } { + sgsSet Q_SDC_GEN_INCR 1 + sgsIf { $Q_ASK_FOR_PARAM == 0} { + sgsSet Q_LAST_RUN_WITH_PARAM 0 + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt" -must_run -auto_run -text "Running Goal Gen_Constraints to generate the chosen constraints." + } sgsElse { + sgsSet Q_LAST_RUN_WITH_PARAM 1 + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt -gen_sdc_param_file=$SPYGLASS_HOME/policies/constraints/gensdcParamSdc.txt -tc_enable_param_sdc_flow='yes'" -must_run -auto_run -text "Running Goal Gen_Constraints to generate the chosen constraints." + } +} sgsElse { + sgsIf { $Q_ASK_FOR_PARAM == 0} { + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt" -text "Running Goal Gen_Constraints to generate the chosen constraints." + } sgsElse { + run_setup_template $SPYGLASS_HOME/.Methodology/Constraints/rtl/gen_sdc -additionalCmd "-gen_sdc_constraints_file=$WDIR/gensdcConstraintsFile.txt -gen_sdc_param_file=$SPYGLASS_HOME/policies/constraints/gensdcParamSdc.txt -tc_enable_param_sdc_flow='yes'" -text "Running Goal Gen_Constraints to generate the chosen constraints." + } +} + +register_variable Q_FINAL_SGDC "$PRJFILES_DIR/final.sgdc" +register_variable Q_FINAL_SGDC_EXISTS 0 +register_variable Q_LAST_SETUP 0 +get_property console.SGDClist -result_variable ALL_OLD_FILE_LIST +set_sgdc_state -disable { get_variable $ALL_OLD_FILE_LIST } + +get_property system.fileExists { get_variable $Q_FINAL_SGDC } -result_variable Q_FINAL_SGDC_EXISTS +## Here we ask the user to again create an SGDC file from last runs generated files. This will be the final SGDC file which will be used during actual goal run + +sgsIf { $Q_FINAL_SGDC_EXISTS == 1 } { + create_form -label "CONFIGURE LAST SETUP" { + get_bool -text "Final SGDC File already exists, do you want to re-use it?" -result_variable Q_LAST_SETUP -buttons {"Yes" "No"} -auto_proceed -style radio -geometry { -side bottom -expand 0 } + } +} + +sgsIf {$Q_LAST_SETUP == 0} { + create_form -label "CONFIGURE SDC FILE" { + get_file -type { "SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_INCR_FILE -text "Please select the SDC file generated from the gen_sdc run along with seed sdc file" + set_sgdc_curr_design -text "Enter Current Design" -result_variable Q_CURRENT_DESIGN + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Adding_Constraints_Incrementally.htm + } + sgsIf {$Q_SDC_INCR_FILE == ""} { + set_property -disable_next_button + show_text " You have not selected the SDC file. Please click back and select the SDC file" + } + sgsIf {$Q_CURRENT_DESIGN == ""} { + set_property -disable_next_button + show_text " No current design has been specified or selected. Please click back and select the current design " + } + set_property -enable_next_button + + sgsExec { /bin/cp $SPYGLASS_HOME/.Methodology/Constraints/setup_template/constraints.sgdc {get_variable $Q_FINAL_SGDC} } + sgsExec { echo current_design {get_variable $Q_CURRENT_DESIGN} > {get_variable $Q_FINAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_INCR_FILE} -mode seed >> {get_variable $Q_FINAL_SGDC} } +} +#sgsExec { /bin/cp $WDIR/spyglass_reports/constraints/*.sdc $PRJFILES_DIR/ } +set_header_state "Generate SDC incrementally" complete + +set_property -step_header "Setup Closure" -hide_label -show_index -enable_next_button -set_prereq_steps {"Before You Start" "Design Clocks" "Choose Constraints" "Generate SDC file" "Choose More Constraints" "Generate SDC incrementally" } +show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/gen_sdc_setup_closure.htm +set_constraints $Q_FINAL_SGDC -constraints {current_design sdc_data} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm + +set_header_state "Setup Closure" complete + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv.spq new file mode 100644 index 0000000..ed4e52f --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv.spq @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : sdc_hier_equiv +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +sdc_hier_equiv-mixed +* +Hierarchical Constriants Checking +* +The objective of this step is to ensure that constraints are consistent across block hierarchies. This step will help you to check consistency of Block level constraint with sub-chip/chip level constraints for clocks, I/O delays. E.g. a block may have been synthesized with a lower frequency clock (bigger clock period), but at chip level is being driven by a higher frequency clock (smaller clock period). The block may not function correctly. + +For more details about this goal, please refer to the SpyGlass-Constraints-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut+++++++++++ +-mixed +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=constraints,const_mgmt + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules IO_Consis04 // Sum of input delay and output delay should not exceed clock period +-rules Equiv_SDC_Block // Check Equivalence between Top and Block level SDC +-rules Show_Case_Analysis +-rules Show_Clock_Propagation +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv_debug_help.htm new file mode 100644 index 0000000..916032f --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv_debug_help.htm @@ -0,0 +1,85 @@ + + + + + + + + + + sdc_hier_equiv + + + + + + + + + + + + + +
    + +
    +

    +sdc_hier_equiv +

    +

    +The objective of this step is to ensure that constraints are consistent across block hierarchies. This step will help you to check consistency of Block level constraint with sub-chip/chip level constraints for clocks, I/O delays. E.g. a block may have been synthesized with a lower frequency clock (bigger clock period), but at chip level is being driven by a higher frequency clock (smaller clock period). The block may not function correctly. +

    +

    +This debug of this rule is typically iterative. The user would need to resolve equivalence issues in the following order - set_case_analysis, clocks (primary and generated), I/O Delay, Timing Exceptions and other constraints. Unless you fix set_case_analysis issues, you won't see clock related issues. This order is important to prevent noise from being reported in the equivalence. Consider the following example +

    +
    +SDC1 at Top +
    +
    +create_clock -name c1 -period 10 -source [clk] 
    +set_input_delay 10 -clock [c1] [get_ports {in1}] 
    +
    +
    +SDC2 at Block +
    +
    +create_clock -name c1 -period 11 -source [block/clk] 
    +set_input_delay 10 -clock [c1] [get_ports {block/in1}] 
    +
    +

    +In this example clocks C1 (in top) and C1 (in block) are not equivalent. If clocks are not checked before set_input_delay, the equivalence will unnecessarily report the input delays to be not equivalent. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv_setup.sgs new file mode 100644 index 0000000..6843945 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_hier_equiv_setup.sgs @@ -0,0 +1,96 @@ +########################################################################## +# SpyGlass Constraints Methodology +# +# Version: 1.1 +# +# Revision History: +# Ver Date Comments +# 1.0 18-Jun-2008 Initial version +# 1.1 05-Aug-2010 Proper Setup manager for sdc_equiv +# Copyright Atrenta Inc, 2008. All rights reserved. +########################################################################## +# This is the setup file for SDC Validation +########################################################################## +register_variable Q_ASK_FOR_SGDC 0 +register_variable Q_ASK_FOR_SDC 0 +register_variable Q_FLOW_TYPE 1 +register_variable Q_SDC_FILE_1 +register_variable Q_SDC_FILE_2 +register_variable Q_BLOCK_NAME "" +register_variable Q_CURRENT_DESIGN "" +register_variable Q_GLOBAL_SGDC "$WDIR/constraints.sgdc" + +set_property -show_index +set_property -hide_step_numbering +#This step will show the help +set_property -step_header "Before You Start" -show_progress_bar -hide_quality_bar +show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/hierarchical_check_before_you_start.htm +set_header_state "Before You Start" complete +#In this step we get the type of flow and sdc/sgdc files +set_property -step_header "Configure SpyGlass Design Constraint File" -prereq {"Before You Start"} + +create_form -label "CONFIGURE SGDC FILE" { +# show_text "If you have a SGDC file already added to the setup, then select no for both the options" + get_bool -text "Do you have a SGDC file?" -result_variable Q_ASK_FOR_SGDC -buttons {"Yes" "No"} -auto_proceed -style radio -geometry { -side bottom -expand 0 } + get_bool -text "Do you have a SDC file" -result_variable Q_ASK_FOR_SDC -auto_proceed -style radio -geometry { -side bottom -expand 0 } + show_html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm +} +set_property -disable_next_button +sgsIf { ( $Q_ASK_FOR_SGDC == 1 ) && ( $Q_ASK_FOR_SDC == 1 ) } { + show_text "You have to either specify SGDC file(with sdc_data refering to SDC file) or a SDC file which will enable spyglass to automatically create SGDC file for you. Please click back and select one of them. If you select no for both, setup will create a boilerplate SGDC file for you to populate." +} + +sgsIf { $Q_ASK_FOR_SGDC == 1 } { + set_property -enable_next_button + get_file -type {"SGDC Files" "*.sgdc"} -fileExt { "SGDC Files" "*.sgdc" } -result_variable Q_SGDC_FILE -text "Please select the SGDC file" + sgsExec { /bin/cp {get_variable $Q_SGDC_FILE } { get_variable $Q_GLOBAL_SGDC } } + set_constraints $Q_GLOBAL_SGDC -constraints {current_design sdc_data} -html $SPYGLASS_HOME/.Methodology/Constraints/doc/Configure_SpyGlass_Design_Constraint_File.htm +} sgsElse { + sgsIf {$Q_ASK_FOR_SDC ==1} { + set_property -enable_next_button +# get_bool -text "Choose Yes if you would like to do block top equivalence, and no if you like to do reference implement equivalence for same top" -buttons {"Yes" "No"} -result_variable Q_FLOW_TYPE -auto_proceed -geometry { -side bottom -expand 0 } + + sgsIf {$Q_FLOW_TYPE == 1} { + create_form -label "Configure SDC File" { + get_file -type {"SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_FILE_1 -text "Please select the SDC file(s) for top module" + get_file -type {"SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_FILE_2 -text "Please select the SDC file(s) for block" + set_sgdc_curr_design -text "Enter Top Design" -result_variable Q_CURRENT_DESIGN + get_string -text "Please enter the block name" -result_variable Q_BLOCK_NAME + } + sgsExec { /bin/cp $SPYGLASS_HOME/.Methodology/Constraints/setup_template/constraints.sgdc {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo current_design {get_variable $Q_CURRENT_DESIGN} > {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_FILE_1} -mode flatTop >> {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo block -name {get_variable $Q_BLOCK_NAME} >> {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo current_design {get_variable $Q_BLOCK_NAME} >> {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_FILE_2} -mode block >> {get_variable $Q_GLOBAL_SGDC} } + } sgsElse { + create_form -label "Configure SDC File" { + get_file -type {"SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_FILE_1 -text "Please select the reference SDC file(s)" + get_file -type {"SDC Files" "*.sdc" } -fileExt { "SDC Files" "*.sdc" } -allow_multiple -result_variable Q_SDC_FILE_2 -text "Please select the implement SDC file(s)" + set_sgdc_curr_design -text "Enter Top Design" -result_variable Q_CURRENT_DESIGN + } + sgsExec { /bin/cp $SPYGLASS_HOME/.Methodology/Constraints/setup_template/constraints.sgdc {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo current_design {get_variable $Q_CURRENT_DESIGN} > {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_FILE_1} -mode reference >> {get_variable $Q_GLOBAL_SGDC} } + sgsExec { echo sdc_data -file {get_variable $Q_SDC_FILE_2} -mode implement >> {get_variable $Q_GLOBAL_SGDC} } + } + } sgsElse { + + show_text "Please add a SGDC file or enable previously selected SGDC files" + set_constraints + } +} + +set_header_state "Configure SpyGlass Design Constraint File" complete + + +set_property -step_header "Set Parameters" -prereq {"Configure SpyGlass Design Constraint File"} +set_parameters {equiv_sdc_ambiguous_clock_file equiv_sdc_constraint_file equiv_sdc_tolerance} +set_header_state "Set Parameters" complete + +set_property -step_header "Setup Closure" -prereq {"Before You Start" "Configure SpyGlass Design Constraint File"} +show_text "Please review the SGDC files created in this setup" +set_constraints $Q_GLOBAL_SGDC +show_text "Setup is complete and verified" +set_header_state "Setup Closure" complete + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy.spq new file mode 100644 index 0000000..2bf0128 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy.spq @@ -0,0 +1,63 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : sdc_redundancy +// Version: 1.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +sdc_redundancy-mixed +* +Check for Redundancy in Constraints +* +The objective of this step is to remove any redundancy in the constraints and perform checks that might facilitate better retargeting. This is an optional step and solely the discretion of the design group. + +For more details about this goal, please refer to the SpyGlass-Constraints-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut+++++++++++ +-mixed +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=constraints + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules High_Fan03 // High fanout net identified + +-rules False_Path04a // False path specification excludes a large number of paths + +-rules MCP04a // Multicycle path specification covers a large number of paths + +-rules Disable_Timing02 // Clock path blocked by set_disable_timing + +-rules SDC_Report01 // Prints table of generated clocks versus source clocks + +-rules Clk_Gen21 // set_propagated_clock set on a virtual clock +-rules Clk_Uncert07 // No crossing exists between clocks for which inter-clock uncertainty is defined +-rules Clk_Trans16 // set_clock_transition set on virtual clocks + +-rules False_Path03 // Unnecessary use of through in false-path +-rules MCP03 // Unnecessary use of through in multi-cycle path + +-rules Inp_Del07a // Input constraints are incorrect relative to a range of clock period +-rules Op_Del07a // Output constraints are incorrect relative to a range of clock period +-rules Inp_Del09 // Not all pins on the same bus have the same input delay +-rules Op_Del09 // Not all pins on the same bus have the same output delay + +-rules Show_Case_Analysis +-rules Show_Clock_Propagation + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy_debug_help.htm new file mode 100644 index 0000000..f7bb15a --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy_debug_help.htm @@ -0,0 +1,71 @@ + + + + + + + + + + sdc_redundancy + + + + + + + + + + + + + +
    + +
    +

    +sdc_redundancy +

    +

    +The objective of this step is to remove any redundancy in the constraints and perform checks that might facilitate better retargeting. +

    +

    +Before debugging this goal ensure that goals clock_consis, io_delay, combo_path, and structural_exception have been cleaned. +

    +

    +This is an optional step and solely the discretion of the design group. Rules can be debugged in no particular order. Rule debug is similar to the other goals described in the Methodology. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy_setup.sgs new file mode 100644 index 0000000..4472bc5 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/constraints/sdc_redundancy_setup.sgs @@ -0,0 +1,16 @@ +########################################################################## +# SpyGlass Constraints Methodology +# +# Version: 1.0 +# +# Revision History: +# Ver Date Comments +# 1.0 18-Jun-2008 Initial version +# +# Copyright Atrenta Inc, 2008. All rights reserved. +########################################################################## +# This is the setup file for SDC Validation +########################################################################## + +set_property -step_header "Check for Constraints Redundant Constraints" +set_parameters {clk_gen01_generate_report ignore_io_if_fp inp_percent_max inp_percent_min op_percent_max op_percent_min num_falsepath_max num_mcpath_max tc_ignore_latch_enable tc_ignore_te} diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/.submethodology_help new file mode 100644 index 0000000..9a54500 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/.submethodology_help @@ -0,0 +1,8 @@ +The need for DFT-optimized design: + +Manufacturing test is performed by patterns automatically +generated by ATPG (automatic test pattern generation) tools. +To operate effectively, these tools require that the circuits +be correctly designed for testing. + +This and subsequent steps directly address this issue. diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_abstract.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_abstract.spq new file mode 100644 index 0000000..5250913 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_abstract.spq @@ -0,0 +1,57 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare Goal File +// +// Goal Name : dft_abstract +// Version : 5.3.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// Added: Short description of rules and parameters +// 5.3.0 20-Jun-2014 Guidware 2.0 Content Consistency +// +// Copyright Synopsys Inc, 2019. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +dft_abstract +* +Generate abstract view of the design. +* + This goal includes rules which will create the abstract view of design: + + For more details about this goal, please refer to the +SpyGlass-DFT-Methodology.pdf file in the doc subdirectory of your +SpyGlass installation +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=dft + + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-block_abstract // Enables abstraction setup rules + + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-dftTreatBBoxAsScanwrapped=on // Treat all black-boxes as scan-wrapped + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Soc_00 // This rule creates abstract view of current design + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_abstract_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_abstract_debug_help.htm new file mode 100644 index 0000000..7ffd75c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_abstract_debug_help.htm @@ -0,0 +1,69 @@ + + + + + + + + + + dft_abstract + + + + + + + + + + + + + +
    + +
    +

    +dft_abstract +

    +
      +
    • The goal helps in creating an Abstract Model for a Block.
    • +
    • SpyGlass DFT supports a hierarchical SoC methodology in which a simplified abstract model of the block can be created when rule checking the block. The model can then be used in lieu of the original RTL for efficient rule checking at the top/SoC level.
    • +
    • The creation of the abstract model is done by running the dft_abstract goal on the block.
    • +
    • When using abstract models for one or more lower level blocks in a design, the dft_abstract_validate goal verifies that the constraints under which the abstraction was done are met in the current design.
    • +
    • The use of the hierarchical SoC methodology for DFT is described in greater detail in the SpyGlass SoC Methodology User Guide.
    • +
    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice-01.jpg b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..451825c4bcbb72c070b9069285b353d0fe0420ed GIT binary patch literal 19406 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 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice.spq new file mode 100644 index 0000000..7a2cf32 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice.spq @@ -0,0 +1,200 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare Goal File +// +// Goal Name : dft_best_practice +// Version : 5.5.0 +// +// Revision History: +// Ver Date Comments +// 5.5.0 11-Jun-2015 Initial version +// Added: Coverage_audit +// Added: Info_coverage +// Added: Async_07 +// Added: Async_08 +// Added: Clock_11 +// Added: Clock_11_capture +// Added: Clock_26 +// Added: Scan_22 +// Added: Scan_24 +// Added: Scan_25 +// Added: Scan_26 +// Added: Soc_04 +// Added: TA_09 +// Added: Diagnose_testclock +// Added: Diagnose_testmode +// Added: Info_forcedScan +// Added: Info_inferredNoScan +// Added: Info_noScan +// Added: Info_scanchain +// Added: Info_scanwrap +// Added: Info_testmode_conflict_01 +// Added: Info_uncontrollable +// Added: Info_undetectCause +// Added: Info_unobservable +// Added: Info_untestable +// +// Copyright Synopsys Inc, 2019. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +dft_best_practice +* +Check the design for best practices to find issues that may +decrease ATPG effectiveness +* + ATPG tools typically cannot effectively handle structures such +as asynchronous combinatorial loops, testclock also being used +as data, tristate enables that are not one-hot encoded, flops +having large fanin cones, large timing paths, etc. Due to these +structures, often, there is negative impact on the ATPG tools +in terms of runtime or inadequate coverage achievement. + +Similarly, latches should be made transparent when the capture +mode conditions are simulated with testclocks at their +"return to" state. + + Designers can avoid these pitfalls by discovering such structural +issues at the RTL coding stage. Designers may use this template +to check their designs for best practrices even without testmode +setup knowledge. + + For more details about this goal, please refer to the +SpyGlass-DFT-Methodology.pdf file in the doc subdirectory of your +SpyGlass installation +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=dft + + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Coverage_audit // Analyze coverage for circuit + +-rules Info_coverage // Estimate fault and test coverage + +-rules Async_02_capture // FF set or reset fanin cone must not contain ffs, latches or bboxes in capture mode + +-rules Async_03 // Verifies that all async pins can go to their inactive state at the same time + +-rules Async_07 // Asynchronous set/reset sources should be inactive during shift mode +-overloadrules Async_07+msgLabel=Async_07_M1+severity=Error + +-rules Async_08 // Asynchronous set/reset pins of all the flops should be fully controllable during capture. + +-rules Async_11 // Avoid using set/reset signal as data signal in capture mode + +-rules BIST_01 // Restrict input cone width for BIST (with appropriate -flopInFaninCount=) + +-rules Clock_04 // Do not use clock signals as data signals + +-rules Clock_08 // No merging of test clocks + +-rules Clock_09 // No logic in common with clock and data + +-rules Clock_11 // All clock sources must be testclock controlled in shift mode +-overloadrules Clock_11+msgLabel=Clock_11_M1+severity=Error + +-rules Clock_11_capture // All clock sources must be testclock controlled in capture mode + +-rules Clock_16 // Capture FFs must not have any data paths from FFs capturing on opposite edge of the same clock + +-rules Clock_17 // Capture clocks must not be gated by flip-flops capturing on the same clock + +-rules Clock_21 // Clocks must not drive flip-flop set or reset pins + +-rules Clock_26 // Testclock constraint must not be applied on sensitized fanout of another test clock in Shift or Capture mode + +-rules Clock_27 // Detects edge inconsistency between CGC and driven flip-flops + +-rules Clock_28 // No combinational reconvergence to flip-flops clock pins + +-rules Latch_02 // No combinational loops from transparent latches + +-rules Latch_08 // Latches should be transparent in capture mode +-overloadrules Latch_08+msgLabel=Latch_08_WRN_01+severity=Error + +-rules Latch_10 // All latch enables must be combinationally derived from root level inputs + +-rules Scan_07 // No registered (sequentially derived) or combinationally derived internal test_mode signals + +-rules Scan_22 // Scan chains must have lockup latches at domain crossing + +-rules Scan_24 // All flip-flops should be part of some scan chain + +-rules Scan_25 // Scan chains must not contain invertors in scan path + +-rules Scan_26 // Scan chains must contain lockup latch at chain end + +-rules Soc_04 // Show design state for a given tag + +-rules TA_09 // Suggests test points to improve controllability and observability + +-rules Topology_01 // Combinational loops are not allowed + +-rules Topology_02 // No asynchronous port to port paths + +-rules Topology_03 // Avoid sequentially derived asynchronous signals with common clock + +-rules Topology_05 // Wire-OR and Wire-AND are not allowed + +-rules Topology_10 // Avoid long logic paths (with appropriate -pathDepth=) + +-rules Topology_13 // No combinational reconvergence to flip-flops asynchronous pins + +-rules Tristate_06 // Tristate bus enables must be fully decoded so that exactly one driver is active at any time + +-rules Tristate_07_shift // All Inout ports are inputs only in shift mode + +-rules Diagnose_testclock // Display instances that blocks testclock propagation + +-rules Diagnose_testmode // Display instances that blocks testmode propagation + +-rules Info_forcedScan // Displays all registers and flip-flops specified as 'scan' + +-rules Info_inferredNoScan // Displays all flip-flops which have been inferred as no_scan + +-rules Info_noFault // Reports all the instances which are specified as no fault or inferred as no fault + +-rules Info_noScan // Displays all registers and flip-flops specified as 'no_scan' + +-rules Info_scanchain // Displays all properly stitched scanchains + +-rules Info_scanwrap // Report scanwrap related information + +-rules Info_synthRedundant // Display pins that are likely to be absent in an optimized netlist + +-rules Info_testclock // Display test clock propagation + +-rules Info_testmode // Display testmode simulation results + +-rules Info_testmode_conflict_01 // Display conflict in user specified testmode with respect to simulation result of fanin cone + +-rules Info_uncontrollable // Shows nets with imperfect controllability + +-rules Info_undetectCause // Display undetectable fault information + +-rules Info_unobservable // Shows all unobservable pins + +-rules Info_untestable // Display untestable faults caused by test mode + +-rules Info_unused // Display faults having no effect on system function + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice_debug_help.htm new file mode 100644 index 0000000..d4bd55c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_best_practice_debug_help.htm @@ -0,0 +1,79 @@ + + + + + + + + + + dft_best_practice + + + + + + + + + + + + + +
    + +
    +

    +dft_best_practice +

    +

    +Review the violation messages, have better understanding about the issue by bringing up the schematic if appropriate and fix the design issue. Note the fix for these issues may be very design-specific. +

    +

    +Make Latches Transparent (One of the objectives of this goal) +

    +
      +
    • Latch_08 violations (see the description of Latch_08 in the SpyGlass DFT User Guide section on Latch Rules) detect latches that are not transparent in capture mode. Non-transparent latches can be diagnosed with Info_testmode for capture.
    • +
    • Select a Latch_08 violation and display in the IS.
    • +
    • If the latch enable has a non-X but an inactive value then either a test_mode constraint should have the complementary value, or some device in the fan-in to this latch enable should produce the complementary value.
    • +
    • If the latch enable has no value, then either the logic feeding this enable should be modified so that the enable is forced active during capture or new test_mode constraints must be defined.
    • +

      +
      +
      + +

      +
    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_bist_ready.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_bist_ready.spq new file mode 100644 index 0000000..94c9a82 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_bist_ready.spq @@ -0,0 +1,39 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare Goal File +// +// dft_bist_ready +// Version: 5.4.0 +// +// Revision History: +// Ver Date Comments +// 5.4.0 12-Nov-2014 Version as in 5.4.0 +// +// Copyright Synopsys Inc, 2019. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +dft_bist_ready +* +Make design amicable to bist and test-compression +* + This "bist ready" step provides value not only for designs with Logic BIST +(Built-In-Self-Test) but also for designs with ATPG Compression, as the rules +report on various forms of X-propagation which is detrimental to both. + + This "bist ready" step is designed to ensure that design is aligned with +bist and test-compression requirements. SpyGlass DFT does not do the bist or +compression insertion but rather deals with X-propagation and large fanin cone. + + For more details about this goal, please refer to the +SpyGlass-DFT-Methodology.pdf file in the doc subdirectory of your +SpyGlass installation +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +-policies=dft +-rules BIST_01 +-rules BIST_02 +-rules BIST_03 +-rules BIST_04 +-rules BIST_05 + +-rules Info_testmode +-rules Info_testclock diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_best_practice.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_best_practice.spq new file mode 100644 index 0000000..efc2b1b --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_best_practice.spq @@ -0,0 +1,151 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare Goal File +// +// Goal Name : dft_dsm_best_practice +// Version : 5.5.0 +// +// Revision History: +// Ver Date Comments +// 5.5.0 11-Jun-2015 Initial version +// Added: Atspeed_07 +// Added: Atspeed_11 (and moved to top) +// Added: Atspeed_14 +// Added: Atspeed_22 +// Added: Atspeed_30 +// Added: CG_01_shift +// Added: CG_01_capture +// Added: CG_01_atspeed +// Added: CG_02_capture +// Added: CG_02_atspeed +// Added: CG_03_capture +// Added: CG_03_atspeed +// Added: CG_07 +// Added: CG_generateReport +// +// Copyright Synopsys Inc, 2019. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +dft_dsm_best_practice +* +High stuck at coverage is a necessary but not sufficient +condition to achieving high transition coverage. This +template contains rules that address the special needs of +such topics as d-pin controllability, test clock domains +and path issues. +* + DFT for stuck at testing involved a scan and a low speed +capture clock. The purpose of scan was to create a state +that both exercised and observed specific faults. +Transition testing requires two vectors and two clocks +fired at system speed. The first clock pulse causes a +state transition which imposes additional DFT requirements +beyond stuck at DFT. The second clock pulse must be from +the same clock source as the first pulse which also imposes +special DFT considerations. + + Since transition tests are performed with high speed clocks, +false paths and multicycle paths must be taken into account +since various faults along such paths cannot be transition +tested. + + This template contains rules that address these issues, +rules that help diagnose transition rule violations. + + For more details about this goal, please refer to the +SpyGlass-DFT-DSM-Methodology.pdf file in the doc +subdirectory of your SpyGlass installation +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=dft_dsm,dft + + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Info_transitionCoverage_audit // Analyze transition coverage for circuit + +-rules Info_transitionCoverage // Evaluate transition coverage for design + +-rules Atspeed_11 // All clock sources must be controlled by an atspeed clock +-overloadrules Atspeed_11+severity=Error + +-rules Atspeed_03 // Async logic in the functional mode should not interact synchronously in the capture at-speed mode + +-rules Atspeed_04 // Synchronously interacting logic in the functional mode should not be clocked by asynchronous clocks in the capture at-speed mod + +-rules Atspeed_05 // All false paths or multicycle paths in the functional mode should be blocked in the capture at-speed mode + +-rules Atspeed_06 // All paths crossing asynchronous clock domains should be blocked + +-rules Atspeed_07 // Clock gating for each domain in the capture at-speed mode should be done using a separate signal + +-rules Atspeed_09 // Data pin of scan flip-flop must be fully controllable + +-rules Atspeed_14 // Test clocks must not be used as data signals + +-rules Atspeed_19 // Latches should be transparent in capture/captureatspeed mode or when testclocks/atspeed clocks are off + +-rules Atspeed_20 // Asynchronous set/reset pins of all the flops should be fully controllable during capture atspeed mode + +-rules Atspeed_22 // No merging of atspeed clocks in capture atspeed mode + +-rules Atspeed_25 // No combinational reconvergence to flip-flops asynchronous pins + +-rules Atspeed_30 // No combinational reconvergence to flip-flops clock pins + +-rules CG_01_shift // Clock gating cell enables should be enabled in shift mode +-overloadrules CG_01_shift+severity=Error + +-rules CG_01_capture // Clock gating cell enables should be controllable to on state in capture mode +-overloadrules CG_01_capture+severity=Error + +-rules CG_01_atspeed // Clock gating cell enables should be controllable to on state in atspeed mode +-overloadrules CG_01_atspeed+severity=Error + +-rules CG_02_capture // CGC enables should be controllable to off state in capture mode + +-rules CG_02_atspeed // CGC enables should be controllable to off state in atspeed mode + +-rules CG_03_capture // System enable pins on clock gating cell should be observable in capture mode + +-rules CG_03_atspeed // System enable pins on clock gating cell should be observable in atspeed mode + +-rules CG_07 // Detects edge inconsistency between CGC and driven flip-flops + +-rules CG_generateReport // Generate a text report with details of all clock gating cells in design + +-rules Diagnose_02 // At-speed paths must not be blocked by testmode signals + +-rules Diagnose_03 // Faults blocked by false paths or multi-cycle paths + +-rules Diagnose_04 // Faults in paths crossing clock domains cannot be tested + +-rules Info_atSpeedClock // Displays at-speed test clock propagation + +-rules Info_noAtspeed // Displays all registers and flip-flops specified as 'no_atspeed' + +-rules Info_synthRedundant // Display pins that are likely to be absent in an optimized netlist + +-rules Info_testclock // Display test clock propagation + +-rules Info_testmode // Display testmode simulation results + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_best_practice_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_best_practice_debug_help.htm new file mode 100644 index 0000000..b81e58e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_best_practice_debug_help.htm @@ -0,0 +1,204 @@ + + + + + + + + + + dft_dsm_best_practice + + + + + + + + + + + + + +
    + +
    +

    +dft_dsm_best_practice +

    +
      +
    • Select an Atspeed_09 violation in IS.
    • +
        +
      • If the cause is a combinational loop, then review in the schematic viewer if a test_mode is missing or has been improperly declared. Otherwise, the design may have to be modified to allow use of a test_mode to break the loop.
      • +
      • If the case is a multiple driven net/floating net, review if a test_mode is missing or has been improperly declared.
      • +
      • If the case is a black box, then create a scan wrapper for the
        module.
      • +
      • If the case is a non-lockup/Non-transparent latch, then review if a test_mode is missing or has been improperly declared.
      • +
      • If the case is a non-scan flip-flop then reconsider the reasons for this to not be scannable. Create a "scan" constraint for this flip-flop to determine the coverage impact.
      • +
      • If the case is a constant value net has been reached, then review if a test_mode is missing or has been improperly declared.
      • +
      +
    • Select an Atspeed_19 violation in the IS. Display the enable fan-in cone back to primary inputs to see if or how this logic should be enabled in captureATspeed mode.
    • +
    • Select an Atspeed_03 violation in the IS. Display the clock fan-in cone back to primary inputs for both flip-flops. If the root level system clocks that feed these flip-flops are synchronous, then add -domain <xx> to each of the clock constraints. If the clocks are not synchronous, then redesign the switching logic or the test_mode constraints so that the clocks are not combined in captureATspeed mode.
    • +
    • Select an Atspeed_04 violation in the IS. Display the clock fan-in cone back to primary inputs for both flip-flops. If the root level clocks that feed these flip-flops are declared asynchronous but shouldn't be, then remove or change -domain <xx> to each of the clock constraints so the clocks are in different domains. If the clocks are synchronous, then redesign the switching logic so that the clocks are combined in captureATspeed mode.
    • +
    • Diagnose_04 can be used to display faults that cannot be tested but use caution since numbers of faults may be involved.
    • +
    • Select an Atspeed_05 violation in IS mode to see paths that declared as multi-cycle or false-path in the SDC file or in SGDC file. If any path should be considered for transition testing, then remove that path from the constraint file.
    • +
    • Select an Atspeed_06 violation in IS mode to see paths that cross clock domains.
    • +
        +
      • If the domains should be considered as synchronous, then add domain <xx> to the atspeed clocks
      • +
      • If the domains are asynchronous, then consider blocking the path with a design change.
      • +
      +
    • Diagnose_03 may be used to view faults that are involved in false path or multi-cycle paths.
    • +
    +

    +Estimate Coverage +

    +
      +
    • Info_transitionCoverage may be used to estimate the transition fault coverage if ATPG were run based on the current circuit and SGDC constraints.
    • +
    • If the coverage estimate reported falls below expectation, run Info_transitionCoverage_audit to find the major causes of low atspeed test (transition delay) coverage.
    • +
    +

    +Improve Coverage +

    +

    +Info_transitionCoverage_audit issues a report of the major causes of low atspeed test (transition delay) coverage. The rule is not intended to diagnose these causes. Instead, the at-speed rules corresponding to a particular cause should be used for diagnosis. +

    +
    +Method +
    +

    +For each cause, the rule will find the cause and list the coverage that would be obtained if that cause were fixed. After the incremental coverage improvement for each cause is computed, the new total coverage is listed. This total coverage will be an increasing value that approaches 100%. +

    +

    +The following categories are the primary reason for coverage data not reaching 100%: +

    +
      +
    • Non scan flip-flops
    • +

      +Assume all flip-flops are scannable. Force all flip-flops, except flip-flops declared with no_scan constraint, to be considered scannable. +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NOTE: Flip-flops that are declared as no_scan, will not be forced scannable.
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NOTE: Flip-flops that are inferred as no_scan, will be forced as scannable.
      +
    • At speed domains of scan flip-flops
    • +

      +Assume all scannable flip-flops are at-speed clocked. Force all scannable flip-flops that are not clocked by an -atspeed testclock, to be launch points for transition testing. +

      +
    • Uncontrollable data of scan flip-flops
    • +

      +Assume the d-pins of scannable flip-flops are fully controllable. +

      +
    • Feedback flip-flops
    • +

      +Assume all scannable q to d Feedback flip-flops can launch both transitions. +

      +
    • Combinational reconvergence
    • +

      +Assume all combinational reconvergences are broken. +

      +
    • Uncontrollable logic due to hanging terminals
    • +

      +Assume all hanging terminals are fully controllable. +

      +
    • Tristate enable used for capture
    • +

      +Assume enable pin of tristate as a capture node for all domains. +

      +
    • Untestable faults on SCANENABLE/SET/RESET
    • +

      +Assume both transitions can be detected on SE/SET/RESET control logics. +

      +
    • PI and PO used for launch and capture
    • +

      +Assume PIs and POs are used for Launch and Capture nodes, respectively. +

      +
    • Clock domain crossing
    • +

      +Assume all scannable flip-flops are in the same domain. +

      +
    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_random_resistance.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_random_resistance.spq new file mode 100644 index 0000000..d693ab4 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_dsm_random_resistance.spq @@ -0,0 +1,58 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare Goal File +// +// Goal Name : dft_dsm_random_resistance +// Version : 5.5.0 +// +// Revision History: +// Ver Date Comments +// 5.5.0 11-Jun-2015 Initial version +// +// Copyright Synopsys Inc, 2019. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +dft_dsm_random_resistance +* +Reduce the random resistance of the design +* + For both stuck-at and transition faults, the presence of hard to detect +faults has a substantial impact on overall ATPG performance. The ability +to measure the density of hard to detect faults in a design early at the +RTL stage is valuable. It gives the opportunity to make design changes +to address the issue, and enables to quickly measure the impact of the +changes. One of the best predictors of the presence of hard to detect +faults is the random resistance of a design. This template contains +rules that address the special needs of such topics + + For more details about this goal, please refer to the +SpyGlass-DFT-DSM-Methodology.pdf file in the doc +subdirectory of your SpyGlass installation +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=dft_dsm,dft + + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Info_random_resistance // Does the random resistive analysis for the circuit + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-08.jpg b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-08.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4247cebaf6757bd9a790489ffb622aa4a613d85 GIT binary patch literal 73154 zcmbrl2T)Ug*De}FMFd5q7m3oVNbf{Nx`6af{)%(~>76JDNR4!*BfU!r9U@&oMF ze}Ib_fa>3G|D(@eA^#%*e^0*n2Dp8Vg71 zT%x>ugzP*17NoRmnbMHFI}d*a^>=6^3kE>-vO6zU%7K%{P9(KgBMg>o(vN2 zk_xVIKdI|xG#tb7NWSz6r@qd_%)-jX%f~MuC?q8DgbqC;*iI<+6Vp_P^P6 zn{3ym%a5^rPtVX zCLSpaFYd2t|FZ1=n_=PqzbyMN!~P$;Pykv=3Nm<_Q z^gTyuew?dLo3R`bqUMgpxD`Jf;&F_AnkuZo$@g|KI>`+MZ1t5WMDch4|<*`q6 zJ>Y&y?1bI0vz{b~UjVM9t)!P?T73C&SB{S2dSCp5@*!C}{`fTnZ!AdIb$hCDiA&Z? z+*}5XHL%KxYpKrbxjta=;K?W1^nELX`ns`|>kCY51sw-QRLhC19BY>mE;APZGj`MY zv(~c;b3&)eYsbS20NazkAYW1yD8F_jxE3#vEpwb=T^sqp>U+yn^_ze0Tk0|$s3UlN z?NA;E4{{#@(!C7mq&Tg_2yLz)+W z^n|k4Nk#u~M@^}v#aJ&;9&RZuZ4ojE&IO6%0pCFwlJqGQvxgU;aV6c4enNJnC2?mN zvCBmLBs6i6YsAyP^Id#ZUB~P4v$i4c1=t`xQt3Ke=*#x}4g3vB2>Ztt z(*5}9?Y7!zCc!xenW$C%Th9zbwNd;pKiMY+O6eM3r8)sSegF|d)IM=t0K%g+yh}Ag z?JZPuD5{uz`a#+!k43!1<<0)VZGZC-PG{){gcTXmBmX#_UH~G)e5b=^6cSbo z3M}$&&Y=3MoMbZ*bJo#`ibf9UhRSuPiTfjgX{j&t(XYK2t3Y7gcJVs~Gd=RGasCZYd9LJTeJ z!2W?1B?XwDLIcC-Rfh2zQ?s-qcE@U^iRtKU!izK! zl-A*)bZlw-@JWf5Lx%VuhwF%9`@`$`UV2Uq`{&5h$h-_R{KvVs=ka+K9EdHV4czEi z!+iry!4=&v0PcI&|8y%)uEH=QR#r|!Ev>nV_#Mo3O;Mg5cP?X=mALIe`9bNopoK3N z0Gc5Wd`$;c&jn!g;ON^0!0xd6{u9{KIR)>sl!iBP$@&eRou6{j_hXMz%~nSdd^|pf zq011K*pLfa#8^FcNZ%NXN{-drN00GN4H388{@T` zpK8yj$iWi6MtZUeJ?OmvP(n}hO0Gah5UT?aeO!@>A z453Dh7l21caIEzO;JbVw0eb=XwnTE=c*~QlJh}nJ<=1`R7~Gfi)oxKK%lxpS7p{jjDR~_aA#S1j|(xs4u^C%A5N#MK-z=tJl2@o#;?;%V2ezc$x zLEeiX4y%;MUI6lg=J5|8%N%2*0LTK_XOf4#frr3aJffE)H~SVyGL|rM0f>$xJiGuD ztbK#vIpzs!n&b$Wr=@-!u=XwbvQJmo=jFVVBV~cJ5@FK2EyzOa1>mE%#wq3k@NSSW zilEKu3x-b669v5yn;I*5*xDZ#0DM4g@7+E~kN1LJK4kFl^Lfz)z#ByLa4{e|g%SS` zSrNw3cPcn?Xl#H`gV?an_5Uv27BosnxCvSf`(&hbuj~kf0cS$6IPkyXiJ2T9WNC}e z3I7shmo}IfLX9Lrij)V>|F7scdFi{)|DXd0Js)&ddIcnd#zy!B{_9BEgQdJnH}m$- zmhf*$Yo}6$r0b&C!50^R*tKstkhLSChTEq-jY)CvA)OWZf}@0R9LecFo*d+dz5!)I zx73$%=N=KwA=-rBe|;J9@boXV{M=-vw#`7@Glv90Is$_kCK0k6h~-DKUI6q`CgFcB z0LsDtwOm~Q_yBT1 ze9Gg%-va3A&*Z&}lIM3UtvxFIZ+F&Xa*!*5uyPlG&u1^GXEpu-^%9(AITd_BUm^%U z!`yq%L-EfwoOw`d(JbIyS9$K{iMaDk{Y8gJ(x7@c@Xv-;L!zkI2{czWf z(rA3AQS9ahiEn&YG{0j~I?gEgMpu@rG-8Ii*HSk7Wh{T|M?sc2_cu3QIIfVNaTkE7 zO_NTQBjjpWZAv(3^bM%`9>3fP8A|v!vt@W9e4!-B?7eg??fNlFgl!^Bz)A-y0gO*l#5WjeELR{1G&i`0gJ-XMRq9HC{3M+Rys4u?sz(VpK4&w zf=G?Hk2R=|$-8|w_^kc$F?XgYJ`zq}@+DUAn!uM>!2e_uDn7LJ&6!X{fn-pNqFdoZ ztB<)ntZ}X0EspW;GMk^zLdr8ptwR@pFX*=*8f343#)z*-7uSUBrlED{*SO$E?i8Pw zXas56)TZ}e#GD4yGU(q8k#yeKb;P}%dXsnC0{^pr-%8|g)}1%&tEKmN1T5A=~csocCZ=pI;99-h(Elya9o?d2XUOgw1ol_ zxV!kLq?L7gu>t7^{W7NML4k+|2&49nN!~gC(AVLvjj^IH_b*#qqqr`9nrgQ9$(H%s z#J7Kh5JPV!9nG#pm&;ESiiLRE*AR3NJU1Q_My*coKTd`pK&( z4Yq{vxP*95U)Si#fr(4_#69oNG3(Xye}oa1VC4=O8cU6~V2ZgEj{ z!du={Tq=7F0Q3jkMQ-n4cFe4C#d{x=JZm=DfUzC+!Aq{8H|N!0jilj8*j;U1^&`_` zInLlu4sKt|KBY%8NZDJ&)Wl#*sMYiM9!L7Jbv|A1G9O9vbre-vzZj{&Dgbng+={&+N8h-FY9Se z=IUOh@wl_0@V+kk<^{mXnL#|9R=cTujL zl)apH{St|Gk}WpEy|=%8m=)}5`-g_{{%GVwmmFD+2pXa6vE!s;iRT6laN(5B-9nEz z|H5l)&8fASTI%TS&Z@xHya!u*h+$;w4(ete#?6Ja(;>U0BdT`+P|e!TDAf#ou)6dt z?ye$7H8Pm zHj$&&S=?E#K&;ogYbv*L<%3aQ7XWMaHjKjtY>oF*TrZu-5Aaw{M?XQjBNIZ9vb1%z zIbQaur8#_Sw<%Z@)rF}RLE$1Q+?$d^p^I+Xy^p%Ee(ej@IvP#mb`rB2xjg0w(`3bs z`>r4OlepeLT8H?I?HU|#w7x01V$|U!B3Xv&Frk)%`A)VRYVVm%s-b%<4pzyfPEjkH zWm{b*%7*EzQ|4egVG;(7l)V5wIAqB0hJcvq|&rB`5Y=U?nP?}l)I?pXRxW;02mv@@=iAy6Zn>vOz%H0s)4 zH!@GrBgb}lkX=Phy?cnNuMh9kUaU1YtlcG-d+g;Htg`vtKPFBOstcOM%{`r6#)d_g z9xJ6CYP{VEkzAmo4hZfJ;wI-F_IOvFW`xv%a>vfSaDdX+zH$yniokCyU!d3j$qJjf z*E66n-IH2G>aWRc>LMPkH@Cme4ccy%)Y97U6-v?y*+b|L+T7&xU?)iPKZC*XIrgub z&%)YoW=gXjZb=8*(3|MenAS&@zCz*V1>&~9MJI7daHT$Zg4a;P2QJ;cE~?n0A{A{^ zuX97p%+*c7idt+(R9g6xv@mO}0d;G$)l34{9aCShbd@caB+V7fSb-fdCYOrr~D zT36=Mgy!tTiIS3>uO_G4JL1&qJS)JR%XNcoJ4=bXtEkE4)BFc1CAq?AR z7dQ7cjR|SjA()P^jUdx1HLYoz%;!pc1o@rzQAB%Om+tte&s(2ca->c{0N|(}`6ls; zi5!HA&2&mT#oP2fxVNGqH-?WmBU^JMa^!_(ZOlHb_kEetZsU))JUvqGTMzoOL)owJ zmGU3T;ih$23RLu%^fMs7!q=k%w2}iq(SYfpdB*ouTocPL01q01n$M-6i@IV|tF7m~ zBpXLikMf;1_@q)L>3u2)n{x{JM#>T=p)1L^jq(Lx<1nOyfIRYQaLO#vCzvQS8(jcI zc8FnVy#&p1kNa4S54`O-^)FMEH$Jpz^>@5!6st7X;2OEtZ7j6rdD*jjA#=~FugzBf zr}xAKV5Eoy-!;3tMD%~wj*Y5wx%|uhX2vZoH{RP#JFdE?;2<|t(A`G3?U71>lAhFse&2V&MYto*-P}48&&QGfym2(I~Y= z-f)@E?gWmeL5;D+uXCdN)`2N67VnWvr|~lw*xLIJ#jEYuk%6_ouj}dQXRw{TC~3`H z;Z7C(_aDD~D0k=nEGD{!FAycvo=*k4-pT$deNKT3?hDF@q>HFhQppsJ&lSe!Eh#e_ zb;5P|1a_oGgdyy%2|_X@QAoZuZCEqvk%QJV&xih&2XxWkM#jMyk{C2np|ofEOYEM0 z<7Bmxd7F8(R&3AKvp_;d(ssz_8m^9p9Pr2|%DX!?W2tUu*#4l;d{=W=Uh+~e31h@7 z%;iG0f-OG@s2OI|86{}K4D{Tc1&y7jHRfy+6&a6W5t;efP6O3^6~?|+@hy(t|q`g`xm8x>R4 z6k9Qj2TIrqr_rB9NA-sw^VNfTw&}C8OsDeu8AJJ_9Szky1J_8zOV~l}jq2i~gbrPv ztK(;aJgMB&RAVNibq19~B4PH_t-MZlTNZ6GBlgsm9QCk99X&H2)M7jWs?clT*$~vD zAb=v8%rrE0?v-2sE~D_H3qSj-6pSwbv>}cq{bDgv)V0zS7&rITKq*ntFy6Q^)`t;{ zzluDRXd5mMQ_v4<>}pC?k$3})bnp$n4?Zv4^(QeBz&Df>3%EB`sNiiaq3(nFFDh;R zP{9P+I-1!-vdYJj9nbMwU|8NAXM+bY=@3oh|1V%OX`Vu=ZZS*6wh)- zEdi@{lZupObC(BNyn9cCYmlpRO>?#Tzw!Ep zIB0jMWN-3DCh%>DcOb-<@$e)l1+Qo#8(ZIfr5aY9tV_v5zxFHlP2cvLnuLRwUCuZX zJOs^+%Ol(mqr|bT)409LWuC``y2$$_*y*0;-?3_dI5j1{B26UQEfb42xvl^nxgO78 zWCsH}AUI(Qd|(+tK29@z&|uO;tf-N-xgM$!VU5V#WkwVx7%rk!ol=PTfhYGGJ-5Ht zR^5aatw0vdN<+zsLx!-&9t0`0H4+fb8lCe@O+=laVNLMKm;RS7#&Ow>dO_WY*bW9` zt|j{+`9Z7izdE1pP#Z=n@*o?u6y;`o=Jwi=KJDD6M|j_Af(-N#_9;mg3rcjCo_0V~ zhgi9UNLO7GEo7VTzdBjF6i|Kekkp-p`3{SDXuChY%4HS|a}Q`9uk zBAWtXCbU{Xa1}4cr9K9XA7aR@BeG?WF96TVsZX658W_On$mr*F+eH$U*o^PGA#`?ZBJ%9u~v` zyNpob!N)zrJ1@W)Mlqc-f!lX>MX3x^bUSm=$D2HD2%hxW5#Gir9T%It==OtYPtIWy z6jCph3!e`13k~acy8sMS7!)~M*bzUMu6Z3C{~I$D^p=B<=bf6$iEMth**`96rAiVx zK_AOju4&0$LwF_^-*m_?ezlz^HC!$KSYujU)GHV_?iUWLsSb0K&w;^q{7d&Yh@DHA zQNn#rzN4jHWGl-81u0g248flq@Jqh%Jb17Whx-$>_XRVu) z@4FmXxx%}6u0Kl?d6>JB;0egFUK+U}_7ijg093>AbK;FT!ovSjrP151cCV4I#@+Yl7<;sSJ}*9aCf=>w`ioCJDw-C&sp z8brwxDM)o-G~ulGG{h3rB42>AQ9-%}LM%hz8TvbWKynX?K_jN2o1C-z;gjh`vS|#E z`J-s1=DW;ffA^AJ<zb5EI+d>;6f%l0mw%v4XJKJ)RVWXFRSA zz&nxzp!EOvj7Hb$Jz7dRcK1ZcpSIY(&3u))2F;Y!$3IchKPW6E#35(j7Wp?RQ=dYA z-@F1bu+tjCZtew0LWrC5BJf=pO$x@pR}uQ&h`^8cA#vj~Dg!Eek28NomO}w39f+fB zw7V#2+(Q(m=;|u?ysb6e%ewM@4O8#JP9MzMj;H^rZjp-&Yi_XcXDTcNgYncYk8OQ#3>;k^Qp6I0h{3Ur}dzQ=5Fqi4hiQq zOy2t&+39<$-;U@1{0`J*$jSl6 zsRGAM<;uf|WA>$EMdD}iL4t*TblzE_rCE=sgB39?_8UgISRt0>x?hgM^@!vI?T>n2 z;@5VBRCI<5orf%}o(8izNNzQ{OfIL2+G>>>A7{20`9a$`&8t%l>!$`MeGJq>$~Ues z7(DtPZK|H667bm?KPfIKv!LYyU?fKLCikn=IsuRed5tGK8g5vfK2A35vzjw!99@(z z-JLENK)p>3YTYru*w}==rg0#eX#r#v*zBxap~Jh++=k+7qzP~3MLmY*=a=`8ups}P zv2(e>bJe*3M{8_TYhX#hXt!TbM%41xuHUfcao-y%HkO;G(_%YS_8+va{P<=1RD$RG zBcr!B!d`2U)4e_XoUq+_uxgC=iQ!;h;J`xRDrsocI@@m%{%p`bB-pT8a0UNt*PL~s z{`7_IZ4+Y~{_tLcP?q*?2(oR}Z4SKwk1Nf4<16N@&zQOVwXgSfOoEeX|BE!ui9{~v z0T-h-mm!NCS7jrWKaiPTJ)6i5?^=L(Htg$0Vk;PdYJ*%N{effalnk6PKsx-nu|oB- zteKE|jVPum3Oy{7yXw5Mk4@@l{-HIx0?vygYrKr_?#{3r=b77bT~v)HcRe2^A-MNz zkl*I(s0K%)NWAqpkM~FObQW8tw`Wypk!*VHfi!Bq?5ds|QwL6~@^LWeCHSW4`4g(t^;*w$2?oF6uvdAH@a59E$swBV z9xuN(o2!gs=-;&M{Fy%p%^g;BE=h~>WUE`QwEOlTjE00__Sg7*51pduwx&sM({=KpMjFliuQ?yM2LyXQ8B^ zye&FP%X!o(l^W?Ja(`LnF9Nj zANf3aPED~6@s!EGzqbq@93Z3Mj(MoP9yZQ2Ozq8p6V36%Pyfi8n4{pvjmgQS#cXCUnb!0iU#`08|s8>YREw}`3fz%1SSUhs`icKs9A&jq5I3`M`!XznvCyM06Al+oI;tLl;02&jyASPf zYabAitm$%vzXFGba{<5%446xY9HLwJRuQO3TS?TOa7X;WV4u8Wh@>Q>FMm1NEA)Uo z{K=kYq8>d?f3IaQ)!WB^S8h#n4Ox3ML`+)LCsN>mB+3t49*W23RYYWLo7n80;&o8FX-pJCs_MnTuZu7>?$qiusk zR7syFxRcO4Qv`hoCMU?o$Vfc>1uJBm@c4D@@XX-;or<67KSMz@DEHolj)x^^e@+-u_tz82Q3 zGW6;hG%ctW3pG71@_7bK3&WCb6UTO}g+sKlT^b5|CgcH(9r(!OEP5Q&S4*>SP(#FA z03-(B#IXy&^D`p*Ip`sIXs2XGqAp({&g-|2=;x5oL!fn!baHj)4kQouIbWRXhPXyA zh`kk2vOG?D<_lrk2xHJHx^CFFX{yjwz`J4iaEF8KX`OoMJCQMR*JW)bdMCwxN!e8$ zTNNfcRipnwNiBb4#992Us#sq2pRkSa8b1ynD!D}RnB%h-bCYrud&;g$n0!n_m}bYvycpBj25C)uf{c1hgIoGq`(MsbehF4!|*~j z*PNzVl!3wIi0N*gw9~h1=(y`;4b!c4NUnXnu zJ#-$|;)xqB>Q~uyH76+7)#I*YL>u+Vl-KCK@b$b>#l-eJbE;SW?T}K#*LRj^wA`1_ zVyKE0K#s4@moD~Ah#X!66DV~$rex+HiUX`ady%=c{VYrfKc!gNYRVp*_UJWwQK0WT zWy1=!u&ois9ethm%}!WMhJ=MqNMZ0^qWd z>Gp$~Z&@w*N-lE5`O{Zp0e_iCMiw8}yI2}ppt?;{nJA11+a|kaqo{8}A-D z2SrWDpWh$rcUai7BWw?(BYQ)hH6q`|Z+M2t;MAiI0>>6yf}-Pi&oy&`iteNbW)r2DQwnG35-226MX8Hf&&P@bp zNr$&1*=poAWr)PCO>b)0C+W}m1j*mUq~8r#60D@(88ZXlK5v2{8b56Bh_Sx+vedX2 z;gMOr|2?KBn{uk7VR0~~Ly9B;qYtPxZi=1xmdP38Tl{AO71^H;59R#z6wYkgw12;? zQEWL)~#TA>f$dYB=iD0(HfA;6g@bo zJ}q_YPEZe|4MKwJ%P`Sp4e|#_pERd7S7NfX5F$Psot)PYmlC8d+PGV7KaedZaDENO z>Bv0prq;>WwqFVJbv;puegCqLnZ2yn51GWr2N&z0G|{D&vAsexThhF&I>|yXwghbnXhTY3OgZdF zb#M_z(7?7QmC-UgB~8t6VzHPmuw_`mqPYUuHknt-28`%p2mgdruLJ2DgInEqRYoA? z&TThRe@YKz$GP0gTm(!fqd;>KOvAK-EY;=&*@cbO{d;(rozw<5cQ;d-BhUAR1_r03 zOtm*<+a{?GOoLLi$ zoR+`0bnOhWb(&(X({proukv-e@0c34-rFQ1z$j-Sc{3^WkMVko ze)8p9XqrO9dne516Q%4l24QJwfdMmDl#N_94?J@VdFU2$A5*;r zB#7V%-->@g{yg8i)}LlwB74O_-Q?v%3-e3bALZKf@al#KrmzNF|KypIm&Vm%U(PsJ z+FN?RV=R@vzt4#|$&$O;C5dM)MhDRMtME*91mg6c;KV0FxG{8eD6rO|`L5;W+LJsh zGDT9xP?Nh(_-eW9KRcY3XFANCAEWY|j^;RBA-By#EJ^+CFu1OcX)X=x&hEmv3^;A;fzi&%WjC>?JUztH>pqsG>g=cP#tJX?=xg}EoaO4`o?(PJcGt~L^KwmKb6QT%$E3p61$tYJ zVtlh2vcn4dPITA9UD^r~Yk9M?s^QP(tv?&beq9V*%lW8ovD{=^d;{ zyVr9d1hcp8WR4jauhfp>>~J2A^KqyYGApVxd>&C%ypvttBatKbGT#C6L<&*-(i{*fNn7Zfl4{p=80|0fnOV!*Hj|jys4E^eZ?K_{Xj13 zckwH(D&mO7y$JaA5N6S-f)em1ni<|a0izMtL3Ut|(&p0MgI(fhx&@<+XKO?XKMJc! z1pWeih!~}{(a^Z@p*-$~;8@?wa?JA7O`}>Z<0>q!Qbfe6l1-xArKZ?KSM~Z_;C{E( zphu;#ucxt{>J`D?1qz3GQyc1OPKaI&dVyf)GDL#fo`La_P;$9VupGajn*N+vW3^BZ zNmrWi63Luo*&8fnYHI0=O!0Vgz#}H8`AwDk@q+Y;9t?|b*E;s+lnUZX>_#7cQq))ce$ zHJrqnW_u=AoNGwyZLLXhL+V%GN}ZL$-KtFHZ=<)@gQ~V1%S(I2n4DH9KReiHZ?fk# z^xo-S)#CZ_N|hyE#)@*PlXalupH@$n@=~4KAddina>HtMhKT}}U&5#-MJpc8ow6f* zweE8InR!at!~w<^wH1G)p->*8|b@r?`rJvNkzk7Ty=b7 zQMz1#E4ll-G>YagB8@_lN4=Gve-Y!I^AER=RcXw z5ST=0sZ-|3F)3}4O#VQ)ph^mg(3Zq<5#LTF7g;fZ4^Pay+>6kr(oupu-vwYNpOZyv z&;N9hDPZY!XVBxyAO;~l6Z(OdE&@XW!xAMaQ`%eU61s|lqM54=RvZ)J(n4dA+AVS~ zR+o|W*{_z9<2jpG{M$YK+Wg#P{lKJOUwa_^8fAyT1M0dX{bRwKIWNfd6eDNhNi?D7 zHKgMLupJ5-wX}U@4o3I?hK!gKjffShJQl#txIMa4SKvt=v10wK3ck)yCYVKVUjT*) zNVM|~WMdLYpdfegY{7YcmTbOJ>?9#&)l%Z6*P-MNV=2VZ+@4HeDx6TrJAMD>40O); zNQ;U6q>fy&<^Hv*9R13|1KmGCp0k=0fy4@xO0hF)a&5doZf)+vrB9$UVy8zMXj0b2nFMgE5bFKoA+LB zkPAh-V{%THwW>C__i`PwQU#d>AD8{_mT)3TIR<2^A~55m1Fo{Y+F|EuS2~Bc(u10H zb!M4Q?oJ7;Agb@hsAmFytIuf`DzO9idD32wH~w5=wA^O7!XC~oSLLG{*w~a`8w20jlrxh_qTx> z1K@wM8Os7U$@tWGLDrkgE7+k&5*GlZJm}EsH`M}s0Ga@9tR)lQWW+8z(_0c`5gp2y z5hv;IN@7>mUC*o8gh%!i@H0dA)shW$d-DW&cxkiRLO0Iujo>2s;WSlYJRuqr+tTcA zR!=8+5d=^uCXPl|W5@I->0MZ}vwMSb)uIdyL(FHoUo^s(d__poc%yH5H#&I9^&aaC zKD2QVoBr_xh?>cyUg&uLDc$!UgSnJF0YeRpm4g0`-GXWn>Sy6>zzZo&V+)HRH@}x( zW8AReDDF-!)jJgD1yO)k@z=BA?+=Dsdnfw49+h3B_hk}DAo`$8v zGn1XS7v||eE^rQ~GnE{&zOfLRR}*3Pw=!(6{~ZoYjrP{MUYRA=JfX62N9@6s?RW1v z*FkU2TcJ>Mzj}}((Kd)3o;&l?Xvs6N*e;b2tp+kH+f^nSYp2QGA7qs0Q&@%;AKzL{&=jnxw9Gr=0JD2?P@Uc=#UKy5N8X4}SFQtOd)2muc_o|FZK?W%z14$nKqmcm$w4Tqz*LWFSe z{u^c(O1#8q4_Xo*j4^*rF!A8~^g}6lQL{t-cm$cHWq5xq*Sxldr%B5$mo-^@xh)y3 zS`Fz|w}W95GCq*ob<^jT?O8T$*q=3NcN3$_Hk}=TF}}Lqj}t?+7RH#wk7dSpI@Il( zB`tpzY|50q(uooUn*>BJLEkCq6wTs;`#3qVtA$0I5>F2{n%`(noful^+@0%)x|6TP z+xWX^{Tow4;T>AH?^a-x5#}heNQNmrmk!oYXD)IN7PFAZ?$PjcYz8IrPh*4ObJq-3lx>3$>xfx(Z9rp}M&!y2b}vCW&T==DQ5L zmtVM!LNM(ZefH7(&AcnpV7hhkWbriy*Hu^Moay+!A|y5`oXNGTy~|nj8V4 zVbr*rIlN891p(g1h+Q;wQLMS;B5J)`#H;Vullo_sJeqHGgfCxzOv#`V*^nQ!7NEw*+gv*q!ul~#Gz9xpl| zt6pG#<{z3$yPqzclyJVt%TEg-X(kKT@7R)bE=(hP_NRads@4R z+^3@<&8XbMnf23AgeXN|`hs5IsyJz#YGA<@jazkri{-V|?p3d=YNbBi_|e7D+Tb(E z(N^eT@;;eb=^41`xPG2dBb@46aNJKZW415O{@9Jo_oh>3oa{K$PE4rYyx|1T?~V^O zwS^5|k)j{DA4y?xgFMN4$xu%?eiA!sfNTWcnh)^kF;gJL3HN_-k?6azlX{-BocI%a z*D+x_@1=ug&gZYiG0OB|)Wb2P8FA@evk}@-`9QohwbRD<5FqQ z9N6mjk*=#M)*ju8ao*i+WRL4+?Hn)ZXudtC>r#K4M^w3jg8K^l7wf!KhgLBtu<>Tx zqS*Uf$+0{0+7>Vym2vjaD1B+PE?8Ft8;zMZ>F62Be$%&<8QUS*XIws9Y|X?cwWMca zFDNf?E~lDnI62+_*rv0pBQ^>ooLb1D2bD}UcDq*kW7gQWDRTxarn<@wxr|peiFKCN zzv+xTu-wcQg2lQqYsbi3Rr zA~owhyW3n#3A%IJ(*ujd?1Gl{$IgHYE#!HyhiZs4KA1d4V+ezu&|$5E$T>&QPG0E( zB=h&2{(1B%g7kZ^_B4T<24d8}Vtc1z8+E}7kb_+yo)+?bk&dh)oD5McNMnb<%sGFE z{zxFpgOi>Tf#d}wR|cDjvNf~hgc8(yW(b7iYY&Tw1yFL&cos}zAh(y73FQ1vIR|ul zLPxj?TK2TVl=jZ8kpzgq(vt_u@QqG8y6`-zUq1*^SSSwiLmY&!IK-XIY>*h@2tcfm z3Oq4*Nn9U!n=FbvT%YRv6D$Ye0bv6>EoMnZ%JYzA8gTz{M4 zK?}ycNGy0+uqsU6Exupu*}psqF?+F%A$%m~xn`$AUsi1 zg^i#*0_g`95?9C%eKO%DXuE<8I2ug6o_8DtB1L#Y@CIhZaQF(*Cc1&FjS4yac{@l* z6ecm&{>P7H&4gmIGVm%lh?;U9p=t<{nv@;}xyDDg_UhQ~?P1;F9|9UKU@ zI*goA|IRDC0L(K331Oe+$ud_!i_oz%@{*vX2?!!+8@-B>S1NztHg3~SD9z=`aPVv& zainWja-WGmDPubuyhffjHT(hp1A$p>izV$}J&;KsW%q7ZvLmM;jp7%8Lw539vM06+ zJio7cO#Yr{fb{Tm#dC!JjjOy<`opmKZcpM0S^L964B5zpf0=|l&-fdBZ7Xe!H`m>F zR0rCZjl2O)W7^64VxLo=-_(%<+|=q9vbB&X@oTIUN*rQyDt&tuPHflDg!%kz~yp?1@hSWm-xLuZ*}m)#Scguj4e;D5n^{2Lp8 zg7AMHC}E}e2g*QF7SdGgbrbWs+vg`wsF+PxXp$ek>-bp=eU!hP3-}4z@yjX(!%(~N z?nz;Yn+BS%B@<3fe|gWuG1KTgG`h6+hQe?prjlNHAJOtRr&B?slC+l9(!45n~iIE6xXc; zHfXY7r5mH~p77!P_XVZ93oKGlj({HI^IVz))o&Rz#0)7v@$TcwyDz6Ue<`jn-|Q0^ zV_iymeygg$d|&dM>i;Y_li@d{SlrwR7FAloWnl0~k#jno^iJ;&-Ik7)&&E-9$@LFZ zeOb8+q|YY*kCSZ&SrEntn%#VAD zHtG-d%8zUq48S}=FVq;GQ~Xc1|Gp5Yq|6;OL9U6dmoETg9*=-;;jqY+WzP`CNgw$} zH}|dXAhSs6>fmnKHdtCb`rh~}1cuI~+?Q(rAv7?+llG+k$Io1GFi!yeH-B5PMqGOB zQmA(?@MhyE3&9*mm*C?O9pv#rR9a4n7gGtpxtS@No?74eEpCU|pG+2>I15o6CtEa7`N-p>9qqE`hUP1ooRb$3$KS6dob|H$-(*&l>osC@@ zH?-SKxc85tn0dy#`kHyx`1X9&7x~?nWtc3%AHpB|as?cNZc)1@6^r21Fcyy3@8O32 zRpP^1w3m>$(TF2AeelE)h&DtEo15e2Uxu%I-kPrLF05>38UapQMKr>9E`KgY6pj_y zC)mem>)dGj^5rz`IE|EtT}7C|$5VPNpEfv;TL)Hr9N6J_$Sj}n+R^UQ(t!+zxT)b) z7BhC=MQFrS*S!fPS#L}ZC;CLIfxIHexFuK7T!cK4%JS)Gmi3oZV99h1T=XGM>t|nD zz=6l69Y2InQ$>3u+|&_wg9Ha=RL*!#!r$PP$o~kM4ej<}+e!ckW_yqkk^*v9aJw;_>FH&ddjndVL=G7w2f+M!ahwdh0kd zy>JOa<8&4p9ls~NQ7z&d=ZZwW2-P1ri#N;YaqctFQQ{P6Xk^+fuFlZ+qwQXzIn>0* zVef>>T1;#o&XZSH<=xjaW{Fl0QObwR%DeWov(Mo(1OW^tP?GIlVuNPDAKlCwA; zo|!PSv80Y&NiXEElGrtxEo&peqsW+%?0$Lu9cw2v?d?JhbOFYR;8yx0x|^E9}YKtcw`%4_B*i8-?`amJ-d}= zV{1XC71G46d{D8UIc+>zbbD`0jzF5;lOPatH6LCHo4JItz?m@U2Rj0)il1#dd zvK$^X#4308FQ2KTR9KJD{lPR_NDE){KncA6-H;kCuj24hkHYTljlfgK4;}XUx1)M7 z>n|h~4zoQ|otM7Kz4ihdRYrSdr}M!ZQUlktrR@|e%Dc6+3<|fsYiaMYg^d?$_1x6X zSzLytT4{M9x?*&|qH`z}!?7cEY;$yo2F7)iRj0Ez@3fMzYHB{sk{#L_jH5aB{%Y0Kf$jS2E_JTf)o~zpSg>r_*kD;z zb(tr77By@2{?T|KPRdH@hv09OhxjWT8y;d2um2Zq-x<|Z7qy99DIzGnDP5`}y+u?& zKzb)YKx&A9NUu?(NtF^xXd=CLB3Cz$eo=^jXIG1<6nQvy^`7vvKYkp*{th?^L z=iGDlKIiQ6Jp22P_;HfFoz=$S?>}I$Ac|k&{;%~QJkTqVT#tjlKF~6tFfoMFIHiHV zl!mrg8p29L5fV$X)d^OKJtCXh#~RrjFPd0&*7HU(=p7!!nM2VUI1= zWiMvn$)8p@IyTyC`b)$MS&0hta;RL`qYW7Md$i$h$}%eGxuzQc6|zW$od=)u!F@AD*LeQ421igDjsOMQhG+TGo!3=ouuqL|5`% z=k3T64tZ^9YH-DbCKxavUc=&%jc2&W(JuWaE)vB?QX;myu}UM=&}?Wp12Z*hY`g6_ zE5eEU?RzqxC>o2(qSYoAp@DrwFfv!=2A$dZ;`)mQ^rr6Te0uTt6hDIl@lHcrd+y91 zkKo0%FVasl4a7oO>&u5kWZ;JBI@PHbF`B{?bvn=b9nLah#b6S;uMFD#{O489Wj6Nc z=RK@@#sFCoKa6y9P5F1se?TZ+ zHU8W~(jfRt076&1`^Q+J)B#p9|N{;G-FH+w~5 zJv`a3d*w#DN~ya4q`yO$!yKohQ?Kd#CaSEQu&;j5SVkY8V39YOsjz7st6d!`^q`}k zMBt{H!3C75`6qPW41=ip+2(L1XieoSgVSId@r%je>ny^4d)Jv}CP=W%g8pkirHKHQ&(9CMHI#_hd`H&xhRSnO=Nf#TJsaq{k0{GHa*p z&kedc&aUS3)xVH zucR+tJSLyV>z`>{3!VqSOIm^$_|JUB|M@rXihlkX>cHsb7<|t0f*9eIUI-V-auALE zIpZlK;Q*2(qWMpAa#N1ttK9Xc*YC;Q`YOkGPwx7?_j3I&*dw~{usi4oEJQ}?f0Q-L zLaa?ZD5=ud_ZGNt*~`gXL1dkpWMZYH6n1-)tLKnMzg=HTqRxTiUWShA!_E0UK|MY#BxTW6*<2rM(BUe$drS~vSWUNCgm~z?<#VOE)E6A%ZXfqwM$)lxe7dvi3b0B=?DL4U6buH8j|CXs& zq+`2StCg?G@lHmx*sZuISxG>*@01}TdGSb!g%pZ%e`aFqq{3NfA!OYDz+vCyg{A)- z`i@+*&SS&qM1PQ5$t1&_qL0eEHA1r zySH@QYE0ZZ{?--gwR2T;L5Hq&+1Qr2PU~+7Ef|aw)kjhcsidx`^LGtvjEw% zU;19MnfYA7=I89O-6DrtMs=#r((DSufkIaegNb{dTZtG7G%y_haEN_j)mU*&4Hd8A z9+45sfEbAvvHtov&?bq$mD}wWSM-4%27{#b++TadE30mfIY#!*9>gSQW!Al%Ofq>B?imdaGL}ZG4rAJscs3 zx=y^K9*CE=s!!aY4pQj~Z0tqEK6{azWC5QuD=52eb}h}>ARQAqwIL=+8h;`-U@^x3 z%?i1)Y>0R#h@dy~J1-g5!3NpL7)&_NHszkmxU9?@9lM%GtRU=MA2=XHYpvAoD@nR+ z6v}sJd!VwX-D_8!nBLS+FT$2%OVw|MwD$iP@c7X?rQN2J&BYPYhUT2Phy&1>-}hKP z2!$!$&oF>a>4%B*gH!=^r6&(2-gvrqE)yfO7BcC;cGuumy)$bqsS@>83aNe)9{!go z3KBejEY%A5I8?P7-TKr4H+AwEw~WI4H-K!~LjDm{Um`$3ZaF-{r({~D)p^Y`o@HetkC3Z)Q&j?N1a z3Upr?9V75^eoP-EZ_?fRgFL;D7Kq5TrJg4i?&p~S8_HoFf8~gO;`cwRvibsGmahFF z;@wuK2Ov5bm@q=y^k1Tj*N$6&?He|~MWBIC8e#Masanl`U6y}|#u`W+PEACo*5}7L zV`06y`4|se>5g4R#i~}Q+EmttT($4^lp^4A38;pXe1>xg9MI8*XeWeM##2~qI15Liuugoj+(9Y-`GfSjAJx5Egecqqs zu-+GUkc&pACDhtoY1}LXLt@O1%7VWCk&@$HiT%vxR8;6*gQjfW1K%Q4tW}6JBYH52hNEo*X`E@S4Ym#GZJT6PyD}Fv5)yjvMLlf7K>|p0WN#_(~0DYKqsAg#H;~s6}sHAo| zQ?(5NmR8Vh0y*yOJS23Y?dg0cnm6KpM_qekM~0≤YITXmNF-0FwP}uLa{kzBBXH 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

    g}=bzE9(;X5+EWF|YdhJ;W{6)2@Hb{F$?D5b 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 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-10.jpg b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d24b913ca924617b9cb0f40c6ecbfff171732a8 GIT binary patch literal 27013 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

    m$V@$1|^8Jh*n-_WbJ= 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 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-12.jpg b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e96042e50f260ef6402e8cbf6b32d3f5691058c3 GIT binary patch literal 53185 zcmbrl2{@E*+&?-}Nrg~}WR$gRDUx-Pki>*a5mQOFkbR#CA)yK3mu-?QiK%Q^Cwr20 zF!nJsc7_@2nDspRz2|+e^FQZ0?|ILkYh31;dG7E1T|VFSemKLNDbSG{MkYoeE-o(6 z6W|xb83P&YzWd+$*3$95zrnkZtgvMx%chcyBGL&81Ol0ui!qR)2jOWg)JWOobft( zAv`hXfYjA*jmIqeDAE@ndq?mdJT7uVR7^%zPX6pUHT6pxmo>Evt{EB`UpKj7b^Fd; z>wEWY9G*Bnb#iub_3`!d4+snjj(iyv9rG&obyD)Xl+?6;-lu=e&C4$+{8aS$ds%r! zWz~=Bnx^KK*0%Ov9l!gr1A{}j;gL}Sku*IsJ2$_uNL^ds*xcHt?a+7m;sSC1r^xwaA##qGvFV6mxvH#+06m*!I3s4@nAP53tv(NH^!k0{8s_YS) zPraC@sMqNv<~6EuQ=poi)Qv&3-s!*#3t#HY2=x#%>ZO>FPvb7u3Vh9mGBYnl#2g!s z{IcoZB3xpQ@T+! zxk?weUcat)HW1dT<)4vD1G5hrGR&5;FH+Gj{4gg1rA+%9q(|({f*cC&cRa_5oZ%Bq zc+>PlbwW)@=m7Zq8H{>4Iu=H`HDPTqP%#D>#cZ`?nDq~x&Hv#k_8@oM#vW$k=HlZd zd~YZ1ZReSN>q;%Jd8c2~*{7!B=VFg55ga2MznpAtE8NPKy)5Arn{~rCMdev8`DB*n z)xJR!>F30Lj{DMrWkY=H-!kp}T$DK#7KNdJsG;Y1;N7kXO zSF9g8W}&`aJX`Iol1eDyq|o)}S=M83Az0&-g{5f7@~$oRlgH)PRn_P7c%V#yZa zFFGeN^5MK*{Y5$v6K&>1iXl(r(7LyOYM?6R$gXU~uPN?xeeOCTG82Rpf@zANp{JwN zjl)8U@2@m_mjDsNo{T?~=^jgcH5*ygY|Z+p5?n_HH)$<CX%)BQ-+8TQ4Q4Yk_#i2k{! zO}#77=1G(1PQA_gjCnTuBuY8Ux>YRkNoDdG&0)TaXEY#wJv`qEm?FfM8Ijmu?>>^{ z>&Eyq?fT1;%iWXFDeoZ%MDUPt3`@bE5GpKNn*-{>Jj-M_41Lt&^Lj!O#iEn%ysUobYWe5UUA`ud z%>GO%`6}MFTS?}N7G5s8``4Eb`X`}}m-wB#5H~1Wo|4_oPF*eBc1vt;fZT#^$K#<1X>g#2adixR0W^i24FIEi)txv~K@=!Vj7KcHdvqk)IUGk&{lmcs2{=igGz#9y}Cg?$QIvX}oYAnG4 z5qUOqr6hyrHkM#bFs2&7-dhM^cS-&5za-1r&Lc?pYEZyZ{D#`UBt`#{)Q<=ROzcHq zxA(;@IJDq$$3{+|YAe1c#m#dkVbzfX(qnQ!0_WNIp9t(KQ-lNJ!Qss52>+0_i#tskQLRAExwI3SCLtObC_7YNTO$ig;s$Dcm32}j_dE7<3A=)K5a zPa_(=GS^{E_gMu9w+0kt0#PB^4Q0OD1J&d~mhngKJdI@BWaFNM;;Wp<*Hya_goomY z1;|a(TSyj|x{p>}%((d(XUf{HH7!w}VBx)3m=_#SA)a=2=U-8NkYuAib?y2#VH)>q zwlEL*BE$YH2b8?TDgs>=1vdU;VJmcFiEfE#z6r-YM09Mj2mWc}g&YwGO%C6Bl#NFd zF~q}O{@Lt1XqHjoScTroL}?@g!NmbVF%(!K3cVSE@UM-*Jb>pRZt%A6Y;)6bloSBk z7a4XG#9xh>UzcJltoOhneRLrxA#x}S_*9)?m&^gl0rvV(+=(r`-mVL!Lq4@>&CNS= zK(AC<0rO1>;(#hkE@5dQOI5Z30%Rr+OOFF;glEGsgJjmo+)m<-6I1?ITUab}Kco%w z5<_!AkFG=3!eAA$Ts?pg`L9cJK%L)6$;f;#1q-W~+z;`6E+7`y?@M|5g? zOLW(Lh#>UtVA&47)>Sa4Ikx}&e<^It-EWCL3fRZ{Db!8&I}ZsK<^h6gu!$yIWQ)0N z)pfvVz@l&I98fD>oazcSxvVPS4==924~Ew5C3cTD%c)6wgEL!3i#7r z)bDr>=mJC$U;)7kqX3kKr~a-e{st~7K9!B3l5upZIpBlRS!f>EE>q%3yi|stCa@Nq zrCZw%n4)UyXvof8Ky?4$DI5?M18M#P8>0!(!^UWyojpBF`WU0^u)xi2mMU8<>V@cB z)#621)5Bf$fBUO`)kV0Z1j8rOHsrb1#-h3WzuprGrc9tJPK$f%NlN5~w~y>hJ$z&C zGkmM=1aWR_trWF>a&jUpt7e|M3;7b*!%^3KxLjjsOCu|ErMys z+_B_s`O^e^P1}Mi+vSw0k`9*-&Q4 zdN19lUHpX#S%YE!{BO+j2eO%{7h(Jt*+?>NYEAVj5N7aWziSYGymzV0vYvte>Wl-5 zVCihK8(za5uaty=swyUkHj<)*yu{vfo1HU$%VLA>l( zIw?P`PFYAb1?CWU=bXAGwxIg-uj=~6*Ypx$xY5AHcv;zUdF)o^=BYF_#d7O_fG`wc zoL#pLq)ivEKM=6bgToTwiZCXK)}W*N8Q;!uW#gXrxD@ty39GayfR2%3-v?>w1;1$# z&#o_ChY@k)1Oh%BBK!<~ByfGJmWA1b2(wUE+zl)!ZQu46e;ls-@%5Gc3e&~;C=i$~ zJ^wtbc6dDTHBJ1IuyFjRg-6Zu?A_hd$efZG3R16uzcnXf0wG&LDx3}H0?|kG|q6pnL zGoU(;pWk{VE%cyM(n2V*P5;<3>Z?lJGsv#H4>oRvMx!cWWNWJSPdtC9DdOW2{3I3g ziu8jPM#?BAD?5{fn|zCXKHqm)yO}0f=X3V;tc>FMvtic4%QCTB$KYsQhUVSrw6X-# z{9iL}XYJ5_OP{I>3 zCHxYQ^GpvTnoi569hHz2%e(5XSw5Cv)W(~%CVN+4Z}#Kdh&<2;NfiAM&Bw||OuuA8 zIiPQMffUCeI=y}{!+f#JBWuI0i;Lz$aociY0Wte&92jY@M}rdWAh)T7EeYH$kYUwD z1+UOhRTqSlwlSgSz*9|lr-N=Yvsfhc56nXqhCB}+z*P7rxD?D^f^b(T)XOy|Ha;rs z@_9tm^e83vSKKdkmrHdlGc>&~NU0Po{>ia+@#)+>&Ta4`8-L4XdE@NqxL*=a zl2{)nMIWxEa6KNQamyW}7YY!)PTU_Xyzf}uEeAd<6WI6X+~XPhr2HEec{$=bMOA@! zTnhhWCb?*YFxymw&CUA~f(7%n-i^<L=oa{bGZ{D}&+%_UXROYyBHPY`lDADv=?3g%^dd_4B>2c_s8h$lHzH-5ctc zOG|A#Wp!ncsaw3T9u#+MCaNLMXK#Xd{2M`1<-@TD$Da90@uZL0**k&cwtP~~olwrm zSGAh|X(JB5j4lpjcJBFh54^0HyHBjHT$N_DZe#w%x$8%7i&e2j_rWadv-0gD-NMP% zWiHgP$MNG%=Z1@ZYrK;kJk;1>oNnPF<6j;CH4U=e;m5+|Lmz#mrIm(0M?^GeXAouU zl|O7}gY6V<12%WF_0uTA>9^FtlSszhk<{^s=t=RWMV&8C68py4gFv=)JN@qaj|;E^ zn<#-{muzu6USVk8X2&FfFo3^RK2VUfhz%H3(x^Lh za(Uw8h%1Li=Q|X39yAPheSK_vMYUtfI%^RjRHvTfI;s~{5*XQRbGHnwfN)p{=$)_J zu6Z-m9G1kZ6xmfyxv_`qSC>O{k802a;*o)DhmY&=lhe(U*Q2R|PwHfjmT)Y;G+Hb;s&JM*5pC zNPq2=$jJY0ax}_bQ!py$@SD5~U!{-eA3L`A_^69koo157OF73 z@dOKF-z-g7D$b%+U*nmPQe_2ZaLiVrL@ihyULSzn5vRE`uEU4$d^*|%feywrQ=dK|iqXV*6vv{MPi&>wqK$dc0Ov zx84jA$PLcdU+jY{bZ64Dx_LSraP074ryL+5(oz+TdUhv>=r$d+ck#~b7QU`aN~}M{ z@J{!~1ivnIwQ)yZQi#$KW5EN4SJkPpM&qT!0rGhzPsaT#mrBz75uy-brW3=M=`g@l zM-VYD*=H-NDHEx=k6gT53YM@zsWnjp0nxl?enkGZ@SuK5z|A`T{vM_N6L~Q7$;mRx zQd^;voEU%ZB4hzS@YZX1t^(l!8x7D2P1O}(Hf{8*sIWBqScN`cnW?%wyBAh9SeiJr zLEJi1N$lP;Rp;QpmsAkFH?oQeTo!sPm{akmP?nD z28(@7hdTeTrD9$-TySEW^duM=gQ;f*Y9r&>Q`tNq66Hf6l%$N9&ZPA|dFXI;pe($d z$=F=LW($amvB%pAeNuK5gH?7nVYDka{i5+zundxl_@i=j)06H~B689T!rb|-$9!6g z2Tq@|f!vtEb!YC+0ZyfHFJYaoNQf4_)W z=#FZuGsnzyTVPE|TDH(Q_e&e(qK*i1tSzFa?+OkuuY*lT-n+R3&DpZ%F|3q zC+674dJ>)sX!cepvM#^y=`n{&WIYI#qox=^2zG(k?DM`###BuPWbM~1rV32f&eZ5| z*v{A`yA1^lLAKDRy~6>&`@RZz%dVmB3S7&t&9}-$A+&_%>isbI3ly;vP%sI{M7L8< zazF=AZB`L_rvh;=wC1&tpoep;D~+Vg_2CdOC6?*fZ49Vlg7 zyVSKaQAzC|0WGN9+~9!FTFwJ2UfYUr(qCOeHs*}!OD!DG`kXw2nhl#=V^>r!Q?zXb zx2@JN_BHs81*S1#SJUAf(D9|V>J!|6u8}_=Yb&~!SH~@YO{KK~^$9=I73#%`EDCp|>}XauAbTLkt-r|V@V>hfAAN^cVb4+O>uYr$%Ug zB>VkW#E$33`~8y8pWB$LG(>nrT2+&#zcIT0Itmt=?vn?Y+|M0FIN`5_&0{v^pe%nP zVrTtb7_CQvRkE>!Sl?B#FbDLGVT&mp!laBajgY*djvaCYTtX1fg`BT?!uW? zNeZgX+?c6=5{sXTP*b{|>BKF!%zQF6<U33BFXYSiqG)`T+ zxAm7e2L#lY3*BjSatj?kCy(tp3Gi*VlCoj5CwiYRpoke2l@2?Vlof;^epjne^Y&0QW#4 z1h~mw1U5^`H9*rdsr~c6CID#Ml;uYZQ!@S!;?4BOyOhT|M~dCy4H!r@LNK=pCVCk{ zDGhbyx(rZ$g9qju(5BT>XJj{y5 z$pEPd4(J2mK>+<;0c;O&DTtk@1=KiV?H7g|XDB{s6%zFjJ3POT8w(RJ=!wDT@-K$1$PqCKqV(^F28^tpK4 z7E#^wMYZGCgU34LOtB!4V3JAM6j!$!RfD9$6e-?<(iEst#KL9)LD?c7A~?$aT%Qi4 zs3I+d7ordp-5+UE5+n}k+ z-fgX#GJpEFtIBP$Z0`Q-lZWpA=r4So{Mx*4%dFM@9KF_qjLlv3Z03My*Vq@{f_9-1 zgIqpkd}1#G+u(z;$_$=OW(z{%UpVdhOk>Hz&RU7P1-FiF4@AF57W4gngHEV6mU)PP zj@7D)V=8>4U2Glo&nlYNnl0f^aBxDne;zdmdHN_R%dcwh!faZMkQg+%jj9K!eouk5V^RTxEuX$ z>053ty4wxgNTZM;aB&*;!yMy~#i@4I`St>Bul8UV%~0=xw*cUz=aRf~Tn#RF8`C2f1D7_qkt^~{ zF;?y+#IN0L7y^F6KOb1gl6;z`&M@-ffQ0dpEDmV)R1pFTrKh=Nu+MBgDtPaK+L$}P zwt`26_>REtByAVo-)7AKJqnhVG9AI++=LL-Z)Yl?#hmsE(B3ZERclHZ1(L_*^ zXirVuIG|&$cs>tbr|NskkNea*qX&2sQ>=fBq$|~(*r`^Mq)VjCJ#9GSa5;v{R<2la z-(`}ckvJtMVb(Ii_0DNWtMshQsbtHzgp8Vzdifc=ReDQ^7JB5YNugzGacV!!#?xpr z)qO1YJM%m1U8vwECKuury}h-ECeQN<;~b)Lg!Xg^+FK__G(9^sW>$|-?VshjbgRZJ z-l*vKhR4hBNc;Lz+s!94SWjo0+jot|oSKrFCGlfYnF0iaS8CfxbK8?CSmlrXrGj>6 z#(R06#^(`C&h2+wQh5z7xBiKY#0xhZV@gol%8KsMR!Oq?pXPy~LHWGS#YcYpRi73v z@r5A-Ya_bIU+&6tIfg7qTDKidZXD=?D+Zb`HA$SKrp(5ve(%?@f<&t=9gn+KSzA~8 z8YXkdWJ~m+fp*00i!Ti=yQlc|3}-Hn-wCk0o3Aw(mY{s^(Za2l)mdk)ZU{!5yA}F9 z%Cs|WVmog`OD6phWg!1tqVIxL{Gz!JN<;DNx@Jd%i%I@((n=w^CZ#6|;^KKIRDkuN z;W#aM>Lx@S*Vu4!(5jj44)j;lSh_26gT7{(QnqB>cI-gviK zUvAta^K2#3LP{rSY1fg>&y7n0{SOVLcJsM4izOZEw0&B8$*QZ+1*fpDZSd||-sqng z@BQL92;(Sih(Y8*GX02g^X%@?gzgB+{YYV%lph144wVTx(Gv${e~t*s-kXlc9oObb z_&M`Ek9zy_RI&9|(XFDFEfys<>bfZ=&4STc_kR0+wn{l`Q&=tEonf+Ws91LC=hOZ> z6w5oeZ%-}C+*KB@w0xOkc|Iw?%^0lrhh+z?fq-XS1_l_pRQA&>m|94<;n7=M|I?TK zNyZHhsDqb=;(#8PY_ntbg`@-)l0~?xX>wGt;qwMwgw9vof^Q4%lS$)Oro(Hc1#WoJ zau+e@hnZuvSc2z?CAb(xX8R@Cmw_vz=%w(D2c#h!vZXJn-h5jAcGNENtVMO9;@N*FN-0U@(9Xq(*57d%IY`6R#K2@8$H7u5NTg(Zod6Us0s2) z6_)IGyAtagc7xgIpfqN<50&NREmJ#W81JUrRR+7+*S0QG+kCEBJY^&8r)LBlm^PLK z0%=f-gzk`zn25cC1xB5C0pEy!m1WI#c?D$Yr4{r`L8NG}7EQQ{!XK|{hbEG>W?K5fE21`)<_QB=l0n zm%+iBAaTqa54IZ6Ch;X38}y--LcxWwg@UlNp$`;E1G$xNPv**|>Og`d#!@t&h(&nL zKZ(ywK)%L+zBH)NszdF*sCQ=$H5{z(-LTWcTMw#{3YIi%k|zxikS)83I*r89YmC#j z;gYX!$;3IlFp6PHaX{t2;A%au5CQDiSHS3|^j+)+I93x(RiediLw9vZ+SMW9hfh3J zT=gHTKi^j*TiS&U_E~d9qm+-o`$Q=It^DQo{10>QOsj%9xqur!k=sxEaJEVSw1k?x zwFXJAN|arCvOh+=cDZrs<+BOW$r6b>x)*YI;k)ysM6YkqU70kKzVfb1ccLb* z*L9wBcF$~E3tf(PP|UAx6h$A`0_Kyz>=00(IcDRgaSjJmP;sIc;*tea8@mcb%mYeA z(%oRtmIft~~q3rls6CdZ5>1~(IgbnvitbKbQPvI0K$qMxWurULeRu*7C?aWB{8DH@FP2-OU ztc}k+01lpAaQJaRA0O)qu+-5=4(OgYW{2HCM=-yRF*HPh5(_nZUEsu-rFi4F(Y+{`Wc9^%?HYPA9 z^G;zVJz41uKD*j1N3>KC9kJdj=R^zAwgD1FIH44{JC*$?b8;jbuBbT?yqGhmrLo7-5R ziVSCE0HZ||bR{iqI}|uUFie-;1g{FPco(_`5GbO}4vsCz0gbvr*7yKO0-0IT6KxSW zw#|T9KD>|dI}FvHF+h0By!`S)R%f#c>TRHoAj%aoB#vfBi2OfFmO93o<$y+tv<0>W z)@*j#l;pM&Gs)4o_Oc6Q$L}?qY&~tU?#HVwh^seag)?qW{gwJSWY>!Sn%nNu2y_Dw zuoMNB$DNpTgl`?Dc8;dk-Un&IQ&eVMa;pe{Us;+%Edv^I`+GkX0SL2@osKmEmi*VW zvM_*z=uZEQ(yj^AK_(H?XHOP~S?`GbYpuZQyQT?rDu5OAfdyPnUSSn@<9FpgxGQ&q z|7KA`m2t2I2b6QG-k1@&gX>-b)TaF}GG51bBr5 zy7R#g1|*4BY<4Ef0p5W-b^}N)2Xw6^7|l}u@Sj-wYh7TV;QjB6f#3O0CP3lR7v-ri^aF`Y8odilj>(&bO`KEUDS2 z1U9<2sw~NDoA;|^P3Kcg;I0D5|N3_r;6paS8@q=n4sbwZ;B*1toWcO(NPoQBUn{8S zi2Jjq_{`z3nc?MjRN7?3j1N*FslsqohEi2Fc=A@$>}CH6`5)EZ_z4eYiHTewIpDKx zUf(*R2@x5b)&?EHZ23~~uhsB^ftv86HXXS=j)+Ue1b4Sv$g6z_!YQoE<1nqQN%n+v zpj35|rgVbbRsDpw@jD+_K)4>E$#yn>4ZWLjyEb!4H855kAsG1C^weF2rE16iG2Wus zk79OT!uJZQS(q=y8Yug0{RV`KV{!kRdz@zXu+;N*y+##VAMlLm-B8vDn1w5*V$DT< z9XFd45t)>EX4K+k@a^yYyh_U%HWRTAzb#aWxy#8ZsEt|&ES+5V!=4-7M8?#Z2Ey7P zpmN*JSDCcn-USWo_h-2~3Il^jyJp9yQ%od|J5KsUTrffRKOHKEBZw}An*gFeh1s&u z>&SdK1QP>saZt3(QXvYa%Ie*YAw;Ahy+66fKamOG=T}X%%sRRCVHDEKmi7lk|5O*o zPPguP`nI!7{0UX{k4t}ij`=};!HgT3x8W+!s>%TW%Y$v~JQkHB2IW0lan_{seH*hM z>iLxHHa5+;#|qUNLYA?wrk>(~xW$aI>e%m2xf#!~Wz!Leosbw7254_}3sfRbze!-+ zdIpT|A+e`K*e?G7mkZv-7_mM9O+f=%A|AK|TtRL0*R3uu^RW1e5L2H3&(8tD7TmC# zU#wYN(84h|Y-6>Hty{qgwsSKc$5Yj?48Tc_>tR;0(G__Q5iR}AKa<9|{bIgf zQ&(YK%^6>@pTLfxO07beSk-yRLO#zmR^j^x>S-`QCpe{B zCFS4EGCp=gAtT8m*?MaQR|ZobyH^A|W|>LY)GQ7BfzMj-O(8GSVKCz{Sepv%oLsby zC~1`@k6dO^h1o*jQI82d9ybenx8s;YrM@BPy?B!_p{s@|oA}p?%5~ZS<^T9qyMO6O z|Me^9P}U%QeG0=zgAoIkdx$Izs}PfNB`9%UTfV1Dv8(q;W09fw@1??t#aj>Zo8IU8 zzjk}2EMb^p8WSqyY8NU+>kQLL3&`fC>JD~wzE@V3qd{C0vDbeG=zQ0^KfJAIcF}@n zN)5Tw@6OaMrNLUZCPgE*$!8|F34!1HmJ7T;;k--gD0z?WeDC%KiMF}TyO6$@7n%|1}!(WG?-H40g0M-g`cK27cc7; zlT7~!l`XSt-5-wlG&<(0Ve_cIoaX4K^ltn3`ah2M@)#bt{ns2%8HCJY^f8ZN{E!$O zgU{OcT~m2WZ05D1>MIL#6L>#XiDf=FN*(o|RUIoe?>FfwT7qfAWSgdg{1tdonl3B8 zC%O!Fdf(I&5s3Qvg!*aX!GrUzNeL$HqOXgrL~QOnm?59jRzGC3c9@@AsnCEYqLDy( zovBb$_TimgnO1Uq?pceMkBoqm1VwFXIR{2UH6VAbR*>yG>3-^Z^GwA1LhFdI>lTJb zLI2a2^&5CEc+EI8gadkL!~ykp-q_Nj_Kb3~udgBz%LnlE`!06`-av@R*(fDcE)xl1 zC3FCXg#sxekTr4h4yvwRJ4&%((%fayn}b1*bT1nEMp)@ETQLxRKlhLVh^H86kY#rl&?OkYoOtb zNY#C_n|5t$*A@Uz@$}2(2w;22=r#gOH}pQunwr~!KN5Nh5rz&8E~9$XPvK8Z7>7;a zj|N7XQc}Y|4G;g)Ipq0eLChn^laN2CvLeiuJ?rJ*cYOQ7_1u$oP$Dpe631*5$cF+c z(P4x%Jnmkg+tv#MAR(v9KVFs*EGRkUwk7{Ab%d)*>hJG?x0*=zuYCxPVICE327FKnwRvg~_tVUi_~!l8FW({P>r_3#AK6NBcPkj7 zU4_Pn9{VUBFQi7%s=;Sq)7sbZQ z_#L^d6@Al5lySLRVT~_TlyTE8Fs5m1sSw_KHbk$e*s$;cCSJ$xc$$k&?cGH?7erO+ zkgeRl)>jR0oFD#jdlDZW%RUBaN5_DL)q2Ee#e_7nZt?I!zgxqRw5tQ54#Wgc=m5di zG()N=L6>Rq$t8kU*+Xch{Z96=T3(?#Pf-v^0Oz8k%DAc)U@8KPQn(e7Xqm2J6t{g1 z03jdQjB^R0qAKt84+S4=%bWfgY-tCmIozwb1l_XAtuH;ApEqh?Iu){D_$D|JmyPRbV=iAsS?Wu=2#+(oX@zTkzeiD;&@7&4(ko3Wo39!4~+zcALk zE#lLW>p~X`OtTxBwT;uhdwq4f>{6xWc`I?r=XzSSD1yqUEA$xi4(En0 z-h2f^0Xpt>1h;BMzv~_)XAB5()QAPC8+|iLylMCPB@TE?x&nsAr}T;!UyB|9DrcM55-T?$g|Xqt3^%es<=a%?%e= z`R+--k0S}0X<7}1pT_1_@{qzV67t#86Ut~O|C@0i7j23L)ejtP8mg+K?G288@5Jy4 zjBZ+Q@(J`I@gtpx^;XRRTKt$#Zg@ct72i|V&6kS!zmC$rQk9PigGkDGH zcu)#b_H4NTQkFP-qCuV}bXKPKboB2Lrieebz4Y`Uug_YDrYmB$JP-Xx?>W20cNGY_Xh=C3fyeW7UfVzCBnH(Xu19?{x`t z68E>r|6J#u_C7DMIB?FGhIM3Ih4<>|Q3iY7%(ok6k`3o|)`yb7e4&W@iaJ2959dvk>Q|N=*b{hWhp+od_IUKQZsCSjo##q56_#42Xm` zCi98plyN$fNuWGUBO~85P+M!i- zJI6_JNKqp|fGF^r>bh;^Y6cEpeQW1( z7`8lgX=`cgIUL&Tr*qXXh#Yb?RT(Sczj*lrGfEazt#ROF+#Jtw!oS3E6C* z4@or3K3#Qj5&K|K3mSbYl(8gh8&$=)VZ1LU{grH9Nr^G6u?V#=7U=|AE$G3J-x6AzzYvy2)v zCNE4Y&0bYuQkPJ%V4@ru9gxS=8dOt)Sg-qe#s=rdBrI3p508v?<;`!|#ElK#A0BJw z)~PXMMZ~3H(w*@kUcQmj=zi28TJW5HLFW$(q=at-}~ayrPmb|uOcVz z8_2GnyU=~xtG?!~z{QMaNV#yrHCv_`MaN9J#NDelZqUfg{PM-#;lY@6V%sXkV_WXqI|#zbZy;_Irf!5d-ay;Vh6uE(^#h za&#|mg6C+dFCY?#hdm?hq@E@f@T5J{fC7!HQ{X`rkGs-m%c!o5_8QsxQyUf;rl%C3 z13C`GlNlCnkbfHSH?gnwz8G%8Ei0SzKz>3=?P|GIyUnUHOMmbRc)FY`1+D*Oe7@$L z1Q=6}RWEYSH@n29_pO#Fc_8W4rAkui6Dv~YK4M*>I-yN5~M3-bOsPQUD2Zsa;Gcd07xE-fyWwT zX=kQJ$MIFKbWq&*tLh3akw8>3bjS+oicigT8kK(AEqCrlUPv@P5FCi8e~@sCK#+gul-tbxx=US*`g1aDyq^7sxMo;V-#1YPM7DkgK1D~e z4n{3P#=+e$bdJ?sWa#gBB4Zo&^M@L#NO{uqS1AoAe$QQ(Vjz@0WsklI{g#~JV2;`~ zPT(LYEn_M$FXKVPoSBP`K-ihldHJI~1>^F#fpPoa7ld|hI=`I$>6N@f-Zo}n2Axk? zQ-Ln*@fSK0tHAw76PK=b0*IRm$zW)f%VzwC?J>{yoUTPe8c;v}b zjdtY*0HE9|Tie5WvNVY?vZc#ha|0rLwSe7u9Z1bwO4#btjG&t4xTjF5<*8D_X;Fz~ zy?GAE4;Ypf^5a)E*j-m7gaZg@~ zOZnFiUza?;ax!Z{IaHm>%CK}p#KI4})-1Pmb615migXX96VI`7Evg@(RYsr9?!3M) zA4`&c>aXdrQUpA7f>Al>l~`m;xbgeX zwFu8pdWdjh;R|s@Ph%dGFBC4|(I09`F*T~;wi!Q1JF}tIaQbwFt8=@(w&I=YOVVob zAc;VINHCX-Xr&O`)iib8ua4w#gRD};#;fx+D;!N z^J(K~-yG5(;zNNgTn}MG7?v+|&U6BL6GA+W>xpgP$tua-Sc+ER#$T&>eH}WS+GT5x z_*U^lVeaD2q|4qZ@)K%pRQr$B}Y*9lxSD0*O4e1gdra-zN;A28ys6pkAn9lv&P zr|Pid{R5X1eC(GoVHoi2*`?kvp0y7Gdt(4vVkPOFRE?kgI>9rotxM=|^t%VnPpT3N zuK^jm?ArO;x&-AnM%NBqp|q2EW)lDA>+FX(o0$yu5jQesSo0V5DhK5G#C{)%{C;h{ zC()jw2Rt_dv_0SEp8_x9f4|TXgC2(Wx}O@312W8h6Tep;itm|xp-Y}0OAikTbD@jU zSFRi|{c3UK?M<^cN)HwgLTW55}IxB4*f~CG=7#pWHHOs6y#nb0S=z zmHiA>XDUw)macp<5wPF0E2@d^1z zdp;Z(Kv0Qf-tAk`JFS(9CPIWsB(I|J!xN9YS5pryjpi8^Y3(K zyYfPp+lDgpa5C?#;=@`phUO{WOJR--YVxhuGjX121dnZ#P}`9Te{w+~zG&N+#O%^a zNBP1bf3U?w=!b*yA7A{BU;j%1Z{KdO$+&{(I7MA$g`ebrOqI^%P}`Xn%-;O64MgG` z@Du=snbH0Nvor=Aqr|@4+~gLH>|m>~4p?{o-#*)5_(CWutix7C%o`|D8v9+VKm>$< zoQ|^e)`a*1Lnfm)9hsiJOV9Ie-t?(nzZNGg~g^KuzC^?gy*zxaW4A9%=VwVpr zLM9+|!4Evy#hdKte|X1(bi)v%N7o18nBD=0RSg^v9FBtWGW~RQ5#zw2m>n$YGD$ZC zuJ^7PO96K%5W!<4Vn8b-3eT&i1f80TRfF&c&e>AC!wFrQOnu;~>_WV95hPKmwqhlx zpwV-tXg$8*>0^<{ZGW0x=;5We<#Kvh6bO3hO7|pdzZN|k6%9GaOdRBZJWvUcL-5lY zO~{ip@XyIJK;i4tY@@#VN>9o*FvhB%Y&f3Up^WzXG;eHFU5$NKc8*VPP1IvqdCP>I z%HKPjhN?7;H~jg+{d{!Pj-a{t(|#j=NtN!o^q%!HLP$s&W9S% zlr2Yrqe$G2x#e1uuW@2MFY^avYojM;5AklkqcF>Cx>uzYeEd#*Z1KMF)gCTQlLLyp zgRBn~dnQj&<(l#QfkUS58f`Wu+wn246w5E9X@`S>e5M8VV zQm!|L>IQ2hDTG{K6(WN9?Akv(7+%a4H8@qfC{~9Xy+-#*{d4h|BRC&i#?uBn66!;P zIg&h&(wv}_(#p~7+(NsB(Mu&P%ty$GtnVAr4V=)SKy_`GTW4LS48(p*oNp;o~+NQ zKn&22e$D~iSck>K57df`O;VvacqF@BCQ7{KCz+r;&@O z5x|4%v;bmAmM|eZ4&c8KTKRh}JFO7xbzYGyfg}fBu)i3?d>@eKn>MeirM8JV;BznSU=s@VYH| zDW~lJsO-6tm#9bzTF#4pq?F%U^!^0U%rRs{EWAZ2m}nKCpysJ9!=NrV~5Avz-A&mju7Sy<$8}YsjsL_@_iAbf4DX0>i4&d=Wwel z61{j|L@n!X_#mQ(Qo{E)|8iUJ+*+rVQ9B8L04KBoeql42>_ifHg*sv!BiFC)rh7aj z%&75EL_m^hiCc@FM8t3T_RKewEWliWe@Xk-m!0x^4b61AIC!O}D!Ri4O= zV$2a5;vOa7#YUKe0TmIg!(S6!Pqg!BH!*|Vt%)?RGxM;83D{Re4OGdxmFSIj_?;*$ z=SnA-tBS-yp1}Z>9v&lk(_*dwPh2TkHL|7pt$(tQS5WP%KDut(pBT6%@wDg*^fN8^ z(1GQ={RCgPINPGxK{-L&l5+1$y{SJ)+olDJV%L%)-m;ZGV0z| zpR+Jpz9oS1%d8su+P&5O=lb|R_kTO)UL794?R2akRZBy&U&wRWt_o~pK4K9sfy8R5 z4Vkb>U|dyct_OxXlmzfg;BV?b%t+vrIg)ncG^1H<=2c8YU*n$I3DTPg4KFxY(CH2wt$d* z*E#!~ckF%M=Nb1t<9>NRydT1FjfD)dSXuu$=WovWU)CzlMpw)XxEI+M=W0GdC3e!L z4e_^K&m>KA{Bof@XHA?Rm`Y#oAxZ;QZ-EV`TEOsaNw--p%d(X4Fyoe6IR@4}E7csa z=(wEY|2c)dU^}+ZL?%^wo8NB67>3O)zuast8oeUE!O5un597BftNu+WFWheF;yeST_#DUGA?cGdns9*0|dC&63`l|= z!Qh;0hh1Otm?hqFVt#sJR4e>l)LWe&P~F%L{ zykf;;3cS@7?8ugj)vgH2659fi^^+N3BajXPwj+z^-UIL_4d1@II_(&xp zoBLKXGs~kVo9;CV(@iQ@6`RgI;<#LatRn9?y&F?kIfn5ys~y!*;Rq*6dyVJtH{U{0 zgLKU1wf&ngcNTCd>N$C$vhD`nW_&O6AZ=X)*83-){N@u|Ao0jnJIv)`+KAwmjrrU7 zH+e)M!E;->;jEigxr~eSk$tmyMW{H)lep&=he?zKbKEUjd7#ElW>k5aBUpjtMXO2v z#QU(t=7akU5f-}3MaU|iGL=$1i;vPVC~=U~?6h@wQPFu*_rs{4wtush4qq)Q_4{`b zqll}YZVccr&$EPn3|nNtvPL8S)RAo4b0iO139J>f7>?^inr)&QuVXj)tN4lLfTFvv zLl0B81$;{M3hye%E6+>YNQB>ZO|=x-dHMD1)_u?d^yW}&)<1^mgXa7J3|x`qUk_N$ z{l(Zcl2*E>@~b#0m&VS#A1?See-dIDHVfSo7|8jcJCn0IXdus?kH}BHCJpUV&sm&DHFJlw(GpF5e8y2`$T`t-T@t zh^f~_P>(fM6xey0bN?QjxjoF2CaT*Z#vM6*bdY_5h6izY=94ag^8xW14-dz94*kwr zck%*TP49xb=AS1$R{`9r7RysZJ{#=I>hgW#^p{Ra*BJzX>8Ap-FUPlc2PWq~R-ePZ z{8e(~tK>Tl-5&K{Ke};=IZA*%UBO`FWc{GO3i~YfB9KPipSdLQg6=$vpPy0LzurCm zK7C)tVP?MbqwQy9eV5BsaiE(aA_0irJgEzeL=;} z&OjjPxS^i)4|`-$LsF2=`e{2k{>ot>5Ax;0j`1jN(I(@KXQok&a)xqgi37Z^V3zcD z>5)@MYHM@>ckQ(xFDC(^POqP(=Uks(WC^PJ@Z+ELn+>lqEK9w}+4xRL z=><}7bcQeGRfTMh`mjf0ka$Eljv2cZ0udx@qS34Su-4WZ4F$odF#DsgdIS&casLV8GOZ*Flw-f~-K;GW z(zbme%U?3%V}S;d7_&@&xhVk~?tP!;gYw&1_DtKF&X*FaYp z_9$?z6tiMD4cK_^pdM8bi#mR$hiV-evNT7i8lt@3qdU}9nQ2pMPxkmd+g^NXj0cWs$)QVMLg-HnO=O=u7Oj> z#-CEEXgzy_;3iDO#&^~~%7{%Bv>lUQOD65MvZy&uy*^xhrI4-rOMz(jg`tpu%~jK{ z`dWsZ-9N*Y^)9wu+6~#+`k`xnBkad~+i+cj2Qm4^=)Dn_&$ZCO|T_{OX~q*`OvM_+h+cKX6$P8L?y<3{HXePHDol=4~WzvSq6tZ=IR1xaPC zVAoO7xUYRjRDC!9b=Vi;<7XG@9Rsy%9@^4|ayvIBFBDKrNKN^O6VX;uHeN;15@vH?jsFt!*A6YX&gp(C%+)N195^Mm)Ia_Z#T z-)XF{rX6)S-;g@DnxrvzG4A#5@v=2&)E_LzDzR9inqwK~gL|}+ga#N-Bu`z%myxkU z&8OZODqJ|Febgi84C@%jRR(NRz$qpP_tj>+ZG~+4y8KNhS0A#nZQ3ReFXrEEVz|3k|9_nH5cs~-Ogds$uuhYN)k1qYykHedYK zkX{+%Ew>2xZsuX*ng7<{3AqKUI9UorL29yC6|Go-mxlvytiSuaay=2IZiH6rA4!K0GzDE5tQ*;XKGK_U4>DBg(P zSg!+pYd(L3R`rx1_67*(F&;X+*hnrNQWnLeZx0X6N?IJCmHm3<*~DkuojX~}X#x0s zErtt#r@*2z(eL}*M|50i3)anaqlzHNQ?)OflWJ3!|^~G*Wx!Ko@!vlp;VNr0&_~ksKMuHn^_i9GnU1M0qR3ZiV=iBKEu! z14|GY<9I8F9`XBJI)=hU-=!tY?4>QwKO(C&IQ0ojG>J~p;5=!UL4;g?gQ8KRO=&G*$>N6iw@7L2|>^Zkaw;+X&evXUO zmy&LifZc;7ILKALqfN925EbZ(OlS*jCsG*;r>skQGNoF?jb3cG7tgNny2B>#n+g7M z8_nVJ7fQkAKN7Pzi!tk(t5eRU4)CbN5)ZF9DC6@OVwQ0bDh{%wr$vWE)`!AwzH6!- ztG_>bD&?oQ3-0t45u3(~%Pi&Q5~fciTu#wce#Xtuo$#9F84VM}>{twA6<+tbz6E}m z(qW)!oFY}zGOA?O>n4qGQDV+!b=r;(KX7*T>s3*gB!-Wix7_tm$nB#8{Xs? z(mOItRgHn7*ZhvN3oZIgc7gxo6}uIUU$T^pJxP~LKmi)j~7N-Ma*lda(YX# z$7@(Y(#u38ngf5P(Zr`nM1I!z}m4 z<{XWqEPCNT|1l|y@Jz!m9Gv;$6An~<693YmDauto#xJ85|Ee?1z>6GO=SWgahzgR4eXAYLdS2GQ(sIFy1^`wI z1=RdExqN@HxPnq7GEt_NIieBf=g92ZPM!|hox=C;f&o%{3hQ0093`?iXaUr6o&=ii zvowEEzLvWkil24Fz==<(H)qRGw@LzhXxnvvUpyc1`>z_yZQWxmP??JCS z84ft&jxn@L=9cvi4{aIMj-xBrsTx|?!Aq_6j+k}V>P+p?`_Xo5sA79Vwukx)8~FBI zexfA9WQcJH<+iU5h@+1}k1@OngLktWLi$$ayI>GM*sAU+YLbBZxBj`<*MuZ7!G0~o zcN;TzgwXM@PGFz@6{|~^tcqwrNAqI_+V_Z2Awg7ymJH(vs&ItwHV>~dQX$LPNxEa; ztx{LlTL;JL=Uhz=j1}7RTs9?wCP;EQp1?eK6%2vEV(e9V%~%ydg`V5vV3QHkkb8V; zAcU%GXh35=A0L;J4yn*!LtUA;nba|0nXXbxK2}|DlcNfIo{o=h;1!r3CHK6?MSW05 zivY7q4!k1Hbeqrl^SVgmA-Qp4*IP$Si`lS$qOsk(n|BF~&GA1h@H5R^_e9mlv4TM2 ze6Elq#%USGt%l~9#*y@aP(MzrNV)U$WMfSQVy|dCw{peuEqUt3Fo~BiG=mtAAFru@ z@6cNAmkTt1Sob(43X-=d!wFkwpW5C?) zn#9-O-`mlprKvuizi}nt?oEzHtPq`}y~2Br1p5sLDZ?DLYx6W`U%1vVL@@BDp7B@0 zS&cN<*PE^0{o!<)+GFWxQfVEkU;#RhY67p;DM?&lftLJzoF5HRin--_zA_L!Eb{2H z{EcC#g$^-S{$ROa@n;Mv{Bo5bU`TSgJh(>Cq|Qi*M-cTEU6r6mVIq2{`qXLVhZD-Ja%`Zba>$7?6qjx&B)^ZCM ziKj=@L+%iAtr}Yzv|e;2W*1tSggZM_jMlNdp0tUCq!CXtr*M4WS_Kx(;rN+SoJ{Dl zi+DqG{Mtg7h!!Ht`F1n~wO*z8y1r?szUjVaA$~$}-G!!nS~%r*B^Gen^&TpU(eBDo zqDg+si0FwTnETUI?PX%jS~m#V#f!nXq$X>c?}-)+t2H~lSbXYsU0 z&*YDP@)B$!%^Mn%&eWq_6_MlS1hO@jm3cwl z)~A|=`f&3+K}b1|T)eRN^5FCK!fb=JBHO7)k|Kmnso*plv#~8MLK)?~_bJTBoMQo$+ETwilm*x_svZn0i=2 z`j2>~1g2!c<2|n&!-k>+w`!@Q>z2f-DCroM=y1usb;dw#s_TcWSV znHLR>Zs;@T=e0AvY2_p!{w3%svpf_!4MUT^WIT>IX#( zgZTsDo;&oNICaO27Bj-Kl=gUr4gJ~zK1!XZ$t`{2YU{->)1RN|1PA#&ty+S#pQ5lq z`EPZYmA&qv^EjHL{H-1cBG1S;=KdT)jaZV8>DMwhk4EP~{QgUwe8T1b*z8b6YTIS? z%H384BEd{bhR~i6&6a75f-*bTd2vhIT8u3Kl<-fYZZX06C~j$(+IEG=4U)Ch0#M7& zrc@p1^}vHVbAKu3Gtc0bIQqZA*I(c|+BOSAXaBSil>W<6&<4|cdFFLI%m4JH&;#>? z?8*?q!A!LbZppnUL=y93_0S(IvVlEq+egp`iuG?}dZ2XUjVtK`LrmjbW;dAZK}#J5 zM+PV}@I47kjI0iVpZ~Va3-I${|NTje68bq@5`6ELpdKf9r@>N>{OJrR(iK>4`9J~Sl!pBBH>4)_IQ96oi#%;>zLv(Fd4tS09HbQaRKGstIFc$nvOwWV70Koz3 zB83X@=+p6?*{nTG*&(pEqwNa)T4gp3FxTDlDhm`!&kcO@<(ll>9Si)scgg)pS8R^P z1G>gNI8ks`|K*`Eont|-rUH|>-if0i#xKcnaOjsp~5x9^T@?Oh0Varh)x>~_{HN&YTrM|>D=qFjwx{>~| z*?T8@fakc)ksQ6dG~CY&8k{6Dci-}2fmSy^~I&60L1<&!_!r`QtUOl-YXEAbu=Y3Kbs?aIeJr?6R~vP#v6yP1?NVUY@EZ>e+x*)(eXdGXvy7%)Ok9*b3fFAM1@5V z&NOc)duLv2`y$Yh9-*Y&Da`(PO}kBbS1_m%A$#-2&m+F~!!OUp-U{n;xeSozS0pMt z?$Fua(bFtmPFYe01f8dVu&(m*bm|Da8UJ{Ee8Tz|nmf486_c*oB!c*CMb-l9T zjlY<%sq03iPW4cl#OkysDA|6;TA;qy}i#7wPpH1JyHJ77#e)4$Hd<; z8dG5yDBeP+ZkfN~pC0h!El=s-vNj48(Fe@;AqRz+vJT>fHo8jOQ;}|P#79vlHjnvd zCAy4bjN8ZJa;Tb*@(^r!Mrh*DXWA@zj{qFHTDVMbzZO<{$4Vxx`S=fV>K6fZdoM6WAkl zx;hoazDOJYy87R}Y#Rq;GlTwMF>T60y4M9NMdiRRC1I-{vRr~41w6K|jV%D+8YE0w z&{gT2NWt_O(WH{8p>Eb=>O2YNr`HhbiBN}88#%`;lj7{JwMhXs`uf%^RmQZKPFQ4a z9eSG#7fo!|63(t-1+cM7VCn@z+lj&kFP zwS^&gWhRwZI*+v%Rdr_H(jQW569aO)g0G5OWTACG#Zj})qP#a}u2mK#YD|i`BN6k8 z_ot7>NuAf%iSA)?XYA{GF;5TbsJzDDs7W<}RJh8%>aV^I{?^Do#pqc(xs=K~_tJ;4 zJ%QpK1AIKL8JYW4l=V(s393b$Px;buXNN3ai*=JxMRdXWnaMc^!3~-8iy!XT+9ozl zLo9f)mNXKR3rw6)EISAIu(yYF%*vPdw!^)PGy6Kly6A6;L4z44==LABe#4g~V)Nt`!Di2q=T z0X`s0JdW7V?SB#`Ic)urdV5lKyR2kNk^e*FlOSpCpKTqcl4YsDL}MYEMWAzVNrA7wO-GbM+A!xNqg zB`u5A@86532!;QaCS4vcdRQnrD3310hV z-nkd^^p@3-U)cZB$cqCf%2Tx~ze^av&h*2%!}{7d z8It)37l{$S3X30RLzM*cKonom+i90q^7MerW{dJ2z5Bvg#Nx@i*>??M7oK&dZR+on z4t_AN5Xz|X-8dG;1@NZL!<5}l=SB7eXDxw0O7Z6!$W6Ve_|yP)3A=9?>RE|%ebVJ9 zgEJSgase%yzuY5#!2`@mPRzBv_Im2E@9?iAwkJ`{P?neg`%n1ul8@^2_2dIkcQ4 zKJR!`#adxWqKZ5*AD#cYp%VXQB~xU3E?!+F`WHfc{PEi*htA+P_!lbJ6`r!&@9=eI z0YR{Oxu*_Mq@b5oY=GrF`bqU9pt0ZXq5?VtYYPtY>a&f_z?G@Md5MN81|K4IqpOPb zXdVk!y9RARQ*Ucs>(j^}DOIu2r^g_}e`jchASGMha^SFG;5OOvSpH7XGXK*y4b@zM z*Kvds45$NfQWpplVJEM>#exIM8JW&%dw^u!I8snOEYMdMdA-Ky{L)96`$=%wL+38C zA0|jFsQm2Nzl_zOsl+jmk^n!byL4AvDMWaNfEQwasRW$EvOn}RLK%;z+YSP=_i@Q z#@BTx4#7`hZykU$01tFL^Eh24Ts`?XP-W1VcD06nG52WYnh9iy%6&$CDq2mfiiTlor!Ao9=xW3c}73CR$o_*4EVESIz1NXM+~ zi1+4zVB@Qx1%<>rp&{0FP4O2!et2oBc8u4urE5Ms{QOYz#GgEmMdx6k9arQAL|&_> zpN=U5!kA`F4;m`8Hg2?}cYin2?!>o7d!9x*zKKnr^^w45sNK`j5Hpc(giJF;_N+md zM>2CX50az^bHzPw+-{bP0_Y{NN(?=3<_F>_dO*=zwd(0~Y4W!paz%}efe5A7A2`3( zOq+X>_W2py=Ikmw1I0k}KFQi^7%5&E8A6rl^~*hWeg8>7^S75%LR&AIYfO|r=qGe9 zq#{?uJfg{$*Suv-e#6Jxmt-38oVeLp^fl!R?M-a?r=IXbr-{CxCEJx2()9~tg2CC0 zp+OE#Z4GH}<}1#WDpqSr^dLQ5dQ;x~xKX&;kv*|f#QMXtX_T7)@eC^!8V}y%xSxhJ z6?XJPW_{zct&O{h+^7tghGh{po9;`+{~V(i z?~}B~dJ?csdtr$Sk|FOiTL+>U+Hd9%8G{&{?Fe;TdaTNNtYE}XbgQc7D)D4*eUL$v zWZb1a(!5Jz{vzlRJJual<*-r>$86kbZQ57;&^C$Z?*jWUN>tCSXL5F+?|n>t1o`dI zy3Fe^=pI+4VGr!rxfS@Y$_N%gXwtH0HJEurA2K$z4L(!LKU7miaun zW#sRn>K{Kw*aWTg|HrTYHm9H^-sUGwY(J* z^s){no?XnfVcM|qFmN>Jiuu3CT!Hkz`j0#h{rJlO>zv`=yw`_*ajfQ2=Gee!?&qii z41Phfr2TRsUA& z>t6yXVF@Snq`__m1oJ$tC-#BLS3(nw-%IbvD8bn6O`l|US}2Z+X2ZN4uxV$n%$6CCJQ(mM6|Nnj%_K)SdY{v zKXK@+UJ29_BqA{n)K@ATt(a4_biGyqlDLd4x%I^s;m4;?qbmUuHXy7$vISVpPt64O z1SfZCD~P$$q#`K`Z-H26XT-L#WvT?yV_a<|S2H zZDbeKF#W+|m#g2)3EZ3prndTM$7NWBc*@fu@o5{EA1)@dJ0&!zYGpzb=9)Qo6a0+f zQ4P)xnC?Wu@sHb|Qm&O+KKPV6-NZe5XiGDSp*s(oT;ImPS&=yxN4(X}JWx^F8LxMi z|2bZbk1u{D{SIW8D~YD%^-XKu?XhuEoF`d7y*xxD>WsFzo3r+WU8c>2Zw(}7c1Ph* z^Ov?-EFqqHVj^0?6}Y_KhfHyLMNERff?%Cni7}>jIZPtSG4k}Rcm9p)J^&=_N7m`N zaa-B)U8z`8z=ncEK|9jJpktdM&ODtCxF_g(3Efz=gaak@H>>i4({C@QuKRy^5i1aN z($=1uJBg;ML=)ulr>3z!fG=e|de8DP!HkmVwdz;J--B~QEC@x9pTR1;vG=Mtc=g%= za!x|_nVF(b|0w~;i*SyiIab(xlp`hm9R&rqqffhN#psV<4RAixQ%LsQP%2aec#V-B zQ|Ef1IF96zJguZPOqOuGq+IgMsl3kgq16+!IZWDi^FbCv%3p@smO$jAQ9ZwA?fPe1 zE9rr5Z1SYMsrLZv z;&2iyPEU+pG%4`-AQFooe5EA4f33f%DOS|{(|N5=G>(ls7YUWK$Qh1*Heubb>bH!X zx2C7jqu#BS@ z!mlK8OzuFTL{58>tL{KoTg=0*(%r=37NF%S>rF0|XLEO<5Bhrrv`DdrX$p#N%I}Xs z9R4zuQn+Y5?pJjTG3Z4;osTSC!iSJ&e|@&enDgB%$Quc3@iIJb`fYrT?^#lBL{ zK#iW;W5pVKsAmW_z0j`|rylNA()n8v#zNy5y+J#Wng}cSuzjhct)+P>S2*>e9-SNk ziOlMBl**A7?1wDYN2484 z_v(^9Bkqbn=s*xhfKhO_L2*c|p19#cg7y;ORIqpI_nuph zHt(X=rBijfYA%kXCfY8zk2*Z@ z=m^X?Q8S?~_O#TOf`oH;Wk~<9YIdr z7w#w~n$!WU56CT@o#K?ZR#!Lrph8`DR&Z!_n97s@VayHh9AvL+>a4;$H&xMm*Lp_F z0wi3VqZ4uraI*!Mg9nKa1G;Uzo-!Ora=u8K<K`MD$?X%%kM z5Rj?O#;p%mI800c1okg4&vM3?5=QjYF~|i-jB*=dN=1Ar^OJ_d{Yal;M6h`jxCK_8 zlWv@F^Lp&5maL2Y-erp4EavUaS;C4n|K1BGv6j4pdpoFA1&X10N-V74A$&Lf;h))* zAu#Ar#pt>OhC+kdw!K*Bb4hSM5c$N<@u`Cgtw&ct&e1V{iG<5;6Dsw`sb+Thjn7Th z31qv``ZzhW=X&<3yhh`m-Pd~~ZZl-So&PS<0$xy5gn$-ma%Z06$O5pv0rI=WT6=jZnal+*k{Z3uUqPSd& zfq&_8#s#v&m66^PH_Q4J&PAsi-A*)6{G`v4xf`-Dmq-)?GrqVarZ5O%1hE$>RRW8` z!J4sKl4g$4YtAAD@w1N3cRE5{?j1Ay>eQW59j{%KJ=Fc)RPd15yk_Jk4@86kqjN+v zLP~%-6Fk5r67%!gh?4`5Z1n`_rZUZcTM{|-qjngzCT@Q2l6>}$+ElihXLTKR2hacM ziJj=d9SJ)=3vl$fa5kIcjOpyJN*LT)r$)<*?Bqt*8{iVom{$!vN*cx?g~M`5Ktj;h z`_M-kcX!pdPwf}bm}q^-U*e+A|H)@;o0}VJ8=DA(90f-+yP}-$-vjOPBRJD-)9vp) z5|T+gFy!*PPBqy*+rIw*6*DAz>gZuOzYGe}L#rE-M%Bpw4?)-Ds zUriiMCnK(fIa=;tu*0$r5v3Rx#$cWjeQ*vZtkpQfszlO~^1bYh*D*4(y0y?jmZ>zX zzT&J+QV`2dm-M~akf^Mj&H2RS;ap*3u85wPOCrCS?>N7nrxJ^`a%)VZwYC zz4qYwWyI?06V&&Q;jiZ-4Bo@eVMC<&4vPI$ctC9}SAubh5(>FJQ5do9zmeOOHs|@t z8%NEG?LP|jYB>MO-d`J;aQd1mo19HJ$4BCkgKQ!v#@GU-VscO-J+329O-^E-q^U>c z6ciW-;q*#FgIwQu!6BQWS9q_8ejTsaQc^y9pMI#WDH8F@qXyyh31%9`fpJjbxkeWj zZD^ITcQ)+V>jK1Wdf%ZgX&H)t@e)gdon{`39EkPiHfe9K`hY$f_R%3ACUD-d0=hjv zh)xD;iMbeV^D}xN4Bj)TOXphGS#>iW%ZnFGh48~ux0k4nIO%Txj126=%0xSads#{p z9;bx!Et!$@rSjEPIGUEsbosHh4qvNw;*9$xFK4C(**GcFz!Flum>a{4Kt7`nFyfmh z4nj;Bv%m3~+i`zRdaeh{kKtYzTmeHv4352#Ti}=jbfYX9W&fS+umml) z!56(Q>|}uh_`3LKTkxt)bGgKBNu$V@;yVz5OiZ^etKmrvC0&mK;CoV1|vP%XFPgp2Qf@tOpG(|;thc7bP=FA&(>%ZozAAVL8cQGx}-E>tnv89OqhUW zF?q@qajwu(^}~+uu6JkW^7Q!UntdV0-H5sFo(`hI2#%skpCh$#0)d@Umz(MM*zVRM zXN-5JJ@FM9AsXLJ@yF=h87qn&r-}}uvR|en`LU`8O_dDz!ht=*ww#Pn-Y1b&fxvd* z=EiXUl@LEq=7<}Lil{1#x8!FzF+DSlaPZC%r7Em^Vyl1(GXxF_>YW{_@Hm1(DW<&v z4rRb-t)Nf6lwmNOYeq}T&s&*( zOsI}vNnGUThP%SrU5E1kTbjgn&5$?2kqU`*keiELXWXJB^jV6w>s8E;(S9VKbXKqM zdt;Hb7d0Kgl)WhWE$b$sEd;Lg5Pk2I>2}rQTnISB46%&M<=j#VFl%FB$k2Ks*b^!+ zhdpTD3mzy}$YuFt+#2>@8NAnQDx-0nyp+~mD#3+bWgk0v;@i%9C|ROI3msm+;vDjx zEE$~!=JLfoxhj`kl-@CiY5uu!ij;Vit>h`O^G9f6yfdyBoi>jmpYDgty~svG%LxPt2dYY-3*qd)I8(V6g_P4 z%H zX42H+lp5Z@R2m=6rgB@GY^1<1EJ3Rwae6bfjm|I?;2Q0gJz;1o^tg_3k>NK}bRour zG+rv7LTM@(k$zm&pyVJp=I&@x;gPzmw&C$CyJ62}AGQbv=VJ5(0pII%K~3R|nug7B zGHS@pzX*XBsq1qsp7s{wpStq!qsx_+h>T0`xAP3zj~svZjzb1$iD#kZPHwa}&qZK) zd|WH-5~UsgU^$L#ZpewQRj5oZnVspAD|-3mdiU&|N%51uVxi@%hdG-6*+zWSR(Rvp z9j^ITuTzGtj@EpKQhq(r(P$Y!KO@;&Ir%B();c<$7>Wj&pl4-l?~^3cPWqK-`zHU=AvzwL*BPd zluusBV1Z>zbv){1nW{GZ@Sa0{xX51SS+4TcG&dCLX+=YA2@)mGoAmIZCu<+^l4o;n zER!FzV>pzrDPCNXH%*?rQYoWqv2oRgwdQ7FluoKbB@I>7ojVV^=WV?S<^5s#3-&`a$$#-kI(?|2(Iz5<}PTp|xhwnbKwG zZ^z|d>OXjJa;uWm{%pn(qutTC)2kR*jX@hnuU+2wA@?cRzt$pkZI{sX?0o3-8i&px zhvmO>*xF&xeT(eB9fj-Z1Fhgz>C1EVDkKmb2O0zZr4F7%Haau0+?XnPeR!fvBt4Uv zyX_;HU7wz2?q4wV;muA>ul!_0op53uT*!g>Idi)O+!{03rGaW0MHD6gnAx+{V@maK z0s9#YuCw`mMmduFJ)2@zzJPB`pPe;Jw8^;BRLi+-Wh{LJola~xc&#T6fXNV1fi2xjh^w)n}(19^m8IlM5Xx3(4!Rd>+;=R-Bkf z)R^%;YuEA&0s}&53Egq!7@n?lsgr;qrR^9ZM{TU4WDF}o7bkC+jr*NFjX)DFhvvI1 z-s-`4=W}^CZf8EZ<&dXpDRaTS$`5d)Ep(@6LLaMj*U~OWlG+;dN)|2`(Db5CM+UH7WTtMg|hhxHatG z@FYq{nhq&eD53oz9Ej$yGOu5lW@i!malfgRzS0u2gtD=wCpV7X|2`~cL}od#`djem zKgbyi2T0c1HUueunt4kL{>IJ@ZS<^~=eYnS^TtU8-Qp?W3KdNA*5MoK^)9tE*3!1> z!AE?AP0PD?&C%2|#gTodCp+(7dme3MeGz_qd5(=K*N&!}+2(+g``?8@d%rQdWW_~n zT*t$;4A68OqYlmwZlaI(phEHteO?jA`~LjC_I5SkQ;D?!uZ&QUI)Hji2Pk0?|*xwmxiqD)NsREfR zJ(|Jw>5am32m&4-5~7`d^n%i-pXo#AdMgvC^0dH}?lJcbl>y^AEgJJX!rRBdcQPL&O)g*yB$MBk$Bhz|QP&8^HOEBZh5L z0>{0SqcY@9ld5G7ec zOkQ-N%RfigFVj;$sl zpGQU>)QIVMfF?6z;$h4!2U<~Er>A=C4MQtBv+50E;Jac(2$yukB@gHFDb}CzZmuyt z{b6VXyf(K-!Cc|$;MM{3#^_z~Z{J_NUM3&>hy+n`3eLZrygV_hI;x_U5URnmFYoA4 zKO|Qd@uSO%Z2rwl&u4mJGjN_Sk*Xv-N4+X_DuQ`Bm&#YAm$@?=pscoWluK|s+S|N5 zO03|_;bV_jF6Tk={)_q4|DVJ9TXE38(^mhV$YJ5ggP8FVOTd;2V+BNd+K#D1xfzDF z6Dn$!ho)sURliKxO_z1OmBlwc>@S%%lf9sI!(HFhS8Q^i4|-frnmHwY8+1H5%az3G zh*8W!H6*QhG=><^Kwrve3U&nv;dYw6tLwdM^hMo&>}8>^x1+U%!erZgUOHSt9UhYl zsmFzrdy?y+V#{;K>m9lL;YV7hHO95Bew;%Q=(=4wkyX9I38>g_&(!M`&a%sBu`7aN z2z%MS+e))$JX2~~qY%YVWD0;!`7R9*`=oU~oF;qjfHetT=7p2Xsd80`7A@WtzUsd} zoEo_Q)mU`)5=-D?M$kUkz-u_+-v>H_qP`7);WNP4W<ht~oMr%mQYh;q!)B~4HU=Ld-E)N4<~ zC&C|i(9jWT0}+|Yv1%(Qv_T_rWGf+x*wBV2)HY32&PVtU7bbtYN7z`skD;=K>$Xsp zAJZjza%*^Vqt(!yj4L#JCr>gj#@EQ1!^;k6Gie1q(}>DqVRC#a9&dyA!4)j-=q{7$ z1HXXP8-dNgmJ)3pWT=DX=;K6ATF(>pP-Ubpj&w)7>qlIJ*~2XLKFj0Na5Lpxos=3a zspP;DbaQE~Y14)%|Jl<(`@Z2a`Ezo<7n~Q1egp2&1?xCGD?3C5a8zAwr$L5^TAK7M zf?N^R*<9c(X~GGssl40x?rHed+M}5}2!=8B0J(iab5A$7Yk(K%9_i57!%c3^2;3fF zo^f!tpDnZ?hh@K6nrM!kImkM2N_KlVY$Qg!%asR-sW(?)avuVtaxN;hG^1?#9qNxR z7qwQpQRE5YQJQ2I^MzZev~fkYMQ@>_qxQ@ml+x#_wZDtj>wo)J`Hp3IFA~` zgSFdCFmOY5FplsGg>}*a$ZZ-v5mwExU1;N84rFRIZK(B%=o7~qIDeL-{92LbZDR2g zR&{lb)Q|UmU8y|KUoShHFF}WQzt#K2a*JHp)^NI#DD(~}p%qZ!ol3^-VT!c-CGP%3fCuTO zx%*oOCsS}N#a{N>)GfqgJ5hbL=-P~)rsxN|y>B^EK*hc(#v29!%s^sB$`xJG(!q(S zTT%PwqyYJD&5wROQ@?0-2!UBcxsOXDM#CoRQK=Xuqp>d{qWkOHX=6I3ZZzU-s4DV6 zL%YI*M8jlm7^(6akxZMKpSWac-d3%2Kg)XQX;a*n7q@_bLFvNAkuaml^P*?Ps(K_fDLbn^ zr5Kr;pnZs`#vElz4XNmztBj-!aA7PyuUpf94_3qD_fWG9Z+rabo5($+^z>DakRsAy zmv$W!xwM<@Zt!wk?H(r5vL37epD~8hA@P2ee3(q#i&rLeEFfT#G1)SzifsKMylzG$ z)z7*2#M)w!KA8oku46gBP8R8E`Ry3I>2Y<11`bg{J0IH9FI z1u`b-yW}T&eTK*dWA)DJi;7WHW!BX-qCKHaA7y?eic@*wiS z%IO+N2PBq%kr$i!(Njd;B2=?~KX`g~2&F+ZQQd9&JQI$0vUQtpY(aBiY^pwW?-JAt zvg&+VR@uKUjTifZN_%eqhGtL}5w$z>8TkzO_I7y>3U=Unk=gpYa_U_3rl%1TcjCpr z^SsDBS;hVQq0|3r@5|$%Zri@eC6y#4M41*vwyA7on^sF=EJcW^B#kviwlQNVL`*4! ziyzAFen+ zuoq6;ObdVW!s|i$q=)AI?&J>@c|n$8rFx%aZLdid2K*L@yc2OQOY{Qv@NrJTLT>cF zK1)`A1*Bb5ctV-9qvC+}Ab}J@lyumyS7Wj0A?#{SoKWdr7R5eQwDR_3T(wCP`y7vUlP4T z85Q)sgZ!a*zL_#fWCqByRtW0bEr(J2;}Vi1wOJh<2iuqKE|ptQEn4p5dM%CfWUMCybvzXo${ik z!(G?(*sMgy@cKUaXQ>A9g{?f3FaBIwnOrgcgTrGjiz|}_Tievi@h_E?`Vcov34n(+ z3I170khD32Q1s%KV{-9kmn z9i-lKIkLwN!=3g$8Bu>5X@_(a4O}j8vVi%CYdUc=Je6wm^L(YDLES4JXqn=2y(zm0 zVmGn=8*5b0YtMD-LzW{++tokM^P%lMd#*Cym6;9U_7SEkHqmjf=}>d};bi^6sd)3@ z@>aWeeJAz)iMXHya!)Z$Ifjzud^=I5INQl-PL6zXx2U|epJq2RK@l3Fxr-K4GsjC$ zBw2J!E0X+7#ImGE&22jtnHDY~!VBMfzfR7B+@QVr_ybFem*& ztJuekpRJG`2iFRxL0m|W3iUdH)sk|pd(qrkbiTU-@uETHnFUW-+zD5?fj2?R(c0f$ zd=qGR^6blgY`@)~W7~sspcirGlF15;oAojn555!^NO6|7-R}Dq+ERKePs*;Uu`hMx zgX-Wuk7T>^a<9>Im*E^l=LolI$ys!rttB}Cr!9Fo{`%9XH7&lLFN2AHF@V@-J^SzxnYNo@6D6nS8K!UZ9H6#e&}gg!%{1t z+op{_gz+&v>?rHdC(-<5tPrvdrT@g;EZ$Hr!Op5vw(P8PSvvIu230-{x{hMSo_N%S{(SO{+3X0nR7;DnwkGb_XBw z)AalQU1R^3b&UmMTySByovfXV!>vl##}C(*#=_nC_l*m67kY1PuPsu&m>h4|^SX@H zom*b$VD7eV7xv{m(pC1O)-x**()i4eQOxS0edsykPhAxdbURGQS;?oE!R_uaD1uTN zbW$@2yF&9f&v6T?=wyhwImwo(-_~(q3|yMMA2MvPKL(OcD#F*nLowSb#63j;Hpyb4 zF}w z#)w|>jnYur4Qh4rzavcBhdSKow$wD{)8}UuO@)QqR)tskK0uXY9Wc_oDIqhdkYh>w zuQ7J`5HP&?2)$P_01cg7i(0Bne=JCkRMS5U53Gz9R$gFm(c%X-S;)*nTK# zB$8E6>%LeN)G}f}&XPlSB*Lijc$z)Qpj}bBoxz`U4RJTxLlhC>qQnQEd0?rv*3-90 z&|O?r{M<)5f$Jd%zCq88;Y8CLs^zM= z-XX_0jg?2)jPv3JL%xVA+@7Tt9t8aL)GeKYu$|88rz`qAYgN2aV{W3iPky|ftM%I# zK1Eh5e*Y4VU(p+0Hy7ls^~r%8zxPcAsMz~0I>sAi;nk_+WYO3vvdvOALBsaGV(e|L z6MnVZ)`kXiYO!M9(M{1mID{F#zF?ZWrlggmVfXYL19}tr#=`2F*ptH_3!V`!(E3)l zah64&$lX~QHS~<%8k8nFQJ~`BD`NI13e&jh8tqzcK|XE&a{Oz13%)Q1<>lq6w{_gn zZ`7x&9@>T?4|xQt}vcmRR06xo5+SYqPDJ)h}x}#D2GdT?PzV1pKmCtT@o?bKr<7b@4x1zWJ$_vgI zPvc8#2$56Q&$&AvZl;4A4WD*PS1!7TsQePz(_{J|HO@=&tGd7$$Op-dvrgwHh8Oyt zCuX^r_N^!zwf$4>N2()nE3Ghns9d-qE@3WIZdBDY>-BY6QT>SLUN*MFh=J>B{CO6R zp$^YPxaMaeDPQgju0>)rIyn;lz^*$rqIeN>ijd}F7D7`A_visR0 zjEMK?#o47*JufCT1*qlBHj@WF$v*z z`ygK-Nh6kXr$sUPtRDlc=){yw{ongfHi?GJ-f)S&7BL;AzKh$vg1^j3yINBO@0sjB zhf+%&$X6ae9B{PwLt#`((242`kH6FhK0YJp_P_0l;+n%$;#RlOAhGT(s2OYT-6}KGx5j^qn_-=8Pl#Ds9ah}5$jvW zp$MRmc6!_2ilK&UD-C%R)~)Fs6szFyiakX&35YtO68EKq{_f|V=x%ezB`05~{4Hhg zXO_BUwU!sPuN}GjY#1id!$pNqV09OZsQu`}T}v~U9T53o9-Nwb#jy|O@(1(FI^4b7 zoA^#=%N+#Cf?0CGwP8Q!K+av)Pqd`6dSD`&hdd$m`0a9NanEqKW@*-!DMRJLK7-iI z8j6!HRI-ru**tqD`$$Nt!23G4vCy%13QkIu00f|y##^h*5*0t$3BC-8H2SWe_4KHT z?kS0W{Ki5rxhfM`Qc%ZCOkm=iTtrDo6T(v8TKl8zWUKvP#+H9675oW;{Ldj2 zoPRA9y!#i}3Jx?HjDLv14l%PUWRU0s-Kfh%-a;o+k$mR4tr)U+2gUN$iyCaYO7B&H zxq}N^?vA}^fhjCRqS5r#AzZkHN4-m!kSc#jnU5`b-RD%@S5d3{ob+*)sPb~wj*PU= zg}b&m-~NP*%Dxq8Zm?~JE2j;^S0U>;XUNRbJmv|lwLTJo;YQ;7sOERgMDN5n2!X-% zuWq%CiN1VDBYo@p-FY_5$5mQK%c+yonwv%%>Z!-@F>cY*$OByUEopa^A2!B^(0$B+7HMlloAU4{ls>LC0KHOf?cY2X9u zAhKeF?4Fg7>~#Un5kZ7+N$QdC#Y=teO-d z5&kTsIGlI8*>~cp&Vv1rDwcGY;^Tpgi8b+b_glZAU4@SmKGTke1W5E%DpzlDyb+*) zIEelVIvbrR2o97^e66)aSY6zkK#f|KVApVmThrdTM15)CAq_tUko1ZQ3rehxE*W>9 z7d(2qQtu6tj{~I!Kp^OJ_nUl0p=gPg)P@Y?N%|#SCp*_n)Wx{T0hAuODR#&2qO;YF z;zP~}M+rXn@DjmXunZDsnMpQ1kw7`vV{up+J2YUXTPR>rV{hC?6xpJCK`PNPxp(Eu zdIHwi74b?Ll8!1z7%twftVj47L$uiz^2@_nE+!3v;s(!!e zC8!p1Qvc|j?x=)LVr-#ZC51Xw9BlMTN0y*U%&}Jq-uwa6$6&18cpWOm@t^+u zTkq1e`@cdeXF~R2>LAVAEMeNK;+S<%LETv9$;&D)fHF_P5%3~Vkhlq)nRTeD|M_pK zxY`WXY0SiBL;7Ks2uo-8KkE5jF2XYbI{$?~BSIu4WBv^KV8DXW`Ip|L|Izluq5hX5 zKOOI!o;A^@zN2dZbDH9(xu038DNCOs3;U~cy+@s<^82$6({rxVgI{|(=&`RYGq*q0 zb-yb)1$BEMj(e+AKJY$NB5};|keEAk^r>0!B))Lvkz&q12LRZPKEi5wm`5*#e{7#s zznXQ9wXIWK@;#}~{E2+wq)Ph}3Dv8UN(K3AHsD+=6v z01}b|?KwjZQ0w>ww`)mFPP(Rg#TB4EfvIO2%?&{eeOK{34I{M9hf{ zi`Bx8AR%QpalWL6DuVJ5fA?@O^i2d`f&gmEPjH4oA}| zuKX0!YYEXiPh2-Cq_Scq z!XW+(C13JZ+v1mJkx6H1{L?Pvt?k`*eP82}a|=fTr5dv#IePrN>*(f0 zUI0{&I`Mj38AHvtrNaEM3<+=X(lp;JH{C4REX&%83;PJ=VZHD-QQJL0YtI{dOg^-7 zosXy1diw|Z{k5K&0eB1i3hrV)7&4>z1;VizFA6k=JKIA!}hdYU!SW4D^A@}*=>Jm zN1(jOMVU`^o*uxdIzTxmK`B;#xHW$e27;0y(@_UA>Dh9;=V`)$L-d13AHV7QvK(Y3 ztp6dpe#oFFN%!~b7g4gkLx(6jjRfl)*L5VTDQ?fm0GZCOk=yRJH$S#O4gQ{<$!Y_!^&ZhH3ch4VdLsVEFH0pxsRS1JGnjEaA zz5Jo9pEI?W zOPS$IE?Ye9EW-vzaYA9QC(O|M_1 zm3~b~Q{aO^l@RoA6T}^K+jk5xy3LLh9|~TOo_AHXB|=?}tOgStZ||)-GMX+Qx@Pb^ zb-X*zp3_uH_yVgXPnxS=O~=|#m5zpadQ^2MipJM!a#7u}!36+wYko@WW7{HWGqSty zdd1Elih~Y!_;8^|%C$~Zx<{Ae`}pbkD09j0byMRmy<^Max%73ihJzKH7eSXaZ5=8s zDQhiAI1kWngBq^pfnZCkB6>l)xHMk?VV+!kx7$Qf%Jq;8s$jku3o`Y+0qf>e=jRks zz(e$*GTNQw>?xOb^uQ`jQII_x6bl=GuZuFQ2JBzhw@<(`1{(M6zL=`sHV|uYxVISk zkzo%YP4K-cmUNrfbThKuh|?jH_lPW7K|fajB$>30Zf%6mqRXo0?w@tc&*^XgYDC^=ngp|PPHsf zIrsLF`E2sb+FiOSi33g}Pm1ak#AOyE4M^C6htR@k; z!}0LK=W@w%3nEFT0$P@lnF`JKF`_y7SqfzBh@7Qnne_*{1+Ce(_;z&rGS0afBuDohX|R2&F=w~LF;f7D6FZ$J!Nrvl;#Ci2_*`3D?#!a27M*# zyc6FINky}KG`I^a-+eBCZ0nu0@O{%VBg1PMKEGQmdxy*-hcB50I))D-wy;_?C0|@( zCRgma`@&P3JYLZ4CRVJ76ZgcEqk6)eU)06KcqqqtJa#HGLpn&)bzKf^8gKHD(tFGJ z{yJ3qfZ^u3=_;BrBm%N^4(0OxyzP6>6ur)+jK%WZ7F6E|f5}Hnr)I22`Gha;D*qaz z>+)*I_m+T@Ty>s;R!S%p=8xIOI6JggRu;7T>kCoe2bFk7#+Kp$ZPDeXB0d@9DJ zIJ0(}d?S}^tBFy;01eyN=!I_&!zO!^GdJ8F>drc3#$KK{_#JdorTj~=-hb3d z#b}`S4uNdoj*7!5+fKKZ{S5WORwp+&pS`KgRjT+CClB%`cZVP=7fjIJLtQu?BlPEZ{cXjaIltnQ6mZqeJ`peWj%Yl zv|}{#)DkaphJ3_v*15TCx0;k>Q!@%d8(Yq8SIiMdJ)jClpm%#h>#apv=kmk(v~s9x zL-jCZqD)u*ht7fojr{Vn>gEn_MrJLl>yO=O7d%;7eZOlZtGxLoB#$zM;h$0G;BE*! zR8lmrE+ZdL7HiVUO5JrXanFYWhYqI^*;c~cH@gp_2zyLrrMMme7m#JTUXS5-a}m1R z$4v^G!`L;$YKvGWJMvqm)nc>c)i1YNB85tn$|8HOA@zCBdVjbu^U)@x5xZx3>(9zP zG1M0Ni!^{ZiS;W8!*A(DYRYz3YT(q?PY6LexRtfgFtbC<%l*x zDH>fp@hU>IaRXsuoO6r~$9Ie$0}A);jW@vj{uml_W*;uX9U%2p5v4ox-}t-B$nl#L ze{e|CE)sSn=(Kt@9+tSTJ?hjSc`^kX^=gwo+JvFT%w(KRo5XD|#~621S>a<7Y%(y?8AT6$_>DrS~%({CL1x&Pjl@582R+ZcGNWSA1uM4PVQkwh08 ztNw;;ERa+-(Hb2iW1ThnT{1-e45o|ix)n07jq>@yaRU@@wl`f`R{a;e^Q-(3Fba0`u^cXifrT*vK*TUn z9rQ?9_rh+sY8FBM`LJ+2ln${lO38nP$%0^XOWZynW{dGh$7oG?G#HZ0zrDq^uZ7bBN3k2 z{q3;lcRc$H(}Gy~hCLPB3^qbl))eTSaPyflsTFnfwtnX>al~S@Tj5c4@|95cZF`(; zuKq5yZ6AkBcey6G)1Lt!ic){>b|x7SAE zE;*DZKCsO1eHk$FG_~TsfjttRhpEy(w3?GY$1%QKbkfrT!~L}_HQ+QuMJ?uqe&Qk4 z^|n}!XKESl_e7Mn9Qw7dg5f9jXII#x{0cZw4%z4$+;2;80lKishgQdYIj*V|74Ju^ zy&cm@Lc|03V(3WoJ1d+EbHA-Qu8mp1Z^59!?@Bq7H~ICpIlYnx$s(W?DP0@kB#+(7pHC z%5qbKlkt7<@%lG@p!RClx}BEee>~%s&y$+?(w)kEhVRg!l5;>^+3;{_dx>khm(#vZH+J-hguC85+Y+(Ud!De33O1<9K%GE46a z?_c^q{-qm)^Ji|_ixh$uWN6Z0VTy3EsS44LohW^BL-=C&C8v>@w5NIJRbGmmmuMAo zIb<$Clxwh&H}Kv0$Bj;Bz;Y7*xs^vHjjmE7s_|459h1^`?faRP=KTpJUJnTcx)MIi zo-tcSCq|y9$)@JoBo>TC!}0)3)4kb=b7ZVPR9(`2@Cifh4slOeUSY>* zo0+#cGrEiCx!~QW>dAXo{hz)QKGN8zL`?s|0s2=zwnKgnr{ii~hJB+IfkhJ=hw^hlIS zc>SceF;pQ}IcLv=!wSHkxRqGW(~6Pi7|ljWk_qGaVGaZG#929BV=EI~;R9bC-M3h1 zN6ZS{|C)DL|7g#*k?m(rWoquEYK9Hw&~*q}!W{G$*5$MvDPxVJc82AIF_B_1n^mo@ z87se^@NX~OFz>+fM*rS&>^}7Gh)eBQ8WPj<860-8j9tK~;E$q3e?6`3ndVNE0=^r? zo9X#-%3^c;8-6gNqWOh!=gf?#fKx_)ezWwKFGfb3x8Tkfef_D{dZ*Q0Qp+FD6sFxp z9VEB$F@F!R)JwDSHES+>iTYSwXV5D=;<#^@%nuyNi(Nx92ju5Xmd||0TakR~WAjl}g(5pZ>6?!R@814YjH! z?8JVX2lL@7q`*+6C-fo&m^$`=hOH%v;GGmKK7dedxhP|walVl~X;<0a6q1zg^C3+% z4&&~ucTD<-e6hQ++Wr3hmm5x0+Ai8|F>SE9SFCFMwl7`uRp#ROITKgo$Vaw{!$W(O z1gGO$zZG1(6mIcRzdqq~XQXApmQRW~wmx$5-Dxeoh@CaQ+fP4i)7mR?d@Q-ycRNY2j5iR>#hr4Yu=c_#V7)n&Ier$B)g)ohTYU=@ zm8YnS>GS|SpY`Ht5~3%c_P%Lvw9Zgog3G~
    + +
    +

    +dft_scan_ready +

    +
      +
    • Run the dft_scan_ready goal.
    • +
    • A flip-flop is considered as scannable if during scanshift:
    • +
        +
      • Its clock can be controlled by a testclock (checked by DFT rule Clock_11) and
      • +
      • Its set and reset pins (if any) are forced inactive (checked by DFT rule Async_07)
      • +
      +
    • These two rules may be violated either because test logic has not yet been designed in or because the constraint file has missing or incorrect entries. If there are violations of either rule, then diagnostic rules Diagnose_testclock and Diagnose_testmode can be used to diagnose the cause.
    • +
    • Any non-scannable flip-flop will reduce the coverage for logic that only feeds that flip-flop as well as logic that is only driven by that flip-flop.
    • +
    • The dft_scan_ready goal also checks that testmode signals that only control asynchronous set or reset pins should be unrestricted during capture. (checked by DFT rule Async_08)
    • +
        +
      • Restricting such a dedicated signal would result in the set/reset nets not being tested thoroughly.
      • +
      • Such a violation can be fixed by adding the -scanshift argument to the test_mode constraint to indicate that the constraint only applies during shifting and is a don't care otherwise.
      • +
      +
    +

    +Clock_11 Debug +

    +

    +Clock_11 violations detect clock sources (see the description of Clock_11 in the SpyGlass DFT User Guide section on Clock Rules) that are not controlled by test clocks. Each violation indicates the number of flip-flops clocked by this source. Selecting any violation will highlight the source on the schematic. Following is an example shown in the Incremental Schematic. +

    +

    +

    +

    + +

    +

    +The testclock propagation through the 'Show Case Analysis' mechanism appears automatically in the schematic. +

    +

    +You will realize that the testclock propagation stops somewhere in the design: +

    +

    +

    +

    + +

    +

    +In this example it is clear that the other input of the AND gate should be held at '1' to enable the clock to pass through. The designer applies a 'test_mode' constraint to rectify the situation. +

    +

    +Async_07 Debug +

    +

    +Async_07 violations detect async sources (see the description of Async_07 in the SpyGlass DFT User Guide section on Asynchronous Rules) that are not rendered inactive during scanshift. +

    +
      +
    • Select a violation and display in the MS.
    • +
    • The testmode value propagation appears automatically on the schematic.
    • +
    • Visually find out the root cause why the async source of the flip-flops is held at 'X' or at the active value. This will lead to the conclusion about how possibly a test_mode constraint can be applied to rectify the Async_07 violation.
    • +
    +

    +In the example below, the schematic shows no constraint was applied on the rst input pin of the design: +

    +

    +

    +

    + +

    +

    +Viewing the estimate of fault coverage of the design +

    +

    +The rule Info_coverage estimates the fault/test coverage of the design. The generated reports help in understanding the test health of the design. The following fault browser helps understand the relative testability scores achieved in the design. +

    +

    +

    +

    + +

    +

    +The following summary reported generated at this stage helps understand the fault status. +

    +

    +

    +

    + +

    +

    +One may also, optionally, generate a detailed fault report, similar to ATPG, as follows. This report generation is under the control of a switch. Enable this by specifying the following parameter: +

    +

    +set_parameter dftGenerateStuckAtFaultReport all +

    +

    +

    +

    + +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready_setup.sgs new file mode 100644 index 0000000..3e533ac --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready_setup.sgs @@ -0,0 +1,5 @@ +set_property -step_header "Testclocks for scan" +set_constraints -constraints {clock test_mode} -html $SPYGLASS_HOME/.Methodology/DFT/doc/DFT3121.htm +##### +set_property -step_header "Asynchronous sets and resets for scan" +set_constraints -constraints {test_mode} -html $SPYGLASS_HOME/.Methodology/DFT/doc/DFT3122.htm diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/.submethodology_help new file mode 100644 index 0000000..8217a1b --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/.submethodology_help @@ -0,0 +1,23 @@ +lint_rtl + This goal checks; + - Basic connectivity issues in the design, such as floating input, width mismatch, etc. + - Simulation issues such as incomplete sensitivity list, incorrect use of blocking/non-blocking + assignments, potential functional errors possible simulation hang cases, and simulation race cases + - Structural issues in the design that affect the post-implementation functionality or + performance of the design. Examples include multiple drivers, high fan-in mux, and + synchronous/asynchronous use of resets. + - Synthesizable constructs in the design and code which can cause RTL vs. gate simulation mismatch. + + Ideally this goal should be run before checking in new RTL changes. + +design_audit (Optional) + This goal provides design audit information. The aim of this goal is to gather statistics + of the design. These may include information on the Top level design, Black/Gray Boxes, + Parameters/Generics etc, and information on the design size, control signals etc. + +clock_reset_integrity +The aim of this goal is to check the integrity of clock and reset architecture in the design. +Such as the following; + * Possible race condition between clock and enable of FFs + * Complex Issues like Gated Clock or deep ripple clock divider + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/design_audit.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/design_audit.spq new file mode 100644 index 0000000..d6a57dd --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/design_audit.spq @@ -0,0 +1,126 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : design_audit +// Version: 2.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.1.0 31-May-2013 5.1 Removed Following Rules: +// Audit2Stats2 +// Added following Rules: +// Audit2Stats3 +// 2.0.0 30-May-2014 5.3 Guidware 2.0 Content Consistency +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +lint/design_audit +* +Reports informational data related to design + +* +This goal helps in profiling the block, as well as gathering some useful +statistics for the design. It may not be needed when RTL is still being actively +coded. However, when RTL is somewhat complete, this information is useful to get +an overall profile of the design. +In later stages of RTL development, a sudden change in design characteristics +(say, number of FFs) may point to unintended or non-optimal bug-fix. This +goal should be run once per week. + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=Audits,area,erc,clock-reset,spyglass,starc,lint,morelint + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-sel_case_analysis_mode="direct" + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Audit2Stats7a // Gives the libraries that are declared but not used in the design unit +-overloadrules Audit2Stats7a+severity=Info + +-rules Audit2ID // Gathers stats for design. Do not select this rule directly +-overloadrules Audit2ID+severity=Data + +-rules Audit2Stats // Evaluates the number of input, output and inout ports in a module +-overloadrules Audit2Stats+severity=Data + +-rules Audit2Stats3 // Evaluates the sum total of each of one-dimensional and multi-dimensionalbuses used in a design on rtl level +-overloadrules Audit2Stats3+severity=Data + +-rules Audit2Stats4 // Dumps the generic used per entity. +-overloadrules Audit2Stats4+severity=Info + +-rules Audit2Stats7b // Gives all the libraries declared for entity and architecture. +-overloadrules Audit2Stats7b+severity=Info + +-rules Audit2Stats8 // Evaluates the number of times each blackbox is instantiated. +-overloadrules Audit2Stats8+severity=Info + +-rules Audit4ID // Gathers stats for design. Do not select this rule directly +-overloadrules Audit4ID+severity=Data + +-rules DirectiveCheck-ML // Rule dumps information about ifdef, undef and include directives used in design +-overloadrules DirectiveCheck-ML+severity=Data + +-rules PragmaComments-ML // Pragma Comments have been detected. +-overloadrules PragmaComments-ML+severity=Data + +-rules STARC-1.6.6.3 // Do not directly instantiate cells in the design +-overloadrules STARC-1.6.6.3+severity=Info + +-rules Audit2Stats5 // Dumps the data regarding line of codes, lines of comment, per architecture. +-overloadrules Audit2Stats5+severity=Data + +-rules Audit2Stats6 // Dumps the data regarding line of codes, lines of comment, for entire design +-overloadrules Audit2Stats6+severity=Data + +-rules Audit2FileNameDump // Dumps the information regarding which module is defined in which file. +-overloadrules Audit2FileNameDump+severity=Data + +-rules ReportPortInfo-ML // Generate a report of all ports of top level block and black-box instances. +-overloadrules ReportPortInfo-ML+severity=Data + +-rules RegInputOutput-ML // Module output and input port should be registered +-overloadrules RegInputOutput-ML+severity=Data +-chkTopModule="yes" // Rule checkign will be done only for top module + +-rules W438 // Tri-state used below top-level of design +-overloadrules W438+severity=Info + +-rules GateCount // Reports Gate count and Instance Count for the complete hierarchy of design +-overloadrules GateCount+severity=Data +-rptallmodulegatecount="yes" // This parameter helps user to dump gate count of all modules in vdb file. + +-rules Audit4Dump // Dumps the information regarding number of flip-flops, latches and tristates(evaluated in rule Audit4count) on stdout. +-overloadrules Audit4Dump+severity=Data + +-rules AuditReportCell // Dumps the information regarding library cells + +-rules listTristateBuses // List all tristate busses used in the design. + +-rules Clock_info01 // Reports likely clock signals + +-rules Reset_info01 // Reports likely asynchronous and synchronous preset and clear signals + +-rules Setup_clock01 // Generates information needed for Clock Setup + +-rules Audit4Count // Evaluates the number of Flip-flops, latches and tristates in a moduleThis is done on flat level netlist +-overloadrules Audit4Count+severity=Data diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/design_audit_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/design_audit_debug_help.htm new file mode 100644 index 0000000..d6817e4 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/design_audit_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + block_profile + + + + + + + + + + + + + +
    + +
    +

    +block_profile +

    +

    +This goal helps in profiling the block, as well as gathering some useful statistics for the design. It may not be needed when RTL is still being actively coded. However, when RTL is somewhat complete, this information is useful to get an overall profile of the design. In later stages of RTL development, a sudden change in design characteristics (say, number of FFs) may point to unintended or non-optimal bug-fix. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_abstract.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_abstract.spq new file mode 100644 index 0000000..a1f85c7 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_abstract.spq @@ -0,0 +1,46 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : lint_abstract +// Version: 2.0.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// 2.0.0 30-May-2014 5.3 Guidware 2.0 Content Consistency +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +lint_abstract +* +Generates relevant base policy(lint) constraints for block abstraction +* +This goal helps in generating an abstracted model of a block. The abstracted +model will be used during SoC-level validation and verification. + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=lint + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-block_abstract +-rules LINT_abstract01 // Generates relevant base policy constraints for block abstraction diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_abstract_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_abstract_debug_help.htm new file mode 100644 index 0000000..d5377b8 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_abstract_debug_help.htm @@ -0,0 +1,69 @@ + + + + + + + + + + lint_abstract + + + + + + + + + + + + + +
    + +
    +

    +lint_abstract +

    +

    +The aim of this goal is to generate abstract model of a block. This goal reports an informational message by rule LINT_abstract01, which points to the SGDC file containing abstract model. + +

    +

    +Use generated abstract models of blocks at SoC level for lint verification and abstraction validation checks. You can provide the generated abstract model just with the RTL interface of blocks, without full definitions of blocks. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_functional_rtl.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_functional_rtl.spq new file mode 100644 index 0000000..c33863c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_functional_rtl.spq @@ -0,0 +1,81 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : lint_functional_rtl +// Version: 5.6.1 +// +// Revision History: +// Ver Date Comments +// 1.0.0 26-Nov-2014 Initial version +// 5.4.1 04-Mar-2015 Made following changes +// Removed arg: +syntharg -ignoreHanginFF +// Added use_inferred_clocks & use_inferred_resets +// +// 5.5.0 16-Apr-2015 Added Av_signed_unsigned_mismatch and Av_width_mismatch_expr +// +// 5.6.0 18-Nov-2015 5.6 Added Following Rules +// Rule Name Policy GW Type +// =============================================== +// Av_width_mismatch_expr02 auto-verify MUST +// Av_width_mismatch_expr03 auto-verify MUST +// Av_dontcare_mismatch auto-verify MUST +// Av_case_default_missing auto-verify MUST +// Av_case_default_redundant auto-verify MUST +// +// 5.6.1 29-Mar-2015 Removed use_inferred_resets & use_inferred_clocks +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +lint_functional_rtl mixed +* +Helps identify width related issues in assignment, case expression-select, instance +port connection and function arguments using functional analysis +* +This goal uses functional analysis to identify width related issues in the design. +=cut++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ +-policies=auto-verify + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ +-nocheckoverflow='yes' // Width will be calculated as per LRM rather best fit. + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ +-rule=Av_Info_Case_Analysis // Highlights case-analysis settings + +-rule=Av_width_mismatch_assign // LHS width is less than RHS width of assignment (Truncation) + +-rule=Av_width_mismatch_case // Case expression width does not match case select expression width + +-rule=Av_width_mismatch_port // Instance port connection has different width compared to the port definition + +-rule=Av_width_mismatch_function // Bit-width of function call arguments must match bit-width of the corresponding function definition arguments + +// Do not mix signed & unsigned variables/constants in expressions, assignment statements or in comparisons +-rule=Av_signed_unsigned_mismatch + +//Bit-width of operands of a logical operator must match +-rule=Av_width_mismatch_expr + +-rule=Av_case_default_missing // A case statement(or selected signal assignment) does not have a default clause + +-rule=Av_width_mismatch_expr03 // Unequal length in arithmetic comparison operator + +-rule=Av_width_mismatch_expr02 // Unequal length operands in bit wise logical/arithmetic/relational operator + +-rule=Av_dontcare_mismatch // Use of don't-care except in case labels may lead to simulation/synthesis mismatch + +-rules Av_case_default_redundant // A case statement marked full_case or a priority/unique case statement have a default clause. + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl.spq new file mode 100644 index 0000000..ea8301f --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl.spq @@ -0,0 +1,611 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : lint_rtl +// Version: 5.6.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.1.0 31-May-2013 5.1 Severity of following rules changed to Data: +// PragmaComments-ML +// ReportPortInfo-ML +// RegInputOutput-ML +// 2.0.0 30-May-2014 5.3 Guidware 2.0 Content Consistency +// 2.1.0 30-Sep-2014 5.4 Removed rule ArrayEnumIndex +// 5.4.1 26-Feb-2015 5.4.1 Added enable_fast_traversal switch for better performance of synthesis based rules. +// +// 5.6.0 18-Nov-2015 5.6 Added Following Rules +// Rule Name Policy GW Type +// =============================================== +// STARC05-2.10.1.4a starc2005 MUST +// STARC05-2.10.1.4b starc2005 MUST +// W156 lint MUST +// STARC05-2.3.3.1 starc2005 MUST +// W415a lint OPTIONAL +// W287b lint OPTIONAL +// W224 lint OPTIONAL +// W287a lint OPTIONAL +// W528 lint OPTIONAL +// mixedsenselist lint OPTIONAL +// W339a lint OPTIONAL +// STARC05-2.10.3.2a starc2005 OPTIONAL +// Removed Following Rules +// Rule Name Policy GW Type +// =============================================== +// DuplicateCaseLabel-ML morelint MUST +// STARC05-2.3.4.2 starc2005 OPTIONAL +// +// 2018.09 10-Sep-2018 2018.09 Added Following Rules +// Rule Name Policy GW Type +// =============================================== +// NoFeedThrus-ML morelint MUST +// STARC05-2.8.3.3 starc2005 MUST +// UndrivenOutTermNLoaded-ML morelint MUST +// UndrivenOutPort-ML morelint MUST +// W146 lint MUST +// W188 lint MUST +// W401 lint MUST +// W402b lint MUST +// W468 lint MUST +// W527 lint MUST +// W576 lint MUST +// CheckShiftOperator-ML morelint OPTIONAL +// HangingInstOutput-ML morelint OPTIONAL +// ResetFlop-ML morelint OPTIONAL +// SelfDeterminedExpr-ML morelint OPTIONAL +// UndrivenNet-ML morelint OPTIONAL +// UnrecSynthDir-ML morelint OPTIONAL +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +lint_rtl +* +Checks the design for basic Connectivity issues +Checks the design for basic Simulation issues +Checks the design for recommended design practices and Structural issues +Checks the design for basic Synthesis issues + +* +This goal checks basic connectivity issues in the design, such as floating +input, width mismatch, etc. These checks should be run after every change in +RTL code prior to code check-in. +This goal checks simulation issues in the design, such as + - incomplete sensitivity list + - incorrect use of blocking/ non-blocking assignments + - potential functional errors + - possible simulation hang cases, and + - simulation race cases +These checks should be run, and reported messages should be reviewed prior to +all simulation runs. +This goal identifies the structural issues in the design that affect the +post-implementation functionality or performance of the design. Examples include +multiple drivers, high fan-in mux, and synchronous/asynchronous use of resets. +These checks should be run once every week and before handoff to implementation. +This goal reports unsynthesizable constructs in the design and code which can +cause RTL vs. gate simulation mismatch. These checks should be run twice a week, +and before handoff to synthesis team. + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=openmore,starc,starc2005,erc,simulation,lint,latch,spyglass,morelint,timing + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ +-enable_fast_traversal + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-strict=W342,W343 // Rules will do strict checking +-new_flow_width='yes' // Enable all nex fixes made in width rules +-nocheckoverflow='yes' // Width will be calculated as per LRM rather best fit. +-report_inferred_cell="yes" // if parameter set to "yes" then rules will flag for only inferred flops and not for instantiated flops. + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +//-rules AllocExpr // Allocator expression may not be synthesizable + +-rules badimplicitSM1 // Unsynthesizable modeling style for a sequential logic. Clock and reset cannot be inferred + +-rules badimplicitSM2 // Unsynthesizable implicit sequential logic: states can only be updated on same clock phase + +-rules badimplicitSM4 // Unsynthesizable implicit sequential logic: event control expression may not have more than one edge + +-rules BlockHeader // PORT/GENERIC used in block statement header may be unsynthesizable + +-rules bothedges // Both edges of the same variable are not allowed in the event control list + +//-rules DisconnSpec // Disconnect specification is ignored by synthesis tools. + +//-rules ForLoopWait // WAIT statements used inside a FOR-loop may be unsynthesizable + +//-rules IncompleteType // Incomplete type declaration may not be synthesizable + +//-rules Info_Case_Analysis // Highlights case-analysis settings + +//-rules IntGeneric // Non-integer type used in the declaration of a generic may be unsynthesizable + +//-rules LinkagePort // Linkage port may not be synthesizable + +//-rules LoopBound // For loop range bounds should either be locally static or globally static +//-rules NoTimeOut // Timeout expression in wait statement may not be synthesizable + +//-rules PortType // Port of unconstrained type detected. This may not be synthesizable + +//-rules PreDefAttr // Use of certain pre-defined attributes may not be synthesizable + +//-rules ResFunction // Resolution functions may not be synthesizable + +-rules STARC05-2.1.6.5 // For an array index x and z should not be used +-overloadrules STARC05-2.1.6.5+severity=Warning + +-rules STARC05-2.3.1.2c // Do not use unsynthesizable User-Defined Primitives (UDPs). +-overloadrules STARC05-2.3.1.2c+severity=Error + +//-rules UserDefAttr // Use of user-defined attribute may not be synthesizable + +//-rules W182g // tri0 declarations may not be synthesizable + +//-rules W182h // tri1 declarations are not synthesizable + +//-rules W182k // trireg declarations are not synthesizable + +//-rules W182n // Switches such as cmos, pmos & nmos are not synthesizable + +-rules W421 // Always block/process does not have event control +-overloadrules W421+severity=Error + +-rules W442a // Reset sequence may not be synthesizable. First statement in block mustbe an if statement + +-rules W442b // Reset sequence may not be synthesizable. The reset condition is too complex + +-rules W442c // Reset sequence may not be synthesizable. Reset can only be modified by! or ~ in the if condition + +-rules W442f // The specified reset sequence may not be synthesizable. Only binary operators that canbe used in 'if' are '==' and '!=' + +//-rules SignedUnsignedExpr-ML // Do not mix signed & unsigned variables/constants in expressions, assignment statements or in comparisons. + +//-rules sim_race01 // Assignment and use of signal in same simulation cycle (Read-Write Race) +//-overloadrules sim_race01+severity=Warning + +-rules sim_race02 // Multiple assignments to a signal +-overloadrules sim_race02+severity=Warning + +-rules W110a // Use same port index bounds in component instantiation and entity declaration + +//-rules W239 // Hierarchical references may not be synthesizable + +-rules W416 // Range of return type and return value of a function should be same +-overloadrules W416+severity=Error + +//-rules BothPhase // Process has a clock driving it on both edges - may not be synthesizable + +-rules CheckDelayTimescale-ML // Delay used without timescale compiler directive + +//-rules ClockStyle // A clocking style is used which may not be synthesizable + +//-rules DiffTimescaleUsed-ML // Design should not have different timescales for different modules + +//-rules MultipleWait // Multiple wait statements having same clock expression may not be synthesizableby some synthesis tools + +//-rules NoSigCaseX-ML // Design should not use signals in casex and casez constructs + +-rules PragmaComments-ML // Pragma Comments have been detected. +-overloadrules PragmaComments-ML+severity=Data + +//-rules SetBeforeRead-ML // Variable may not be set before being read + +//-rules SigVarInit // Initial values of signals and variables will be ignored by some synthesis tools + +//-rules STARC05-2.1.2.5v // Do not use attribute enum_encoding + +//-rules STARC05-2.1.8.6 // Global signals must not be read in a subprogram description + +-rules STARC05-2.10.2.3 // Global signals must not be read in a subprogram description +-overloadrules STARC05-2.10.2.3+severity=Warning + +//-rules STARC05-2.10.3.7 // Global signals must not be read in a subprogram description + +-rules STARC05-2.11.3.1 // Global signals must not be read in a subprogram description +-overloadrules STARC05-2.11.3.1+severity=Warning + +//-rules STARC05-2.3.1.4 // Paths other than flip-flop data paths must not have delays + +-rules STARC05-2.3.1.5b // Delay values must be non-negative. +-overloadrules STARC05-2.3.1.5b+severity=Error + +//-rules STARC05-2.3.2.4 // Variables if used, must be assigned to a signal before the end of the process + +//-rules SynthIfStmt // IF-statement may not be synthesizable + +//-rules W127 // Delay values should not contain X(unknown value) or Z(high-impedance state) + +//-rules W129 // Variable delay values should be avoided + +//-rules W182c // time declarations are not synthesizable + +//-rules W189 // Nested Synopsys translate_off comments + +//-rules W190 // Task or procedure declared but not used + +//-rules W213 // PLI Task/Functions are not synthesizable + +-rules W215 // Inappropriate bit select for integer or time variable + +-rules W216 // Inappropriate range select for integer or time variable + +//-rules W226 // Case select expression is constant + +//-rules W245 // Probably intended "or", not "|" or "||" in sensitivity list + +//-rules W250 // The disable statement may not be synthesizable + +//-rules W253 // Data event has an edge + +//-rules W254 // Reference event does not have an edge + +//-rules W280 // A delay has been specified in a non-blocking assignment + +-rules W289 // A real operand is being used in a logical comparison +-overloadrules W289+severity=Error + +-rules W292 // Comparison of Real operands is not recommended + +-rules W293 // A function returns a real value, which is unsynthesizable +-overloadrules W293+severity=Error + +//-rules W294 // Real variables are unsynthesizable + +-rules W317 // Assignment to a supply net + +-rules W352 // The condition inside a "for" statement is constant +-overloadrules W352+severity=Error + +-rules W398 // A case choice is covered more than once in a case statement +-overloadrules W398+severity=Error + +-rules W422 // Unsynthesizable process: event control has more than one clock +-overloadrules W422+severity=Error + +-rules W424 // Function or subprogram sets a global signal/variable + +//-rules W425 // Function or sub-program uses a global signal/variable + +-rules W426 // Task sets a global variable + +//-rules W427 // Task uses a global variable + +//-rules W430 // The "initial" statement is not synthesizable + +//-rules W443 // 'X' value used +//-overloadrules W443+severity=Warning + +//-rules W444 // 'Z' or '?' value used +//-overloadrules W444+severity=Warning + +//-rules W464 // Unrecognized synthesis directive used in the design + +-rules W467 // Use of don't-care except in case labels may lead to simulation/synthesis mismatch + +-rules W480 // Loop index is not of type integer + +-rules W481a // Possibly unsynthesizable loop: step variable differs from variable used in condition + +-rules W481b // Unsynthesizable loop: step variable differs from variable used in initialization + +-rules W496a // Comparison to a tristate in a condition expression is treated as false in synthesis. + +-rules W496b // Comparison to a tristate in a case statement is treated as false in synthesis. + +-rules W71 // A case statement(or selected signal assignment) does not have a default orOTHERS clause +-overloadrules W71+severity=Error + +//-rules WhileInSubProg // While statements used inside subprograms may be unsynthesizable + +//-rules ArrayIndex // Bus signals are declared with low-order bit first +-checkalldimension="yes" // Rule will check all dimensions of signal packed and unpacked. + +//-rules DisallowCaseX-ML // Design should not use casex constructs + +//-rules DisallowCaseZ-ML // Design should not use casez constructs + +//-rules DisallowXInCaseZ-ML // casez statement should not use "x" + +-rules NoAssignX-ML // RHS of the assignment contains 'X' + +-rules NoXInCase-ML // Case expression and case choices should not have 'X' + +//-rules ParamOverrideMismatch-ML // Mismatch in the number of parameter over-rides and number of parameters in theinstantiated module +//-overloadrules ParamOverrideMismatch-ML+severity=Warning + +-rules ParamWidthMismatch-ML // Parameter width does not match with the value assigned +-overloadrules ParamWidthMismatch-ML+severity=Warning + +-rules ReportPortInfo-ML // Generate a report of all ports of top level block and black-box instances. +-overloadrules ReportPortInfo-ML+severity=Data + +-rules STARC05-2.1.3.1 // Bit-width of function arguments must match bit-width of the correspondingfunction inputs. +-overloadrules STARC05-2.1.3.1+severity=Warning + +-rules STARC05-2.1.5.3 // Conditional expressions should evaluate to a scalar. +-overloadrules STARC05-2.1.5.3+severity=Warning + +-rules STARC05-2.2.3.3 // Do not assign over the same signal in an always construct for sequential circuits +-overloadrules STARC05-2.2.3.3+severity=Warning + +-rules STARC05-2.3.1.6 // Same logic level of reset signal must be checked as specified in the sensitivitylist of the always block. +-overloadrules STARC05-2.3.1.6+severity=Warning + +//-rules STARC05-2.3.2.2 // Do not use blocking and non-blocking assignments together in same alwaysblock. + +-rules W110 // An instance port connection has incompatible width compared to the port definition +-overloadrules W110+severity=Error + +//-rules W111 // Not all elements of an array are read + +-rules W116 // Unequal length operands in bit wise logical/arithmetic/relational operator + +-rules W122 // A signal is read inside a combinational process but is not included in the sensitivity list +-overloadrules W122+severity=Error + +-rules W123 // A signal or variable has been read but is not set +-overloadrules W123+severity=Error +-ignoreModuleInstance="yes" // Ignore signals which are unset but used in port mapping. + +//-rules W159 // Condition contains a constant expression + +//-rules W164a // LHS width is less than RHS width of assignment (Truncation) +//-overloadrules W164a+severity=Warning + +//-rules W164b // LHS width is greater than RHS width of assignment (Extension) + +-rules W19 // Truncation of extra bits +-overloadrules W19+severity=Error + +//-rules W210 // Number of connections made to an instance does not match number of ports on master +//-overloadrules W210+severity=Warning + +-rules W218 // Multi-bit signal used in sensitivity list +-overloadrules W218+severity=Error + +-rules W240 // An input has been declared but is not read +-checkfullbus="yes" +-checkfullrecord="yes" + +//-rules W241 // Output is never set + +-rules W263 // A case expression width does not match case select expression width + +-rules W337 // Illegal value (e.g. real) being used or X, Z or ? being used inappropriately asa case item + +//-rules W342 // Constant will be X-extended + +//-rules W343 // Constant will be Z-extended + +-rules W362 // Unequal length in arithmetic comparison operator + +//-rules W423 // A port with a range is redeclared with a different range + +//-rules W446 // Output port signal is being read (within the module) +//-overloadrules W446+severity=Error + +//-rules W456a // A signal is included in the sensitivity list of a combinational process blockbut none of its bits is read in that block + +-rules W486 // Shift overflow - some bits may be lost + +//-rules W491 // Constant will be ?-extended + +-rules W499 // Not all bits of a function are set in the function + +-rules W502 // A variable in sensitivity list is modified inside the always block + +-rules W505 // Value assigned inconsistently - may not be synthesizable +-overloadrules W505+severity=Error + +//-rules W551 // A case statement marked full_case or a priority/unique case statement have a default clause. + +-rules W66 // Unsynthesizable repeat loop because repeat expression is not constant +-overloadrules W66+severity=Error + +-rules InferLatch // Latch inferred +-overloadrules InferLatch+severity=Error + +-rules RegInputOutput-ML // Module output and input port should be registered +-overloadrules RegInputOutput-ML+severity=Data +-chkTopModule="yes" // Rule checkign will be done only for top module + +-rules STARC05-2.3.4.1v // Flip-flop output must not have initial value in signal/variable declaration +-overloadrules STARC05-2.3.4.1v+severity=Warning + +//-rules STARC05-2.3.6.1 // Do not mix descriptions of flip-flops with asynchronous reset and flip-flopswithout asynchronous reset in the same process/always block + +-rules STARC05-2.5.1.7 // Tri State output should not be used in the conditional expression of if statement +-overloadrules STARC05-2.5.1.7+severity=Warning + +-rules STARC05-2.5.1.9 // Tri State output should not be entered in the selection expression of casex and casez statement +-overloadrules STARC05-2.5.1.9+severity=Warning + +-rules STARC05-2.10.3.2a // Bit-width of operands of a logical operator must match. + +//-rules UseMuxBusses // Tristate nets detected +//-overloadrules UseMuxBusses+severity=Warning + +-rules W336 // Blocking assignment should not be used in a sequential block (may lead to shoot through) +-overloadrules W336+severity=Error + +-rules W414 // Use of non-blocking assignment in a combinational block +-overloadrules W414+severity=Error +-treat_latch_as_combinational="yes" // Always block inferring latch will be treated as combinational block. + +//-rules W428 // Task called in a combinational block + +-rules W450L // Multi-bit expression used as latch enable may not be synthesizable +-overloadrules W450L+severity=Warning + +-rules UndrivenInTerm-ML // Undriven but loaded input terminal of an instance detected +-overloadrules UndrivenInTerm-ML+severity=Error +-checkInHierarchy="yes" // Rule will dive down the hierarchy to look for driver +-checkRTLCInst='yes' // Rule will report violation for RTLC instances + +//-rules UndrivenNUnloaded-ML // Undriven and Unloaded nets/terminals detected in the design + +//-rules UnloadedInPort-ML // Unloaded but driven input port of a module detected + +//-rules LogicDepth // Logic depth exceeds specified number of levels (using parameter delaymax/delaymax_memtoflop/delaymax_floptomem/delaymax_memtomem/delaymax_err/delaymax_inputtoflop/delaymax_floptoflop/delaymax_inputtooutput/delaymax_floptooutput) +//-delaymax=500 + +-rules BufClock // Clock buffer detected +-overloadrules BufClock+severity=Warning + +-rules checkPinConnectedToSupply // IO-ports or Output ports of cells/modules may not be connected to supply signals. +-overloadrules checkPinConnectedToSupply+severity=Error + +//-rules ClockEdges // Do not use both levels of the clock to drive latches + +-rules CombLoop // Combinational loop exists +-overloadrules CombLoop+msgLabel=CombLoop+severity=Error +-enableE2Q="yes" // Report comb loop from Enable to Q pin of flop. + +//-rules DisabledAnd // And/Nand gate is disabled + +//-rules DisabledOr // Or/Nor gate is disabled + +-rules FlopClockConstant // Flip-flop clock pin driven by a constant value +-overloadrules FlopClockConstant+msgLabel=FlopClockConstant+severity=Error + +//-rules FlopDataConstant // Flip-flop data pin driven by a constant value + +-rules FlopEConst // Flip-flop enable pin is permanently disabled or enabled + +-rules FlopSRConst // Flip-flop set or reset pin is permanently enabled + +//-rules IntReset // Internally generated reset detected +//-overloadrules IntReset+msgLabel=IntReset+severity=Warning + +//-rules LatchDataConstant // Latch data pin driven by a constant value + +//-rules LatchEnableConstant // Latch enable pin driven by a constant value + +-rules LatchFeedback // There should not be a combinational feedback path from a latch output to data or enable of the same latch. +-overloadrules LatchFeedback+severity=Error + +//-rules LatchGatedClock // Do not use gated/internally generated clock to drive latches +//-overloadrules LatchGatedClock+msgLabel=LatchGatedClock+severity=Warning + +//-rules LatchReset // Reset pin should not be used both synchronously and asynchronously + +//-rules LogNMux // LogN mux with large number of inputs detected - potential performance problem +//-logmux_max=5 + +//-rules MuxSelConst // Mux select is constant. + +//-rules RegOutputs // Some outputs from a top module are not registered +//-overloadrules RegOutputs+severity=Warning +-reportundrivenout='no' // Rule will not report violation for undriven outputs. + +//-rules SetResetConverge-ML // Fanin cone of Set and Reset pin of a flop/latch converge + +-rules STARC05-1.2.1.2 // Do not create a RS latch using primitive cells such as AND, OR +-overloadrules STARC05-1.2.1.2+severity=Error + +-rules STARC05-1.3.1.3 // Asynchronous reset/preset signals must not be used as non-reset/preset orsynchronous reset/preset signals +-overloadrules STARC05-1.3.1.3+severity=Warning + +//-rules STARC05-1.3.1.7 // A flip-flop must not have both asynchronous set and asynchronous reset + +-rules STARC05-1.4.3.4 // Flip-flop clock signals must not be used as non-clock signals +-overloadrules STARC05-1.4.3.4+severity=Warning + +-rules STARC05-2.1.4.5 // Flip-flop clock signals must not be used as non-clock signals +-overloadrules STARC05-2.1.4.5+severity=Warning + +-rules STARC05-2.4.1.5 // Do not use two level latches in the same phase clock +-overloadrules STARC05-2.4.1.5+severity=Error + +-rules STARC05-2.5.1.2 // Logic must not exist in tristate enable conditions + +//-rules STARC05-2.5.1.4 // A tristate bus should not be driven by more than the specified number of drivers +//-overloadrules STARC05-2.5.1.4+severity=Warning + +//-rules TristateConst // Tristate gate enable is constant + +//-rules W391 // Design has a clock driving it on both edges + +-rules W392 // Do not use a reset or set with both positive and negative polarity within the samedesign unit + +-rules W415 // Variable/signal that does not infer a tristate and has multiple simultaneous drivers +-overloadrules W415+msgLabel=W415+severity=Error +-assume_driver_load="yes" // Rule will report violation for unloaded signals/variables. +-checkconstassign="yes" // Rule will report violation for constant assignments + +//-rules W422L // Multiple clocks in the event control list of latch is not allowed +//-overloadrules W422L+msgLabel=W422L+severity=Warning + +-rules STARC05-2.10.1.4a // Signals must not be compared with X or Z. + +-rules STARC05-2.10.1.4b // Signals must not be compared with values containing X or Z. + +-rules W156 // Do not connect buses in reverse order + +-rules STARC05-2.3.3.1 // Do not use multiple clock signals in a single process block + +-rules W415a // Signal may be multiply assigned (beside initialization) in the same scope. + +-rules W287b // Output port of an instance is not connected + +-rules W224 // Multi-bit expression found when one-bit expression expected + +-rules W287a // Some inputs to instance are not driven or unconnected + +-rules W528 // A signal or variable is set but never read + +-rules mixedsenselist // Mixed conditions in sensitivity list may not be synthesizable + +-rules W339a // Case equal operator (===) and case not equal (!==) operators may not be synthesizable + +-rules NoFeedThrus-ML // Block should not contain feed-throughs + +-rules STARC05-2.8.3.3 // Do not use //synopsys full_case pragma when all conditions are not described as case clause or the default clause is missing + +-rules UndrivenOutTermNLoaded-ML // Undriven output pins connected to instance input + +-rules UndrivenOutPort-ML // Undriven but loaded output port of a module detected + +-rules W146 // Use named-association rather than positional association to connect to an instance + +-rules W188 // Do not write to input ports + +-rules W401 // Clock signal is not an input to the design unit + +-rules W402b // Asynchronous set/reset signal is not an input to the module + +-rules W468 // Index variable is too short + +-rules W527 // Dangling else in sequence of if conditions. Make sure nesting is correct + +-rules W576 // Logical operation on a vector + +// -rules CheckShiftOperator-ML // Logical and arithmetic shift operation detection on signed and unsigned operand(s) or expression(s) respectively + +// -rules HangingInstOutput-ML // Net connected to output port of instance is unconnected + +// -rules ResetFlop-ML // All the flip-flops should have either asynchronous set/reset or synchronous set/reset + +// -rules SelfDeterminedExpr-ML // Self-determined expression present in the design + +// -rules UndrivenNet-ML // Undriven but loaded net is detected in the design + +// -rules UnrecSynthDir-ML // Synthesis directive is not recognized + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl_custom.tcl b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl_custom.tcl new file mode 100644 index 0000000..0d4d338 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl_custom.tcl @@ -0,0 +1,114 @@ +current_goal lint/lint_rtl -scenario optional +set_goal_option addrules AllocExpr +set_goal_option addrules DisconnSpec +set_goal_option addrules ForLoopWait +set_goal_option addrules IncompleteType +set_goal_option addrules Info_Case_Analysis +set_goal_option addrules IntGeneric +set_goal_option addrules LinkagePort +set_goal_option addrules LoopBound +set_goal_option addrules NoTimeOut +set_goal_option addrules PortType +set_goal_option addrules PreDefAttr +set_goal_option addrules ResFunction +set_goal_option addrules UserDefAttr +set_goal_option addrules W182g +set_goal_option addrules W182h +set_goal_option addrules W182k +set_goal_option addrules W182n +set_goal_option addrules SignedUnsignedExpr-ML +set_goal_option addrules sim_race01 +set_goal_option overloadrules sim_race01+severity=Warning +set_goal_option addrules W239 +set_goal_option addrules BothPhase +set_goal_option addrules ClockStyle +set_goal_option addrules DiffTimescaleUsed-ML +set_goal_option addrules MultipleWait +set_goal_option addrules NoSigCaseX-ML +set_goal_option addrules SetBeforeRead-ML +set_goal_option addrules SigVarInit +set_goal_option addrules STARC05-2.1.2.5v +set_goal_option addrules STARC05-2.1.8.6 +set_goal_option addrules STARC05-2.10.3.7 +set_goal_option addrules STARC05-2.3.1.4 +set_goal_option addrules STARC05-2.3.2.4 +set_goal_option addrules STARC05-2.3.4.2 +set_goal_option addrules SynthIfStmt +set_goal_option addrules W127 +set_goal_option addrules W129 +set_goal_option addrules W182c +set_goal_option addrules W189 +set_goal_option addrules W190 +set_goal_option addrules W213 +set_goal_option addrules W226 +set_goal_option addrules W245 +set_goal_option addrules W250 +set_goal_option addrules W253 +set_goal_option addrules W254 +set_goal_option addrules W280 +set_goal_option addrules W294 +set_goal_option addrules W425 +set_goal_option addrules W427 +set_goal_option addrules W430 +set_goal_option addrules W443 +set_goal_option overloadrules W443+severity=Warning +set_goal_option addrules W444 +set_goal_option overloadrules W444+severity=Warning +set_goal_option addrules W464 +set_goal_option addrules WhileInSubProg +set_goal_option addrules ArrayIndex +set_goal_option addrules DisallowCaseX-ML +set_goal_option addrules DisallowCaseZ-ML +set_goal_option addrules DisallowXInCaseZ-ML +set_goal_option addrules ParamOverrideMismatch-ML +set_goal_option overloadrules ParamOverrideMismatch-ML+severity=Warning +set_goal_option addrules STARC05-2.3.2.2 +set_goal_option addrules W111 +set_goal_option addrules W159 +set_goal_option addrules W164a +set_goal_option overloadrules W164a+severity=Warning +set_goal_option addrules W164b +set_goal_option addrules W210 +set_goal_option overloadrules W210+severity=Warning +set_goal_option addrules W241 +set_goal_option addrules W342 +set_goal_option addrules W343 +set_goal_option addrules W423 +set_goal_option addrules W446 +set_goal_option overloadrules W446+severity=Error +set_goal_option addrules W456a +set_goal_option addrules W491 +set_goal_option addrules W551 +set_goal_option addrules STARC05-2.3.6.1 +set_goal_option addrules UseMuxBusses +set_goal_option overloadrules UseMuxBusses+severity=Warning +set_goal_option addrules W428 +set_goal_option addrules UndrivenNUnloaded-ML +set_goal_option addrules UnloadedInPort-ML +set_goal_option addrules LogicDepth +set_parameter delaymax 500 +set_goal_option addrules ClockEdges +set_goal_option addrules DisabledAnd +set_goal_option addrules DisabledOr +set_goal_option addrules FlopDataConstant +set_goal_option addrules IntReset +set_goal_option overloadrules IntReset+msgLabel=IntReset+severity=Warning +set_goal_option addrules LatchDataConstant +set_goal_option addrules LatchEnableConstant +set_goal_option addrules LatchGatedClock +set_goal_option overloadrules LatchGatedClock+msgLabel=LatchGatedClock+severity=Warning +set_goal_option addrules LatchReset +set_goal_option addrules LogNMux +set_parameter logmux_max 5 +set_goal_option addrules MuxSelConst +set_goal_option addrules RegOutputs +set_goal_option overloadrules RegOutputs+severity=Warning +set_goal_option addrules SetResetConverge-ML +set_goal_option addrules STARC05-1.3.1.7 +set_goal_option addrules STARC05-2.5.1.4 +set_goal_option overloadrules STARC05-2.5.1.4+severity=Warning +set_goal_option addrules TristateConst +set_goal_option addrules W391 +set_goal_option addrules W422L +set_goal_option overloadrules W422L+msgLabel=W422L+severity=Warning +current_goal none diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl_debug_help.htm new file mode 100644 index 0000000..c25be63 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_rtl_debug_help.htm @@ -0,0 +1,68 @@ + + + + + + + + + + lint_rtl + + + + + + + + + + + + + +
    + +
    +

    +lint_rtl +

    +

    +This goal checks basic RTL lint issues in the design, such as floating input, width mismatch, etc. These checks should be run after every change in RTL code prior to code check-in. +

    +

    +To debug these issues, cross probe the violation to the HDL code. The code fragment will have to be analyzed to figure out the root cause of width mismatch issues. For issues relating to floating inputs will have to be debugged in the schematic. On the schematic, the user would be directed to the floating input, and in some cases fanin/fanout analysis would have to done to find out the actual source of problem. If there are violations reported by the Info_Case_Analysis rule, review the set_case_analysis settings as these may impact the lint checks. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_turbo_rtl.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_turbo_rtl.spq new file mode 100644 index 0000000..439471c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_turbo_rtl.spq @@ -0,0 +1,566 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : lint_turbo_rtl +// Version: 5.6.1 +// +// Revision History: +// Ver Date SG Ver Comments +// 5.4.1 26-Feb-2015 5.4.1 Initial version with following incremental changes over lint_rtl Goal: +// Added enable_fast_traversal switch for better performance of synthesis based rules. +// Added 4 new formal rules. +// SpyGlass Turbo Mode enabled. +// Goal will run under smart_rule_execution mode. +// +// 5.5.0 16-April-2015 5.5.0 Added Av_signed_unsigned_mismatch +// +// 5.6.0 18-Nov-2015 5.6 Added Following Rules +// Rule Name Policy GW Type +// =============================================== +// STARC05-2.10.1.4a starc2005 MUST +// STARC05-2.10.1.4b starc2005 MUST +// W156 lint MUST +// STARC05-2.3.3.1 starc2005 MUST +// W415a lint OPTIONAL +// W287b lint OPTIONAL +// W224 lint OPTIONAL +// W287a lint OPTIONAL +// W528 lint OPTIONAL +// mixedsenselist lint OPTIONAL +// W339a lint OPTIONAL +// STARC05-2.10.3.2a starc2005 OPTIONAL +// Av_width_mismatch_expr02 auto-verify MUST +// Av_width_mismatch_expr03 auto-verify MUST +// Av_dontcare_mismatch auto-verify MUST +// Av_case_default_missing auto-verify MUST +// Av_case_default_redundant auto-verify OPTIONAL +// Removed Following Rules +// Rule Name Policy GW Type +// =============================================== +// DuplicateCaseLabel-ML morelint MUST +// STARC05-2.3.4.2 starc2005 OPTIONAL +// +// 5.6.1 29-March-2016 5.6.1 Removed use_inferred_resets and use_inferred_clocks +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +lint_turbo_rtl +* +Checks the design for basic Connectivity issues +Checks the design for basic Simulation issues +Checks the design for recommended design practices and Structural issues +Checks the design for basic Synthesis issues + +* +This goal checks basic connectivity issues in the design, such as floating +input, width mismatch, etc. These checks should be run after every change in +RTL code prior to code check-in. +This goal checks simulation issues in the design, such as + - incomplete sensitivity list + - incorrect use of blocking/ non-blocking assignments + - potential functional errors + - possible simulation hang cases, and + - simulation race cases +These checks should be run, and reported messages should be reviewed prior to +all simulation runs. +This goal identifies the structural issues in the design that affect the +post-implementation functionality or performance of the design. Examples include +multiple drivers, high fan-in mux, and synchronous/asynchronous use of resets. +These checks should be run once every week and before handoff to implementation. +This goal reports unsynthesizable constructs in the design and code which can +cause RTL vs. gate simulation mismatch. These checks should be run twice a week, +and before handoff to synthesis team. + +Few rules in this goals perform formal analysis before reporting violations. Also +goal run under turbo mode for better and optimized analysis. + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=openmore,starc,starc2005,erc,simulation,lint,latch,spyglass,morelint,timing,auto-verify + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ +-enable_fast_traversal +-turbo +-smart_rule_execution + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-strict=W342,W343 // Rules will do strict checking +-new_flow_width='yes' // Enable all nex fixes made in width rules +-nocheckoverflow='yes' // Width will be calculated as per LRM rather best fit. +-report_inferred_cell="yes" // if parameter set to "yes" then rules will flag for only inferred flops and not for instantiated flops. + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +//-rules AllocExpr // Allocator expression may not be synthesizable + +-rules badimplicitSM1 // Unsynthesizable modeling style for a sequential logic. Clock and reset cannot be inferred + +-rules badimplicitSM2 // Unsynthesizable implicit sequential logic: states can only be updated on same clock phase + +-rules badimplicitSM4 // Unsynthesizable implicit sequential logic: event control expression may not have more than one edge + +-rules BlockHeader // PORT/GENERIC used in block statement header may be unsynthesizable + +-rules bothedges // Both edges of the same variable are not allowed in the event control list + +//-rules DisconnSpec // Disconnect specification is ignored by synthesis tools. + +//-rules ForLoopWait // WAIT statements used inside a FOR-loop may be unsynthesizable + +//-rules IncompleteType // Incomplete type declaration may not be synthesizable + +//-rules Info_Case_Analysis // Highlights case-analysis settings + +//-rules IntGeneric // Non-integer type used in the declaration of a generic may be unsynthesizable + +//-rules LinkagePort // Linkage port may not be synthesizable + +//-rules LoopBound // For loop range bounds should either be locally static or globally static +//-rules NoTimeOut // Timeout expression in wait statement may not be synthesizable + +//-rules PortType // Port of unconstrained type detected. This may not be synthesizable + +//-rules PreDefAttr // Use of certain pre-defined attributes may not be synthesizable + +//-rules ResFunction // Resolution functions may not be synthesizable + +-rules STARC05-2.1.6.5 // For an array index x and z should not be used +-overloadrules STARC05-2.1.6.5+severity=Warning + +-rules STARC05-2.3.1.2c // Do not use unsynthesizable User-Defined Primitives (UDPs). +-overloadrules STARC05-2.3.1.2c+severity=Error + +//-rules UserDefAttr // Use of user-defined attribute may not be synthesizable + +//-rules W182g // tri0 declarations may not be synthesizable + +//-rules W182h // tri1 declarations are not synthesizable + +//-rules W182k // trireg declarations are not synthesizable + +//-rules W182n // Switches such as cmos, pmos & nmos are not synthesizable + +-rules W421 // Always block/process does not have event control +-overloadrules W421+severity=Error + +-rules W442a // Reset sequence may not be synthesizable. First statement in block mustbe an if statement + +-rules W442b // Reset sequence may not be synthesizable. The reset condition is too complex + +-rules W442c // Reset sequence may not be synthesizable. Reset can only be modified by! or ~ in the if condition + +-rules W442f // The specified reset sequence may not be synthesizable. Only binary operators that canbe used in 'if' are '==' and '!=' + +//-rules SignedUnsignedExpr-ML // Do not mix signed & unsigned variables/constants in expressions, assignment statements or in comparisons. + +//-rules sim_race01 // Assignment and use of signal in same simulation cycle (Read-Write Race) +//-overloadrules sim_race01+severity=Warning + +-rules sim_race02 // Multiple assignments to a signal +-overloadrules sim_race02+severity=Warning + +-rules W110a // Use same port index bounds in component instantiation and entity declaration + +//-rules W239 // Hierarchical references may not be synthesizable + +-rules W416 // Range of return type and return value of a function should be same +-overloadrules W416+severity=Error + +//-rules BothPhase // Process has a clock driving it on both edges - may not be synthesizable + +-rules CheckDelayTimescale-ML // Delay used without timescale compiler directive + +//-rules ClockStyle // A clocking style is used which may not be synthesizable + +//-rules DiffTimescaleUsed-ML // Design should not have different timescales for different modules + +//-rules MultipleWait // Multiple wait statements having same clock expression may not be synthesizableby some synthesis tools + +//-rules NoSigCaseX-ML // Design should not use signals in casex and casez constructs + +-rules PragmaComments-ML // Pragma Comments have been detected. +-overloadrules PragmaComments-ML+severity=Data + +//-rules SetBeforeRead-ML // Variable may not be set before being read + +//-rules SigVarInit // Initial values of signals and variables will be ignored by some synthesis tools + +//-rules STARC05-2.1.2.5v // Do not use attribute enum_encoding + +//-rules STARC05-2.1.8.6 // Global signals must not be read in a subprogram description + +-rules STARC05-2.10.2.3 // Global signals must not be read in a subprogram description +-overloadrules STARC05-2.10.2.3+severity=Warning + +//-rules STARC05-2.10.3.7 // Global signals must not be read in a subprogram description + +-rules STARC05-2.11.3.1 // Global signals must not be read in a subprogram description +-overloadrules STARC05-2.11.3.1+severity=Warning + +//-rules STARC05-2.3.1.4 // Paths other than flip-flop data paths must not have delays + +-rules STARC05-2.3.1.5b // Delay values must be non-negative. +-overloadrules STARC05-2.3.1.5b+severity=Error + +//-rules STARC05-2.3.2.4 // Variables if used, must be assigned to a signal before the end of the process + +//-rules SynthIfStmt // IF-statement may not be synthesizable + +//-rules W127 // Delay values should not contain X(unknown value) or Z(high-impedance state) + +//-rules W129 // Variable delay values should be avoided + +//-rules W182c // time declarations are not synthesizable + +//-rules W189 // Nested Synopsys translate_off comments + +//-rules W190 // Task or procedure declared but not used + +//-rules W213 // PLI Task/Functions are not synthesizable + +-rules W215 // Inappropriate bit select for integer or time variable + +-rules W216 // Inappropriate range select for integer or time variable + +//-rules W226 // Case select expression is constant + +//-rules W245 // Probably intended "or", not "|" or "||" in sensitivity list + +//-rules W250 // The disable statement may not be synthesizable + +//-rules W253 // Data event has an edge + +//-rules W254 // Reference event does not have an edge + +//-rules W280 // A delay has been specified in a non-blocking assignment + +-rules W289 // A real operand is being used in a logical comparison +-overloadrules W289+severity=Error + +-rules W292 // Comparison of Real operands is not recommended + +-rules W293 // A function returns a real value, which is unsynthesizable +-overloadrules W293+severity=Error + +//-rules W294 // Real variables are unsynthesizable + +-rules W317 // Assignment to a supply net + +-rules W352 // The condition inside a "for" statement is constant +-overloadrules W352+severity=Error + +-rules W398 // A case choice is covered more than once in a case statement +-overloadrules W398+severity=Error + +-rules W422 // Unsynthesizable process: event control has more than one clock +-overloadrules W422+severity=Error + +-rules W424 // Function or subprogram sets a global signal/variable + +//-rules W425 // Function or sub-program uses a global signal/variable + +-rules W426 // Task sets a global variable + +//-rules W427 // Task uses a global variable + +//-rules W430 // The "initial" statement is not synthesizable + +//-rules W443 // 'X' value used +//-overloadrules W443+severity=Warning + +//-rules W444 // 'Z' or '?' value used +//-overloadrules W444+severity=Warning + +//-rules W464 // Unrecognized synthesis directive used in the design + +-rules W467 // Use of don't-care except in case labels may lead to simulation/synthesis mismatch + +-rules W480 // Loop index is not of type integer + +-rules W481a // Possibly unsynthesizable loop: step variable differs from variable used in condition + +-rules W481b // Unsynthesizable loop: step variable differs from variable used in initialization + +-rules W496a // Comparison to a tristate in a condition expression is treated as false in synthesis. + +-rules W496b // Comparison to a tristate in a case statement is treated as false in synthesis. + +-rules W71 // A case statement(or selected signal assignment) does not have a default orOTHERS clause +-overloadrules W71+severity=Error + +//-rules WhileInSubProg // While statements used inside subprograms may be unsynthesizable + +//-rules ArrayIndex // Bus signals are declared with low-order bit first +-checkalldimension="yes" // Rule will check all dimensions of signal packed and unpacked. + +//-rules DisallowCaseX-ML // Design should not use casex constructs + +//-rules DisallowCaseZ-ML // Design should not use casez constructs + +//-rules DisallowXInCaseZ-ML // casez statement should not use "x" + +-rules NoAssignX-ML // RHS of the assignment contains 'X' + +-rules NoXInCase-ML // Case expression and case choices should not have 'X' + +//-rules ParamOverrideMismatch-ML // Mismatch in the number of parameter over-rides and number of parameters in theinstantiated module +//-overloadrules ParamOverrideMismatch-ML+severity=Warning + +-rules ParamWidthMismatch-ML // Parameter width does not match with the value assigned +-overloadrules ParamWidthMismatch-ML+severity=Warning + +-rules ReportPortInfo-ML // Generate a report of all ports of top level block and black-box instances. +-overloadrules ReportPortInfo-ML+severity=Data + +-rules STARC05-2.1.3.1 // Bit-width of function arguments must match bit-width of the correspondingfunction inputs. +-overloadrules STARC05-2.1.3.1+severity=Warning + +-rules STARC05-2.1.5.3 // Conditional expressions should evaluate to a scalar. +-overloadrules STARC05-2.1.5.3+severity=Warning + +-rules STARC05-2.2.3.3 // Do not assign over the same signal in an always construct for sequential circuits +-overloadrules STARC05-2.2.3.3+severity=Warning + +-rules STARC05-2.3.1.6 // Same logic level of reset signal must be checked as specified in the sensitivitylist of the always block. +-overloadrules STARC05-2.3.1.6+severity=Warning + +//-rules STARC05-2.3.2.2 // Do not use blocking and non-blocking assignments together in same alwaysblock. + +-rules W110 // An instance port connection has incompatible width compared to the port definition +-overloadrules W110+severity=Error + +//-rules W111 // Not all elements of an array are read + +-rules W116 // Unequal length operands in bit wise logical/arithmetic/relational operator + +-rules W122 // A signal is read inside a combinational process but is not included in the sensitivity list +-overloadrules W122+severity=Error + +-rules W123 // A signal or variable has been read but is not set +-overloadrules W123+severity=Error +-ignoreModuleInstance="yes" // Ignore signals which are unset but used in port mapping. + +//-rules W159 // Condition contains a constant expression + +//-rules W164a // LHS width is less than RHS width of assignment (Truncation) +//-overloadrules W164a+severity=Warning + +//-rules W164b // LHS width is greater than RHS width of assignment (Extension) + +-rules W19 // Truncation of extra bits +-overloadrules W19+severity=Error + +//-rules W210 // Number of connections made to an instance does not match number of ports on master +//-overloadrules W210+severity=Warning + +-rules W218 // Multi-bit signal used in sensitivity list +-overloadrules W218+severity=Error + +-rules W240 // An input has been declared but is not read +-checkfullbus="yes" +-checkfullrecord="yes" + +//-rules W241 // Output is never set + +-rules W263 // A case expression width does not match case select expression width + +-rules W337 // Illegal value (e.g. real) being used or X, Z or ? being used inappropriately asa case item + +//-rules W342 // Constant will be X-extended + +//-rules W343 // Constant will be Z-extended + +-rules W362 // Unequal length in arithmetic comparison operator + +//-rules W423 // A port with a range is redeclared with a different range + +//-rules W446 // Output port signal is being read (within the module) +//-overloadrules W446+severity=Error + +//-rules W456a // A signal is included in the sensitivity list of a combinational process blockbut none of its bits is read in that block + +-rules W486 // Shift overflow - some bits may be lost + +//-rules W491 // Constant will be ?-extended + +-rules W499 // Not all bits of a function are set in the function + +-rules W502 // A variable in sensitivity list is modified inside the always block + +-rules W505 // Value assigned inconsistently - may not be synthesizable +-overloadrules W505+severity=Error + +//-rules W551 // A case statement marked full_case or a priority/unique case statement have a default clause. + +-rules W66 // Unsynthesizable repeat loop because repeat expression is not constant +-overloadrules W66+severity=Error + +-rules InferLatch // Latch inferred +-overloadrules InferLatch+severity=Error + +-rules RegInputOutput-ML // Module output and input port should be registered +-overloadrules RegInputOutput-ML+severity=Data +-chkTopModule="yes" // Rule checkign will be done only for top module + +-rules STARC05-2.3.4.1v // Flip-flop output must not have initial value in signal/variable declaration +-overloadrules STARC05-2.3.4.1v+severity=Warning + +//-rules STARC05-2.3.6.1 // Do not mix descriptions of flip-flops with asynchronous reset and flip-flopswithout asynchronous reset in the same process/always block + +-rules STARC05-2.5.1.7 // Tri State output should not be used in the conditional expression of if statement +-overloadrules STARC05-2.5.1.7+severity=Warning + +-rules STARC05-2.5.1.9 // Tri State output should not be entered in the selection expression of casex and casez statement +-overloadrules STARC05-2.5.1.9+severity=Warning + +//-rules UseMuxBusses // Tristate nets detected +//-overloadrules UseMuxBusses+severity=Warning + +-rules W336 // Blocking assignment should not be used in a sequential block (may lead to shoot through) +-overloadrules W336+severity=Error + +-rules W414 // Use of non-blocking assignment in a combinational block +-overloadrules W414+severity=Error +-treat_latch_as_combinational="yes" // Always block inferring latch will be treated as combinational block. + +//-rules W428 // Task called in a combinational block + +-rules W450L // Multi-bit expression used as latch enable may not be synthesizable +-overloadrules W450L+severity=Warning + +-rules UndrivenInTerm-ML // Undriven but loaded input terminal of an instance detected +-overloadrules UndrivenInTerm-ML+severity=Error +-checkInHierarchy="yes" // Rule will dive down the hierarchy to look for driver +-checkRTLCInst='yes' // Rule will report violation for RTLC instances + +//-rules UndrivenNUnloaded-ML // Undriven and Unloaded nets/terminals detected in the design + +//-rules UnloadedInPort-ML // Unloaded but driven input port of a module detected + +//-rules LogicDepth // Logic depth exceeds specified number of levels (using parameter delaymax/delaymax_memtoflop/delaymax_floptomem/delaymax_memtomem/delaymax_err/delaymax_inputtoflop/delaymax_floptoflop/delaymax_inputtooutput/delaymax_floptooutput) +//-delaymax=500 + +-rules BufClock // Clock buffer detected +-overloadrules BufClock+severity=Warning + +-rules checkPinConnectedToSupply // IO-ports or Output ports of cells/modules may not be connected to supply signals. +-overloadrules checkPinConnectedToSupply+severity=Error + +//-rules ClockEdges // Do not use both levels of the clock to drive latches + +-rules CombLoop // Combinational loop exists +-overloadrules CombLoop+msgLabel=CombLoop+severity=Error +-enableE2Q="yes" // Report comb loop from Enable to Q pin of flop. + +//-rules DisabledAnd // And/Nand gate is disabled + +//-rules DisabledOr // Or/Nor gate is disabled + +-rules FlopClockConstant // Flip-flop clock pin driven by a constant value +-overloadrules FlopClockConstant+msgLabel=FlopClockConstant+severity=Error + +//-rules FlopDataConstant // Flip-flop data pin driven by a constant value + +-rules FlopEConst // Flip-flop enable pin is permanently disabled or enabled + +-rules FlopSRConst // Flip-flop set or reset pin is permanently enabled + +//-rules IntReset // Internally generated reset detected +//-overloadrules IntReset+msgLabel=IntReset+severity=Warning + +//-rules LatchDataConstant // Latch data pin driven by a constant value + +//-rules LatchEnableConstant // Latch enable pin driven by a constant value + +-rules LatchFeedback // There should not be a combinational feedback path from a latch output to data or enable of the same latch. +-overloadrules LatchFeedback+severity=Error + +//-rules LatchGatedClock // Do not use gated/internally generated clock to drive latches +//-overloadrules LatchGatedClock+msgLabel=LatchGatedClock+severity=Warning + +//-rules LatchReset // Reset pin should not be used both synchronously and asynchronously + +//-rules LogNMux // LogN mux with large number of inputs detected - potential performance problem +//-logmux_max=5 + +//-rules MuxSelConst // Mux select is constant. + +//-rules RegOutputs // Some outputs from a top module are not registered +//-overloadrules RegOutputs+severity=Warning +-reportundrivenout='no' // Rule will not report violation for undriven outputs. + +//-rules SetResetConverge-ML // Fanin cone of Set and Reset pin of a flop/latch converge + +-rules STARC05-1.2.1.2 // Do not create a RS latch using primitive cells such as AND, OR +-overloadrules STARC05-1.2.1.2+severity=Error + +-rules STARC05-1.3.1.3 // Asynchronous reset/preset signals must not be used as non-reset/preset orsynchronous reset/preset signals +-overloadrules STARC05-1.3.1.3+severity=Warning + +//-rules STARC05-1.3.1.7 // A flip-flop must not have both asynchronous set and asynchronous reset + +-rules STARC05-1.4.3.4 // Flip-flop clock signals must not be used as non-clock signals +-overloadrules STARC05-1.4.3.4+severity=Warning + +-rules STARC05-2.1.4.5 // Flip-flop clock signals must not be used as non-clock signals +-overloadrules STARC05-2.1.4.5+severity=Warning + +-rules STARC05-2.4.1.5 // Do not use two level latches in the same phase clock +-overloadrules STARC05-2.4.1.5+severity=Error + +-rules STARC05-2.5.1.2 // Logic must not exist in tristate enable conditions + +//-rules STARC05-2.5.1.4 // A tristate bus should not be driven by more than the specified number of drivers +//-overloadrules STARC05-2.5.1.4+severity=Warning + +//-rules TristateConst // Tristate gate enable is constant + +//-rules W391 // Design has a clock driving it on both edges + +-rules W392 // Do not use a reset or set with both positive and negative polarity within the samedesign unit + +-rules W415 // Variable/signal that does not infer a tristate and has multiple simultaneous drivers +-overloadrules W415+msgLabel=W415+severity=Error +-assume_driver_load="yes" // Rule will report violation for unloaded signals/variables. +-checkconstassign="yes" // Rule will report violation for constant assignments + +//-rules W422L // Multiple clocks in the event control list of latch is not allowed +//-overloadrules W422L+msgLabel=W422L+severity=Warning + +-rules STARC05-2.10.1.4a // Signals must not be compared with X or Z. + +-rules STARC05-2.10.1.4b // Signals must not be compared with values containing X or Z. + +-rules W156 // Do not connect buses in reverse order + +-rules STARC05-2.3.3.1 // Do not use multiple clock signals in a single process block + +-rules W415a // Signal may be multiply assigned (beside initialization) in the same scope. + +-rules W287b // Output port of an instance is not connected + +-rules W224 // Multi-bit expression found when one-bit expression expected + +-rules W287a // Some inputs to instance are not driven or unconnected + +-rules W528 // A signal or variable is set but never read + +-rules mixedsenselist // Mixed conditions in sensitivity list may not be synthesizable + +-rules W339a // Case equal operator (===) and case not equal (!==) operators may not be synthesizable + +-rules STARC05-2.10.3.2a // Bit-width of operands of a logical operator must match. diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_turbo_rtl_custom.tcl b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_turbo_rtl_custom.tcl new file mode 100644 index 0000000..c27750b --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/lint/lint_turbo_rtl_custom.tcl @@ -0,0 +1,114 @@ +current_goal lint/lint_turbo_rtl -scenario optional +set_goal_option addrules AllocExpr +set_goal_option addrules DisconnSpec +set_goal_option addrules ForLoopWait +set_goal_option addrules IncompleteType +set_goal_option addrules Info_Case_Analysis +set_goal_option addrules IntGeneric +set_goal_option addrules LinkagePort +set_goal_option addrules LoopBound +set_goal_option addrules NoTimeOut +set_goal_option addrules PortType +set_goal_option addrules PreDefAttr +set_goal_option addrules ResFunction +set_goal_option addrules UserDefAttr +set_goal_option addrules W182g +set_goal_option addrules W182h +set_goal_option addrules W182k +set_goal_option addrules W182n +set_goal_option addrules SignedUnsignedExpr-ML +set_goal_option addrules sim_race01 +set_goal_option overloadrules sim_race01+severity=Warning +set_goal_option addrules W239 +set_goal_option addrules BothPhase +set_goal_option addrules ClockStyle +set_goal_option addrules DiffTimescaleUsed-ML +set_goal_option addrules MultipleWait +set_goal_option addrules NoSigCaseX-ML +set_goal_option addrules SetBeforeRead-ML +set_goal_option addrules SigVarInit +set_goal_option addrules STARC05-2.1.2.5v +set_goal_option addrules STARC05-2.1.8.6 +set_goal_option addrules STARC05-2.10.3.7 +set_goal_option addrules STARC05-2.3.1.4 +set_goal_option addrules STARC05-2.3.2.4 +set_goal_option addrules STARC05-2.3.4.2 +set_goal_option addrules SynthIfStmt +set_goal_option addrules W127 +set_goal_option addrules W129 +set_goal_option addrules W182c +set_goal_option addrules W189 +set_goal_option addrules W190 +set_goal_option addrules W213 +set_goal_option addrules W226 +set_goal_option addrules W245 +set_goal_option addrules W250 +set_goal_option addrules W253 +set_goal_option addrules W254 +set_goal_option addrules W280 +set_goal_option addrules W294 +set_goal_option addrules W425 +set_goal_option addrules W427 +set_goal_option addrules W430 +set_goal_option addrules W443 +set_goal_option overloadrules W443+severity=Warning +set_goal_option addrules W444 +set_goal_option overloadrules W444+severity=Warning +set_goal_option addrules W464 +set_goal_option addrules WhileInSubProg +set_goal_option addrules ArrayIndex +set_goal_option addrules DisallowCaseX-ML +set_goal_option addrules DisallowCaseZ-ML +set_goal_option addrules DisallowXInCaseZ-ML +set_goal_option addrules ParamOverrideMismatch-ML +set_goal_option overloadrules ParamOverrideMismatch-ML+severity=Warning +set_goal_option addrules STARC05-2.3.2.2 +set_goal_option addrules W111 +set_goal_option addrules W159 +set_goal_option addrules W164a +set_goal_option overloadrules W164a+severity=Warning +set_goal_option addrules W164b +set_goal_option addrules W210 +set_goal_option overloadrules W210+severity=Warning +set_goal_option addrules W241 +set_goal_option addrules W342 +set_goal_option addrules W343 +set_goal_option addrules W423 +set_goal_option addrules W446 +set_goal_option overloadrules W446+severity=Error +set_goal_option addrules W456a +set_goal_option addrules W491 +set_goal_option addrules W551 +set_goal_option addrules STARC05-2.3.6.1 +set_goal_option addrules UseMuxBusses +set_goal_option overloadrules UseMuxBusses+severity=Warning +set_goal_option addrules W428 +set_goal_option addrules UndrivenNUnloaded-ML +set_goal_option addrules UnloadedInPort-ML +set_goal_option addrules LogicDepth +set_parameter delaymax 500 +set_goal_option addrules ClockEdges +set_goal_option addrules DisabledAnd +set_goal_option addrules DisabledOr +set_goal_option addrules FlopDataConstant +set_goal_option addrules IntReset +set_goal_option overloadrules IntReset+msgLabel=IntReset+severity=Warning +set_goal_option addrules LatchDataConstant +set_goal_option addrules LatchEnableConstant +set_goal_option addrules LatchGatedClock +set_goal_option overloadrules LatchGatedClock+msgLabel=LatchGatedClock+severity=Warning +set_goal_option addrules LatchReset +set_goal_option addrules LogNMux +set_parameter logmux_max 5 +set_goal_option addrules MuxSelConst +set_goal_option addrules RegOutputs +set_goal_option overloadrules RegOutputs+severity=Warning +set_goal_option addrules SetResetConverge-ML +set_goal_option addrules STARC05-1.3.1.7 +set_goal_option addrules STARC05-2.5.1.4 +set_goal_option overloadrules STARC05-2.5.1.4+severity=Warning +set_goal_option addrules TristateConst +set_goal_option addrules W391 +set_goal_option addrules W422L +set_goal_option overloadrules W422L+msgLabel=W422L+severity=Warning +current_goal none diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/mbist_dft/mbist_dft.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/mbist_dft/mbist_dft.spq new file mode 100644 index 0000000..3cc903d --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/mbist_dft/mbist_dft.spq @@ -0,0 +1,25 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal File +// +// mbist_dft +// Version: 5.6.0 +// +// Revision History: +// Ver Date Comments +// 5.6.0 26-Nov-2015 First appreance +// +// Copyright Synopsys Inc, 2019. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +mbist_dft +* +The objective of this template is to run the mbist-dft policy in tcl flow. +* +The objective of this template is to run the mbist-dft policy in tcl flow. + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +-policy=mbist-dft +-mbist_fast_mode=on +-fullpolicy diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/order b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/order new file mode 100644 index 0000000..fdb853c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/order @@ -0,0 +1,95 @@ +=methodology+++++++++++++++++++++++++++++++++++++++++++++++++++ +rtl_handoff +* +GuideWare Reference Methodology for rtl_handoff stage of New RTL Block development +* +The rtl_handoff goals are a super-set of the initial_rtl goals. This stage +contains the complete set of recommended RTL Handoff checks. Handoff is +assumed to be the hand-off from the RTL design team to the post-synthesis +implementation team or hand-off to System Integration (sub-system or SoC) +integration. Since the hand-off process is typically iterative, it is not +necessarily expected that all goals will be clean at the first hand-off, but +at least the issues will be known and can be communicated to the consumers +downstream. + +In addition to commonly applicable templates at above design stage, +this methodology also includes a set of Optional templates. Design +teams should inspect these templates for applicability to their design. + +GuideWare Methodology Guide provides detailed description of above +templates, as well as what factors should be reviewed when selecting +optional templates. +=cut++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +lint/lint_rtl* +lint/lint_turbo_rtl* +lint/lint_functional_rtl* +!HIDE lint/design_audit* +lint/lint_abstract* +!HIDE adv_lint/adv_lint_setup* +adv_lint/adv_lint_struct* +adv_lint/adv_lint_verify* +!HIDE adv_lint/lint_functional_rtl* +!HIDE constraints/sdc_gen* +constraints/sdc_audit* +constraints/sdc_check* +constraints/sdc_exception_struct* PREREQ: constraints/sdc_check +!HIDE constraints/sdc_hier_equiv* +constraints/sdc_redundancy* +!HIDE constraints/sdc_equiv* +constraints/sdc_abstract* +txv_verification/fp_verification* +txv_verification/mcp_verification* +txv_verification/fp_mcp_verification* +txv_verification/txv_run_audit* +txv_verification/txv_glitch* +txv_verification/txv_rtl_gen* +txv_verification/txv_sdc_migration* +!HIDE cdc/cdc_setup* +cdc/cdc_setup_check* +cdc/clock_reset_integrity* +cdc/cdc_verify_struct* +cdc/cdc_verify* PREREQ: cdc/cdc_verify_struct +rdc/rdc_verify_struct* +cdc/cdc_abstract* PREREQ: cdc/cdc_verify +dft/dft_scan_ready* +dft/dft_best_practice* +dft/dft_bist_ready* +dft/dft_dsm_best_practice* +dft/dft_dsm_random_resistance* +dft/dft_abstract* +power/power_audit* +power/power_activity_check* +power/power_atd* +power/power_gen_pesd* +power/power_calibration* +power/power_est_average* +power/power_est_profiling* +power/power_reduction_adv* +power/power_cge_profiling* +power/power_mem_reduction* +power/power_guidance* +power/power_mode_detection* +power/power_wtc_model* +power/power_wtc_profiler* +power/power_wtc_virtualizer* +power/power_factor_values* +power/power_factor_conditions* +power/power_est_profiling_save* +power/power_cge_profiling_save* +power/power_cge_profiling_est* +power_verification/power_verif_audit* +power_verification/power_verif_noninstr* +power_verification/power_verif_instr_rtl* +power_verification/power_verif_abstract* +physical/lint_physical* +physical/physical_analysis_signoff* +!HIDE physical/physical_analysis_congestion* + + +physical_aware_power/physical_power_postfloorplan* +physical_aware_power/power_est_average* + +rtl2netlist/rtl2netlist_migration* DDR_GOAL + +connectivity_verify/connectivity_verification* diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/lint_physical.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/lint_physical.spq new file mode 100644 index 0000000..a0dcda5 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/lint_physical.spq @@ -0,0 +1,104 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : lint_physical +// Version: 2.0.0 +// +// Revision History: +// Ver Date SG Version Comments +// 1.0.0 13-Oct-2014 5.3.1.2 Initial version +// 1.1.0 29-Jan-2015 5.4.1 Added option prefer_tech_lib +// 2.0.0 20-May-2015 5.5.0 Removed rule PHY_CriticalObjects and added rules PHY_FaninCone_MM and PHY_FanoutCone_MM +// Overload severity as Warning and updated parameter values for PHY_LargeMux, +// PHY_FaninCone, PHY_FanoutCone and PHY_FanoutCone2 rules. +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +lint_physical +* +Perform design read to create SpyGlass Physical DB for subsequent analysis +* +This goal runs set of rules necessary to provide physical linting solution for +early RTL. + +User inputs required for this goal are + + i) Design RTL + ii) Technology library, compiled using SpyGlass Physical + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +// ---------------------------------------------------------------------------- +// Policy Registration +// ---------------------------------------------------------------------------- + +-policy=physical + +// ---------------------------------------------------------------------------- +// General Setup commands +// ---------------------------------------------------------------------------- + +-physical_mode // Internal switch +-enable_pgnetlist // Power ground pins are handled +-prefer_tech_lib // Bind design instances to tech cell even if a module with same name as tech cell is defined in rtl + +// ---------------------------------------------------------------------------- +// Policy Specific Parameter Setting +// ---------------------------------------------------------------------------- + +//-phy_max_msg_count=10000 // Controls the number of messages of each rule to be reported +-phy_tech_path=$SPYGLASS_PHYSICAL_HOME/common/genericLib/sgp_tech // Set default technology library to generic tech + +// ---------------------------------------------------------------------------- +// Rule Registration +// ---------------------------------------------------------------------------- + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Lint Rules +// ---------------------------------------------------------------------------- + +-rule PHY_BlackBox // Reports black boxes in the design + +-rule PHY_MemorySynthesis // Reports memory variables in the design + +-rule PHY_FlopCount // Reports total number of flip-flops in the design +//-phy_enable_sequential_opt='CONSTANT_FLOP HANGING_FLOP FEEDBACK_FLOP' //Controls the sequential optimization + +-rule PHY_LargeMux // Reports large mux structures in the design +-overloadrules PHY_LargeMux+severity=Warning // Overload rule severity to Warning +-phy_largemux_threshold="{100 75}" // Threshold value of large mux rule +-phy_largemux_input_threshold=512 // Minimum input size of large mux which are considered for reporting +-phy_largemux_select_threshold=16 // Minimum select size of large mux which are considered for reporting +-phy_largemux_cong_threshold=0 // Congestion threshold of large mux parent module ignored for large mux scaling + +-rule PHY_FaninCone // Reports nodes with high number of sequential elements and ports in their fanin cone +-overloadrules PHY_FaninCone+severity=Warning // Overload rule severity to Warning +-phy_fanin_threshold=10000 // Minimum threshold for PHY_FaninCone rule + +-rule PHY_FaninCone_MM // Reports hardmacros and blackboxes with high number of sequential elements and ports in their fanin cone + +-rule PHY_FanoutCone // Reports nodes with high number of sequential elements and ports in their fanout cone +-overloadrules PHY_FanoutCone+severity=Warning // Overload rule severity to Warning +-phy_fanout_threshold=10000 // Minimum threshold for PHY_FanoutCone rule + +-rule PHY_FanoutCone_MM // Reports hardmacros and blackboxes with high number of sequential elements and ports in their fanout cone + +-rule PHY_FanoutCone2 // Reports pairs of nodes with high number of sequential elements and ports in their fanout cone +-overloadrules PHY_FanoutCone2+severity=Warning // Overload rule severity to Warning +-phy_fanoutcone2_metric="{{THRESHOLD 5000 5000}}" // Minimum threshold for PHY_FanoutCone2 rule + +-rule PHY_FaninFanoutCone // Reports sequential instances with high number of sequential elements and ports in their fanin and fanout cone + +// ---------------------------------------------------------------------------- +// LEGEND +// ------ +// 1. Rules that are recommended for this use model are enabled by default. +// 2. Rule that are available based on customer request, as well as rule parameter values +// that user can customize are included with comment. +// Uncomment to use these rules or parameters. +// 3. Rules that are not recommended for this use model, are not listed in this file. +// ---------------------------------------------------------------------------- + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion.spq new file mode 100644 index 0000000..5fb1d7c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion.spq @@ -0,0 +1,170 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare3.0 Goal File +// +// Goal Name : physical_analysis_congestion +// Version: 3.0.0 +// +// Revision History: +// Ver Date SG Version Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.1.0 31-May-2013 5.1 Removed parameter "phy_criticalobjects_threshold" +// Added new parameter "phy_criticalobjects_metric" +// 2.0.0 30-May-2014 5.3 Guideware 2.0 Content Consistency +// 2.1.0 29-Jan-2015 5.4.1 Added option prefer_tech_lib +// 3.0.0 20-May-2015 5.5.0 Overload severity as Warning and updated parameter values for PHY_LargeMux, +// PHY_FaninCone and PHY_FanoutCone rules. +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +physical_analysis_congestion +* +Perform physical analysis using vendor library, use for congestion analysis and debug +* +This goal runs selected SpyGlass Physical Pre-Floorplan rules together with +user-supplied vendor library. The rules are selected to analyze and debug +congestion aspects of user RTL design. + +User inputs required for this goal are + + i) Design RTL + ii) SDC constraints + iii) Technology library, compiled using SpyGlass Physical + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +// ---------------------------------------------------------------------------- +// Policy Registration +// ---------------------------------------------------------------------------- + +-policy=physical + +// ---------------------------------------------------------------------------- +// General Setup commands +// ---------------------------------------------------------------------------- + +-mixed // Design language +-physical_mode // Internal switch +-enable_pgnetlist // Power ground pins are handled +-prefer_tech_lib // Bind design instances to tech cell even if a module with same name as tech cell is defined in rtl + +// ---------------------------------------------------------------------------- +// Policy Specific Parameter Setting +// ---------------------------------------------------------------------------- + +// Default tool setting is used + +// ---------------------------------------------------------------------------- +// Rule Registration +// ---------------------------------------------------------------------------- + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for area estimate +// ---------------------------------------------------------------------------- + +-rule PHY_GateCount // Reports NAND2 gate-equivalent area estimate for the input design + +// -rule PHY_GateArea // Reports area estimate for the input design +// -phy_gatearea_cell_util=100 // Standard cell utilization percentage used to scale standard-cell area + +-rule PHY_BlackBox // Reports black boxes in the design + +// -rule PHY_FlopCount // Reports total number of flip-flops in the design + +// -rule PHY_DesignResources // Reports design resources in the design + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for timing estimate +// ---------------------------------------------------------------------------- + +-rule PHY_LogicDepth_Core_ClkDelay // Reports reg-reg timing paths that exceed specified logic depth (based on percentage of clock period weighted delay) +// -phy_logicdepth_core_clkdelay_threshold=90 // Minimum threshold for PHY_LogicDepth_Core_ClkDelay rule + // Review with user, recommend 90 as CriticalObjects analysis + +-rule PHY_LogicDepth_Peri_ClkDelay // Reports PI-PO, PI-reg and reg-PO timing paths that exceed specified logic depth (based on percentage of clock period weighted delay) +// -phy_logicdepth_peri_clkdelay_threshold=45 // Minimum threshold for PHY_LogicDepth_Peri_ClkDelay rule + // Review with user, recommend 45 for CriticalObjects analysis + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for Congestion analysis +// ---------------------------------------------------------------------------- + +-rule PHY_CongModules // Reports most congested modules in the input design +// -phy_cong_threshold=7.0 // Minimum threshold for PHY_CongModules rule + // Review with user, value of 7 is recommend for debug purposes + +-rule PHY_FaninCone // Reports nodes with high number of sequential elements and ports in their fanin cone +-overloadrules PHY_FaninCone+severity=Warning // Overload rule severity to Warning +-phy_fanin_threshold=10000 // Minimum threshold for PHY_FaninCone rule + +-rule PHY_FanoutCone // Reports nodes with high number of sequential elements and ports in their fanout cone +-overloadrules PHY_FanoutCone+severity=Warning // Overload rule severity to Warning +-phy_fanout_threshold=10000 // Minimum threshold for PHY_FanoutCone rule + +-rule PHY_LargeMux // Reports large mux instances found in the design +-overloadrules PHY_LargeMux+severity=Warning // Overload rule severity to Warning +-phy_largemux_threshold="{100 75}" // Threshold value of large mux rule +//-phy_largemux_input_threshold=512 // Threshold value of the input pins of a mux instance +//-phy_largemux_select_threshold=16 // Threshold value of the select pins of a mux instance +// -phy_largemux_cong_threshold=7.0 // Threshold value of the congestion score of the parent module of a mux instance + // May use value of 0.0 to ignore congestion score for large mux scaling + +-rule PHY_CriticalObjects // Reports critical objects (registers and ports) in the design +-phy_criticalobjects_logicdepth_mode="ClkDelay" // Selects the logic depth rule variant used for PHY_CriticalObjects rule + // this must match LogicDepth selection +//-phy_criticalobjects_threshold=4 // Threshold value for PHY_CriticalObjects rule + // review suitable threshold with user +//-phy_criticalobjects_max_objects=10000 // Maximum critical objects to be reported +-phy_criticalobjects_metric="{ {FICN {5000 1.0} {20000 2.0} {40000 4.0}} {FOCN {5000 1.0} {20000 2.0} {40000 4.0}} {FILD {90 1.0} {140 2.0} {160 4.0}} {FOLD {90 1.0} {140 2.0} {160 4.0}} {FILM {25 1.0} {100 2.0} {200 4.0}} {FOLM {25 1.0} {100 2.0} {200 4.0}} }" // Select metrics contributing to PHY_CriticalObjects rule + + +-rule PHY_CellPinDensity // Reports pin density of technology library cells instantiated in each congested module of the design + +-rule PHY_HighFanout // Reports high fanout nodes in the input design +// -phy_highfanout_threshold=500 // Minimum threshold for PHY_HighFanout rule + // Review threshold with users, a value of 1000 is recommend for gross violators + + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for general reports +// ---------------------------------------------------------------------------- + +// -rule PHY_PhysicalSummary // Reports the Area_Congestion_Timing profile for the design at pre-floorplanned stage + +-rule PHY_Reports // View all reports generated during SpyGlass Physical flow + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for customer requests +// ---------------------------------------------------------------------------- + +// Review all custom rules with user, including the threshold values + +// -rule PHY_LogicDepth_MM_ClkDelay // Reports PI-memory or reg-memory or memory-reg or memory-PO or memory-memory timing paths that exceed specified logic depth (based on percentage of clock period weighted delay) +// -phy_logicdepth_to_mm_clkdelay_threshold=50.0 // Minimum fanin logic depth threshold for PHY_LogicDepth_MM_ClkDelay rule +// -phy_logicdepth_from_mm_clkdelay_threshold=50.0 // Minimum fanout logic depth threshold for PHY_LogicDepth_MM_ClkDelay rule + +// -rule PHY_FaninCone_MM // Reports memory and black box objects with high number of sequential elements and ports in their fanin cone +// -phy_fanin_mm_threshold=10 // Minimum threshold for PHY_FaninCone_MM rule + +// -rule PHY_FanoutCone_MM // Reports memory and black box objects with high number of sequential elements and ports in their fanout cone +// -phy_fanout_mm_threshold=10 // Minimum threshold for PHY_FanoutCone_MM rule + +// -rule PHY_CriticalObjects_MM // Reports critical objects of memory and black box type in the design +// -phy_criticalobjects_mm_threshold=2.0 // Minimum threshold for PHY_CriticalObjects_MM rule +// -phy_fanin_mm_scale_factor=1.0 // Scaling factor used for calculating FaninCone weightage for PHY_CriticalObjects_MM rule +// -phy_fanout_mm_scale_factor=1.0 // Scaling factor used for calculating FanoutCone weightage for PHY_CriticalObjects_MM rule + // PHY_LargeMux scale factor used is same as for PHY_CriticalObjects rule + +--deprecate_template physical_analysis_congestion+spg-5.6.0+Warning +// ---------------------------------------------------------------------------- +// LEGEND +// ------ +// 1. Rules that are recommended for this use model are enabled by default. +// 2. Rule that are available based on customer request, as well as rule parameter values +// that user can customize are included with comment. +// Uncomment to use these rules or parameters. +// 3. Rules that are not recommended for this use model, are not listed in this file. +// ---------------------------------------------------------------------------- + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion_debug_help.htm new file mode 100644 index 0000000..baa8824 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion_debug_help.htm @@ -0,0 +1,73 @@ + + + + + + + + + + physical_analysis_congestion + + + + + + + + + + + + + +
    + +
    +

    +physical_analysis_congestion +

    +

    +This goal runs selected SpyGlass Physical Pre-Floorplan rules together with user-supplied vendor library. The rules are selected to analyze and debug congestion aspects of user RTL design. +

    +

    +User inputs required for this goal are: +

    +
      +
    • Design RTL
    • +
    • SDC constraints
    • +
    • Technology library, compiled using SpyGlass Physical
    • +
    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion_setup.sgs new file mode 100644 index 0000000..3c826bd --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_congestion_setup.sgs @@ -0,0 +1,89 @@ +########################################################################## +# SpyGlass Physical Methodology +# +# Version: 1.0 +# +# Revision History: +# Ver Date Comments +# 1.0 16-Feb-2010 Initial Draft +# 1.1 02-Sep-2010 Support for honoring preset params from prj file +# 1.2 07-Sep-2010 Updated to correctly handle VI 47531 +# +# Copyright Atrenta Inc, 2010. All rights reserved. +########################################################################## +# This is the SGS script to setup PHYSICAL ANALYSIS CONGESTION +########################################################################## + +if {[info exists env(SPYGLASS_PHYSICAL_HOME)] != 0} { + set MY_ENV_SGP_PATH $env(SPYGLASS_PHYSICAL_HOME)/common/sgphysical +} elseif {[info exists env(BP_HOME)] != 0} { + if {[file exists $env(BP_HOME)/sgphysical] != 0} { + set MY_ENV_SGP_PATH $env(BP_HOME)/sgphysical + } else { + set MY_ENV_SGP_PATH $env(BP_HOME)/../../common/sgphysical + } +} else { + return -code error "SPYGLASS_PHYSICAL_HOME/BP_HOME not set" +} + +########################################################################## +# Register Variables to be used in the script here +########################################################################## +# Variable to set path to user-specified technology library +register_variable Q_USER_TECHPATH "SGS_Unset" + +# Variable to set path to user-specified SDC file +register_variable Q_USER_SDCFILE "SGS_Unset" + +########################################################################## +# Initialize variables from value in project file (or corresponding parameter defaults) +########################################################################## +get_property console.parameterValue phy_tech_path -result_variable Q_USER_TECHPATH +get_property console.parameterValue phy_sdc -result_variable Q_USER_SDCFILE + +########################################################################## +# set_property -hide_step_numbering + +set_property -step_header "Introduction" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +set_property -restore_session_log -enable_next_button + +create_form -label "PAC_INTRODUCTION" { + show_html $MY_ENV_SGP_PATH/templates/html/pac_1_introduction.htm +} +set_header_state "Introduction" complete + +########################################################################## +set_property -step_header "Select Technology" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +create_form -label "PAC_SELECT_TECH" { + get_dir -text "Select Precompiled technology library directory, usually named sgp_tech" -type {"sgp_tech directory" "*"} -result_variable Q_USER_TECHPATH -geometry { -side bottom } -auto_proceed + show_html $MY_ENV_SGP_PATH/templates/html/pac_2_select_techlib.htm -geometry { -side bottom } +} +set_parameters_value {phy_tech_path get_variable $Q_USER_TECHPATH} +set_header_state "Select Technology" complete + +########################################################################## +set_property -step_header "Select SDC file" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +create_form -label "PAC_SELECT_SDC" { + get_file -text "Select SDC file" -type {"SDC File" "*.sdc"} -fileExt { "SDC File" "*.sdc" } -allow_multiple -result_variable Q_USER_SDCFILE -geometry { -side bottom } + show_html $MY_ENV_SGP_PATH/templates/html/pac_3_select_sdc.htm -geometry { -side bottom } +} +set_parameters_value {phy_sdc get_variable $Q_USER_SDCFILE} +set_header_state "Select SDC file" complete + +########################################################################## + +set_property -step_header "Setup optional parameter" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +create_form -label "PAC_SETUP_RULEPARA" { + set_parameters {phy_tech_path phy_sdc phy_optimization_effort phy_enable_hbo phy_blackbox_models_tcl_file phy_dont_use_cell_list phy_gatecount_depth phy_gatecount_module_size phy_gatecount_percent_size phy_highfanout_threshold phy_logicdepth_core_clkdelay_merge_bus phy_logicdepth_core_clkdelay_threshold phy_logicdepth_peri_clkdelay_merge_bus phy_logicdepth_peri_clkdelay_threshold phy_logicdepth_scale_factor phy_calculate_fold phy_fanout_scale_factor phy_fanout_threshold phy_fanin_scale_factor phy_fanin_threshold phy_cong_module_size_low phy_cong_module_size_high phy_cong_module_count phy_cong_module_size phy_cong_threshold phy_cong_effort phy_largemux_threshold phy_largemux_input_threshold phy_largemux_select_threshold phy_largemux_merge_mode phy_largemux_cong_threshold phy_largemux_scale_factor phy_enable_sequential_opt phy_criticalobjects_threshold } -geometry { -side bottom } + show_html $MY_ENV_SGP_PATH/templates/html/pac_4_rule_customize.htm +} +set_header_state "Setup optional parameter" complete + +########################################################################## + +set_property -step_header "Setup Complete" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +set_header_state "Setup Complete" complete +create_form -label "PAC_Completed" { + show_text "Setup is successfully completed" +} + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff.spq new file mode 100644 index 0000000..e4efd97 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff.spq @@ -0,0 +1,197 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare3.0 Goal File +// +// Goal Name : physical_analysis_signoff +// Version: 3.0.0 +// +// Revision History: +// Ver Date SG Version Comments +// 1.0.0 18-Feb-2013 5.0 Initial version +// 1.1.0 31-May-2013 5.1 Added new parameter "phy_criticalobjects_metric" +// 2.0.0 30-May-2014 5.3 Guideware 2.0 Content Consistency +// 2.1.0 29-Jan-2015 5.4.1 Added option prefer_tech_lib +// 3.0.0 20-May-2015 5.5.0 Overload severity as Warning and updated parameter values for PHY_LargeMux, +// PHY_FaninCone and PHY_FanoutCone rules. +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +physical_analysis_signoff +* +Perform physical analysis using vendor library, use for signoff on area, congestion and timing +* +This goal runs selected SpyGlass Physical Pre-Floorplan rules together with +user-supplied vendor library. The rules are selected to signoff for area, +timing and congestion aspects of user RTL design. + +User inputs required for this goal are + + i) Design RTL + ii) SDC constraints + iii) Technology library, compiled using SpyGlass Physical + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +// ---------------------------------------------------------------------------- +// Policy Registration +// ---------------------------------------------------------------------------- + +-policy=physical + +// ---------------------------------------------------------------------------- +// General Setup commands +// ---------------------------------------------------------------------------- + +-mixed // Design language +-physical_mode // Internal switch +-enable_pgnetlist // Power ground pins are handled +-prefer_tech_lib // Bind design instances to tech cell even if a module with same name as tech cell is defined in rtl + +// ---------------------------------------------------------------------------- +// Policy Specific Parameter Setting +// ---------------------------------------------------------------------------- + +-phy_optimization_effort=medium // Controls the complexity and number of transform iterations used during timing optimization + // user may increase to high in .prj file, which may modestly increase runtime + +// ---------------------------------------------------------------------------- +// Rule Registration +// ---------------------------------------------------------------------------- + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for area estimate +// ---------------------------------------------------------------------------- + +-rule PHY_GateCount // Reports NAND2 gate-equivalent area estimate for the input design + +-rule PHY_GateArea // Reports area estimate for the input design +// -phy_gatearea_cell_util=100 // Standard cell utilization percentage used to scale standard-cell area + +-rule PHY_BlackBox // Reports black boxes in the design + +// -rule PHY_FlopCount // Reports total number of flip-flops in the design + +// -rule PHY_DesignResources // Reports design resources in the design + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for timing estimate +// ---------------------------------------------------------------------------- + +// -rule PHY_LogicDepth_Core // Reports reg-reg timing paths that exceed specified logic depth (calculated on per gate basis) +// -phy_logicdepth_core_threshold=30 // Minimum threshold for PHY_LogicDepth_Core rule + // review threshold with user + +// -rule PHY_LogicDepth_Peri // Reports PI_PO,PI-PIreg and reg-PO timing paths that exceed specified logic depth (calculated on per gate basis) +// -phy_logicdepth_peri_threshold=15 // Minimum threshold for PHY_LogicDepth_Peri rule + // review threshold with user + +// -rule PHY_LogicDepth_Core_Delay // Reports reg-reg timing paths that exceed specified logic depth (based on inverter weighted delay of each instance) +// -phy_logicdepth_core_delay_threshold=100 // Minimum threshold for PHY_LogicDepth_Core_Delay rule + // review threshold with user + +// -rule PHY_LogicDepth_Peri_Delay // Reports PI_PO,PI-reg and reg-PO timing paths that exceed specified logic depth (based on inverter weighted delay of each instance) +// -phy_logicdepth_peri_delay_threshold=50 // Minimum threshold for PHY_LogicDepth_Peri_Delay rule + // review threshold with user + +-rule PHY_LogicDepth_Core_ClkDelay // Reports reg-reg timing paths that exceed specified logic depth (based on percentage of clock period weighted delay) +// -phy_logicdepth_core_clkdelay_threshold=120 // Minimum threshold for PHY_LogicDepth_Core_ClkDelay rule + // Review with user, Recommend 120 for gross outlier + +-rule PHY_LogicDepth_Peri_ClkDelay // Reports PI-PO, PI-reg and reg-PO timing paths that exceed specified logic depth (based on percentage of clock period weighted delay) +// -phy_logicdepth_peri_clkdelay_threshold=60 // Minimum threshold for PHY_LogicDepth_Peri_ClkDelay rule + // Review with user, Recommend 60 for gross outlier + +-rule PHY_Timing // Generates detailed timing report at the pre-floorplanned design database + +-rule PHY_TimingModules // Reports timing distribution in the design + +-rule PHY_ClockDetail // Reports worst critical paths with respect to each clock in the design + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for Congestion analysis +// ---------------------------------------------------------------------------- + +-rule PHY_CongModules // Reports most congested modules in the input design +-phy_cong_module_size_low=50000 // Minimum instance count threshold of modules which are gross violators of logical congestion +-phy_cong_threshold=8.0 // Minimum threshold for PHY_CongModules rule + // sign-off criteria uses default threshold of 8 + +-rule PHY_FaninCone // Reports nodes with high number of sequential elements and ports in their fanin cone +-overloadrules PHY_FaninCone+severity=Warning // Overload rule severity to Warning +-phy_fanin_threshold=10000 // Minimum threshold for PHY_FaninCone rule + +-rule PHY_FanoutCone // Reports nodes with high number of sequential elements and ports in their fanout cone +-overloadrules PHY_FanoutCone+severity=Warning // Overload rule severity to Warning +-phy_fanout_threshold=10000 // Minimum threshold for PHY_FanoutCone rule + +//-rule PHY_LargeMux // Reports large muxes in the design +//-overloadrules PHY_LargeMux+severity=Warning // Overload rule severity to Warning +//-phy_largemux_threshold="{100 75}" // Threshold value of large mux rule +//-phy_largemux_input_threshold=512 +//-phy_largemux_select_threshold=16 +// -phy_largemux_cong_threshold=7.0 + // May use value of 0.0 to ignore congestion score for large mux scaling + +// -rule PHY_CriticalObjects // Reports critical objects (registers and ports) in the design + // Review with user, recommended as part of Congestion Debug Goal only + // in this goal, default CriticalObjects metric will be FICN, FOCN and FILD. +//-phy_criticalobjects_threshold=4 // Threshold value for PHY_CriticalObjects rule +//-phy_criticalobjects_max_objects=10000 // Maximum critical objects to be reported +-phy_calculate_fold=false // Enable reporting of fanout logic depth + // change above to true, if FOLD metric is required in PHY_CriticalObjects +-phy_criticalobjects_logicdepth_mode="ClkDelay" // Selects the logic depth rule variant used for PHY_CriticalObjects rule + // this must match LogicDepth selection, if PHY_CriticalObjects rule is enabled +-phy_criticalobjects_metric="{ {FICN {5000 1.0} {20000 2.0} {40000 4.0}} {FOCN {5000 1.0} {20000 2.0} {40000 4.0}} {FILD {90 1.0} {140 2.0} {160 4.0}} }" // Select metrics contributing to PHY_CriticalObjects rule + + +// -rule PHY_CellPinDensity // Reports pin density of technology library cells instantiated in each congested module of the design + +// -rule PHY_HighFanout // Reports high fanout nodes in the input design +// -phy_highfanout_threshold=500 // Minimum threshold for PHY_HighFanout rule + // Review threshold with users, a value of 1000 is recommend for gross violators + + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for general reports +// ---------------------------------------------------------------------------- + +-rule PHY_PhysicalSummary // Reports the Area_Congestion_Timing profile for the design at pre-floorplanned stage + +-rule PHY_Dashboard // Generates datasheet and dashboard reports + +-rule PHY_Reports // View all reports generated during SpyGlass Physical flow + +// ---------------------------------------------------------------------------- +// SpyGlass Physical Rules for customer requests +// ---------------------------------------------------------------------------- + +// Review all custom rules with user, including the threshold values + +// -rule PHY_LogicDepth_MM_ClkDelay // Reports PI-memory or reg-memory or memory-reg or memory-PO or memory-memory timing paths that exceed specified logic depth (based on percentage of clock period weighted delay) +// -phy_logicdepth_to_mm_clkdelay_threshold=50.0 // Minimum fanin logic depth threshold for PHY_LogicDepth_MM_ClkDelay rule +// -phy_logicdepth_from_mm_clkdelay_threshold=50.0 // Minimum fanout logic depth threshold for PHY_LogicDepth_MM_ClkDelay rule + +// -rule PHY_FaninCone_MM // Reports memory and black box objects with high number of sequential elements and ports in their fanin cone +// -phy_fanin_mm_threshold=10 // Minimum threshold for PHY_FaninCone_MM rule + +// -rule PHY_FanoutCone_MM // Reports memory and black box objects with high number of sequential elements and ports in their fanout cone +// -phy_fanout_mm_threshold=10 // Minimum threshold for PHY_FanoutCone_MM rule + +// -rule PHY_CriticalObjects_MM // Reports critical objects of memory and black box type in the design +// -phy_criticalobjects_mm_threshold=2.0 // Minimum threshold for PHY_CriticalObjects_MM rule +// -phy_fanin_mm_scale_factor=1.0 // Scaling factor used for calculating FaninCone weightage for PHY_CriticalObjects_MM rule +// -phy_fanout_mm_scale_factor=1.0 // Scaling factor used for calculating FanoutCone weightage for PHY_CriticalObjects_MM rule + // PHY_LargeMux scale factor used is same as for PHY_CriticalObjects rule + +// ---------------------------------------------------------------------------- +// LEGEND +// ------ +// 1. Rules that are recommended for this use model are enabled by default. +// 2. Rule that are available based on customer request, as well as rule parameter values +// that user can customize are included with comment. +// Uncomment to use these rules or parameters. +// 3. Rules that are not recommended for this use model, are not listed in this file. +// ---------------------------------------------------------------------------- + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff_debug_help.htm new file mode 100644 index 0000000..0834421 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff_debug_help.htm @@ -0,0 +1,73 @@ + + + + + + + + + + physical_analysis_signoff + + + + + + + + + + + + + +
    + +
    +

    +physical_analysis_signoff +

    +

    +This goal runs selected SpyGlass Physical Pre-Floorplan rules together with user-supplied vendor library. The rules are selected to signoff for area, timing and congestion aspects of user RTL design. +

    +

    +User inputs required for this goal are: +

    +
      +
    • Design RTL
    • +
    • SDC constraints
    • +
    • Technology library, compiled using SpyGlass Physical
    • +
    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff_setup.sgs new file mode 100644 index 0000000..7ddc7ee --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical/physical_analysis_signoff_setup.sgs @@ -0,0 +1,89 @@ +########################################################################## +# SpyGlass Physical Methodology +# +# Version: 1.0 +# +# Revision History: +# Ver Date Comments +# 1.0 16-Feb-2010 Initial Draft +# 1.1 02-Sep-2010 Support for honoring preset params from prj file +# 1.2 07-Sep-2010 Updated to correctly handle VI 47531 +# +# Copyright Atrenta Inc, 2010. All rights reserved. +########################################################################## +# This is the SGS script to setup PHYSICAL ANALYSIS SIGNOFF +########################################################################## + +if {[info exists env(SPYGLASS_PHYSICAL_HOME)] != 0} { + set MY_ENV_SGP_PATH $env(SPYGLASS_PHYSICAL_HOME)/common/sgphysical +} elseif {[info exists env(BP_HOME)] != 0} { + if {[file exists $env(BP_HOME)/sgphysical] != 0} { + set MY_ENV_SGP_PATH $env(BP_HOME)/sgphysical + } else { + set MY_ENV_SGP_PATH $env(BP_HOME)/../../common/sgphysical + } +} else { + return -code error "SPYGLASS_PHYSICAL_HOME/BP_HOME not set" +} + +########################################################################## +# Register Variables to be used in the script here +########################################################################## +# Variable to set path to user-specified technology library +register_variable Q_USER_TECHPATH "SGS_Unset" + +# Variable to set path to user-specified SDC file +register_variable Q_USER_SDCFILE "SGS_Unset" + +########################################################################## +# Initialize variables from value in project file (or corresponding parameter defaults) +########################################################################## +get_property console.parameterValue phy_tech_path -result_variable Q_USER_TECHPATH +get_property console.parameterValue phy_sdc -result_variable Q_USER_SDCFILE + +########################################################################## +# set_property -hide_step_numbering + +set_property -step_header "Introduction" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +set_property -restore_session_log -enable_next_button + +create_form -label "PASO_INTRODUCTION" { + show_html $MY_ENV_SGP_PATH/templates/html/paso_1_introduction.htm +} +set_header_state "Introduction" complete + +########################################################################## +set_property -step_header "Select Technology" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +create_form -label "PASO_SELECT_TECH" { + get_dir -text "Select Precompiled technology library directory, usually named sgp_tech" -type {"sgp_tech directory" "*"} -result_variable Q_USER_TECHPATH -geometry { -side bottom } -auto_proceed + show_html $MY_ENV_SGP_PATH/templates/html/paso_2_select_techlib.htm -geometry { -side bottom } +} +set_parameters_value {phy_tech_path get_variable $Q_USER_TECHPATH} +set_header_state "Select Technology" complete + +########################################################################## +set_property -step_header "Select SDC file" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +create_form -label "PASO_SELECT_SDC" { + get_file -text "Select SDC file" -type {"SDC File" "*.sdc"} -fileExt { "SDC File" "*.sdc" } -allow_multiple -result_variable Q_USER_SDCFILE -geometry { -side bottom } + show_html $MY_ENV_SGP_PATH/templates/html/paso_3_select_sdc.htm -geometry { -side bottom } +} +set_parameters_value {phy_sdc get_variable $Q_USER_SDCFILE} +set_header_state "Select SDC file" complete + +########################################################################## + +set_property -step_header "Setup optional parameter" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +create_form -label "PASO_SETUP_RULEPARA" { + set_parameters {phy_tech_path phy_sdc phy_optimization_effort phy_enable_hbo phy_blackbox_models_tcl_file phy_dont_use_cell_list phy_gatecount_depth phy_gatecount_module_size phy_gatecount_percent_size phy_gatearea_depth phy_gatearea_module_size phy_gatearea_percent_size phy_gatearea_cell_util phy_logicdepth_core_clkdelay_merge_bus phy_logicdepth_core_clkdelay_threshold phy_logicdepth_peri_clkdelay_merge_bus phy_logicdepth_peri_clkdelay_threshold phy_fanout_threshold phy_fanin_threshold phy_cong_module_size_low phy_cong_module_size_high phy_cong_module_count phy_cong_module_size phy_cong_threshold phy_cong_effort phy_enable_sequential_opt } -geometry { -side bottom } + show_html $MY_ENV_SGP_PATH/templates/html/paso_4_rule_customize.htm +} +set_header_state "Setup optional parameter" complete + +########################################################################## + +set_property -step_header "Setup Complete" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +set_header_state "Setup Complete" complete +create_form -label "PASO_Completed" { + show_text "Setup is successfully completed" +} + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/.submethodology_help new file mode 100644 index 0000000..4791a85 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/.submethodology_help @@ -0,0 +1,9 @@ +The Physical_aware_power methodology enables to run physical aware power estimation flow. This flow is the integration of SpyGlass Physical and SpyGlass Power products. The RTL design is synthesized using SpyGlass Physical timing optimization engine and power estimated using SpyGlass Power. The power estimation is accurate and close to silicon numbers. + +The following goals are part of this methodology. All the options relevant to this flow are enabled in the goals. + +1. physical_power_postfloorplan: The goal runs SpyGlass Physical and generates timing optimized netlist, capacitance and slew on input RTL design. + +2. power_est_average: The goal runs SpyGlass Power and estimates accurate power using above netlist, capacitance and slew values. + +Access to the licenses are required to run this flow. For a list of licenses, contact Synopsys Support. diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/doc/power_est_average.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/doc/power_est_average.htm new file mode 100644 index 0000000..4e17132 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/doc/power_est_average.htm @@ -0,0 +1,5 @@ + +

    +Introduction +

    +

    This goal estimates the average power of the design. You can supply the power data for standard cells in a sglib file. You can supply the activity data with a file such as VCD, FSDB or SAIF, or for an early estimate, by giving activity values for clocks and other key nets. diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/physical_power_postfloorplan.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/physical_power_postfloorplan.spq new file mode 100644 index 0000000..2c8f142 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/physical_power_postfloorplan.spq @@ -0,0 +1,62 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Template +// To be used with products released by Synopsys only +// +// physical_power_postfloorplan-mixed +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Version Comments +// 1.0.0 31-May-2013 5.1 Initial version +// 1.1.0 23-Jan-2014 5.2.1 Removed all rules +// +// Copyright Synopsys Inc, 2013. All rights reserved. +// +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +physical_power_postfloorplan +* +Perform physical analysis of the design block and generate the timing optimized design DB. +* +This goal performs Early Physical Analysis of the design and generates the timing-optimized design DB. This DB can be used to correctly estimate design power. +Design inputs required for physical analysis are + + i) Design RTL + ii) Library .lib & .lef + iii) SDC constraints + +The physical constraints for SpyGlass Physical Analysis can be specified in either of the following two formats: + + i) User-specified DEF file: + + - Block size & aspect ratio + - Pin placement (optional) + - Hard-macro pre-placements (optional) + - Placement or Routing Blockages (optional) + + ii) User-specified parameters + + - Block height & width + - Block utilization and aspect ratio + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +-mixed +-policy=physical +-physical_mode +-enable_pgnetlist +-policy=power_est +//-rule PHY_PhysicalSummary_FP +//-rule PHY_Timing_FP +//-rule PHY_CongestionMap_FP +//-rule PHY_Reports +//-rule PHY_Dashboard +-rule sgdc2sdc +-phy_vt_value=high +-phy_preserve_vt=false +-enable_physical_aware_pe +-phy_enable_macro_flattening=true +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/physical_power_postfloorplan_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/physical_power_postfloorplan_setup.sgs new file mode 100644 index 0000000..e1ae7b3 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/physical_power_postfloorplan_setup.sgs @@ -0,0 +1,204 @@ +########################################################################## +# SpyGlass Physical Methodology +# +# Version: 0.1 +# +# Revision History: +# Ver Date Comments +# 0.1 16-Feb-2010 Initial Draft +# 1.1 02-Sep-2010 Support for honoring preset params from prj file +# 1.2 07-Sep-2010 Updated to correctly handle VI 47531 +# +# Copyright Synopsys Inc, 2010. All rights reserved. +########################################################################## +# This is the SGS script to setup PHYSICAL ANALYSIS POSTFLOORPLAN +########################################################################## + +if {[info exists env(SPYGLASS_PHYSICAL_HOME)] != 0} { + set MY_ENV_SGP_PATH $env(SPYGLASS_PHYSICAL_HOME)/common/sgphysical +} elseif {[info exists env(BP_HOME)] != 0} { + if {[file exists $env(BP_HOME)/sgphysical] != 0} { + set MY_ENV_SGP_PATH $env(BP_HOME)/sgphysical + } else { + set MY_ENV_SGP_PATH $env(BP_HOME)/../../common/sgphysical + } +} else { + return -code error "SPYGLASS_PHYSICAL_HOME/BP_HOME not set" +} + +########################################################################## +# Register Variables to be used in the script here +# All variables pick up their default value from corresponding parameter defaults (if applicable) +# The value "SGS_Unset" is just a dummy value +########################################################################## +# Variable to set path to user-specified technology library +register_variable Q_USER_TECHPATH "SGS_Unset" + +# Variable to set path to user-specified SDC file +register_variable Q_USER_SDCFILE "SGS_Unset" + +# Variable to check how user would like to specify the FP constraints +register_variable Q_USER_FP_CHOICE "None" + +register_variable Q_USER_DEFFILE "SGS_Unset" +register_variable Q_USER_BLOCKUTIL "SGS_Unset" +register_variable Q_USER_STDCELLUTIL "SGS_Unset" +register_variable Q_USER_ASPECTR "SGS_Unset" + +# Variable to check how user would like to specify the FP constraints +#register_variable Q_USER_PE_CHOICE "Do not generate power report" + +#register_variable Q_USER_PE_FLAG "SGS_Unset" +#register_variable Q_USER_PE_ACTIVITY "SGS_Unset" +#register_variable Q_USER_PE_PROB "SGS_Unset" +#register_variable Q_USER_PE_FILENAME "SGS_Unset" +#register_variable Q_USER_PE_FILETYPE "SGS_Unset" +#register_variable Q_USER_PE_TOPMODULE "SGS_Unset" +#register_variable Q_USER_PE_STARTTIME "SGS_Unset" +#register_variable Q_USER_PE_ENDTIME "SGS_Unset" + +########################################################################## +# Initialize from Project settings +########################################################################## + +get_property console.parameterValue phy_tech_path -result_variable Q_USER_TECHPATH +get_property console.parameterValue phy_sdc -result_variable Q_USER_SDCFILE + +get_property console.parameterValue phy_def_file -result_variable Q_USER_DEFFILE +get_property console.parameterValue phy_aspect_ratio -result_variable Q_USER_ASPECTR +get_property console.parameterValue phy_block_utilization -result_variable Q_USER_BLOCKUTIL +get_property console.parameterValue phy_std_cell_utilization -result_variable Q_USER_STDCELLUTIL + +#get_property console.parameterValue phy_pi_activity -result_variable Q_USER_PE_ACTIVITY +#get_property console.parameterValue phy_pi_probability -result_variable Q_USER_PE_PROB +#get_property console.parameterValue phy_sim_data_file -result_variable Q_USER_PE_FILENAME +#get_property console.parameterValue phy_sim_file_type -result_variable Q_USER_PE_FILETYPE +#get_property console.parameterValue phy_sim_top_module -result_variable Q_USER_PE_TOPMODULE +#get_property console.parameterValue phy_sim_start_time -result_variable Q_USER_PE_STARTTIME +#get_property console.parameterValue phy_sim_end_time -result_variable Q_USER_PE_ENDTIME + +########################################################################## +########################################################################## + +set_property -step_header "Introduction" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +set_property -hide_step_numbering + +create_form -label "PAPR_INTRODUCTION" { + show_html $MY_ENV_SGP_PATH/templates/html/pppf_1_introduction.htm +} +set_header_state "Introduction" complete + +########################################################################## +set_property -step_header "Select Technology Library" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +create_form -label "PAPR_SELECT_TECH" { + get_dir -text "Specify Technology Library" -type {"sgp_tech directory" "*"} -result_variable Q_USER_TECHPATH -geometry { -side bottom } + show_html $MY_ENV_SGP_PATH/templates/html/pppf_2_select_techlib.htm -geometry { -side bottom } +} +set_parameters_value {phy_tech_path get_variable $Q_USER_TECHPATH} +set_header_state "Select Technology Library" complete + +########################################################################## +set_property -step_header "Select SDC file" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +create_form -label "PAPR_SELECT_SDC" { + get_file -text "Select SDC file" -type {"SDC File" "*.sdc"} -fileExt { "SDC File" "*.sdc" } -allow_multiple -result_variable Q_USER_SDCFILE -geometry { -side bottom } + show_html $MY_ENV_SGP_PATH/templates/html/pppf_3_select_sdc.htm -geometry { -side bottom } +} +set_parameters_value {phy_sdc get_variable $Q_USER_SDCFILE} +set_header_state "Select SDC file" complete + +########################################################################## +set_property -step_header "Specify FP constraints" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +create_form -label "PAPR_SET_FP_CONSTR" { + get_choice -text "Select how you would like to specify FP contraints" -list {"None" "DEF Input" "Block Utilization" "Std. cell Utilization"} -result_variable Q_USER_FP_CHOICE -geometry { -side bottom } + show_html $MY_ENV_SGP_PATH/templates/html/pppf_4_select_fp1.htm -geometry { -side bottom } +} +sgsIf { $Q_USER_FP_CHOICE == "None" } { + show_text "You have selected Default FP Initialization method which is 70 percent std. cell utilization. Please Click Next to proceed." + set_parameters_value {phy_std_cell_utilization "70.0"} + set_parameters_value {phy_aspect_ratio "1.0"} + set_parameters_value {phy_def_file "NULL"} + set_parameters_value {phy_block_utilization "NULL"} +} +sgsIf { $Q_USER_FP_CHOICE == "DEF Input" } { + create_form -label "FP_DEFFILE" { + get_file -text "Select DEF file: " -type {"DEF File" "*"} -result_variable Q_USER_DEFFILE -geometry { -side bottom } + show_text "You have selected FP Initialization by input DEF file. Please select DEF file:" -geometry { -side bottom } + } + set_parameters_value {phy_def_file get_variable $Q_USER_DEFFILE} + set_parameters_value {phy_std_cell_utilization "NULL"} + set_parameters_value {phy_block_utilization "NULL"} +} +sgsIf { $Q_USER_FP_CHOICE == "Block Utilization" } { + create_form -label "FP_BLOCKUTIL" { + get_string -text "Specify Block Aspect Ratio (Width/Height)" -result_variable Q_USER_ASPECTR -geometry { -side bottom } + get_string -text "Specify Block Utilization percentage (range 1-99)" -result_variable Q_USER_BLOCKUTIL -geometry { -side bottom } + show_text "You have selected FP Initialization based on user-specified Block utilization and aspect ratio" -geometry { -side bottom } + } + set_parameters_value {phy_block_utilization get_variable $Q_USER_BLOCKUTIL} + set_parameters_value {phy_aspect_ratio get_variable $Q_USER_ASPECTR} + set_parameters_value {phy_def_file "NULL"} + set_parameters_value {phy_std_cell_utilization "NULL"} +} +sgsIf { $Q_USER_FP_CHOICE == "Std. cell Utilization" } { + create_form -label "FP_STDCELLUTIL" { + get_string -text "Specify Block Aspect Ratio (Width/Height)" -result_variable Q_USER_ASPECTR -geometry { -side bottom } + get_string -text "Specify Std. Cell Utilization percentage (range 1-99)" -result_variable Q_USER_STDCELLUTIL -geometry { -side bottom } + show_text "You have selected FP Initialization based on user-specified Std. Cell utilization and aspect ratio" -geometry { -side bottom } + } + set_parameters_value {phy_std_cell_utilization get_variable $Q_USER_STDCELLUTIL} + set_parameters_value {phy_aspect_ratio get_variable $Q_USER_ASPECTR} + set_parameters_value {phy_def_file "NULL"} + set_parameters_value {phy_block_utilization "NULL"} +} +set_header_state "Specify FP constraints" complete + +########################################################################## +#set_property -step_header "Specify Power-est Setup" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +#create_form -label "PAPR_SET_PE_CONSTR" { + #get_choice -text "Select how you would like to specify Power-est setup" -list {"Default Prob. model" "FSDB/VCD input" "Do not generate power report"} -result_variable Q_USER_PE_CHOICE -geometry { -side bottom } + #show_html $MY_ENV_SGP_PATH/templates/html/pppf_5_setup_powerest.htm -geometry { -side bottom } +#} +#sgsIf { $Q_USER_PE_CHOICE == "Default Prob. model" } { + #create_form -label "PE_PROB" { + #get_string -text "Specify PROBABILITY for primary inputs (range 0.0-1.0)" -result_variable Q_USER_PE_PROB -geometry { -side bottom } + #get_string -text "Specify ACTIVITY for primary inputs (range 0.0-1.0)" -result_variable Q_USER_PE_ACTIVITY -geometry { -side bottom } + #show_text "You have selected Power-est based on default activity & probability specification on primary inputs." -geometry { -side bottom } + #} + #sgsSet Q_USER_PE_FLAG "true" + #set_parameters_value {phy_pi_activity get_variable $Q_USER_PE_ACTIVITY} + #set_parameters_value {phy_pi_probability get_variable $Q_USER_PE_PROB} + #set_parameters_value {phy_sim_data_file "NULL"} +#} +#sgsIf { $Q_USER_PE_CHOICE == "FSDB/VCD input" } { + #create_form -label "PE_FSDB" { + #get_string -text "Specify End time for activity data in FSDB/VCD" -result_variable Q_USER_PE_ENDTIME -geometry { -side bottom } + #get_string -text "Specify Start time for activity data in FSDB/VCD" -result_variable Q_USER_PE_STARTTIME -geometry { -side bottom } + #get_string -text "Specify module path name in FSDB/VCD file" -result_variable Q_USER_PE_TOPMODULE -geometry { -side bottom } + #get_choice -text "Select file type" -list {"FSDB" "VCD"} -result_variable Q_USER_PE_FILETYPE -buttons -geometry { -side bottom } + #get_file -text "Select FSDB/VCD file" -type {"FSDB/VCD File" "*"} -result_variable Q_USER_PE_FILENAME -geometry { -side bottom } + #show_text "You have selected Power-est based on activity data from user-input FSDB/VCD file" -geometry { -side bottom } + #} + #sgsSet Q_USER_PE_FLAG "true" + #set_parameters_value {phy_sim_data_file get_variable $Q_USER_PE_FILENAME} + #set_parameters_value {phy_sim_file_type get_variable $Q_USER_PE_FILETYPE} + #set_parameters_value {phy_sim_top_module get_variable $Q_USER_PE_TOPMODULE} + #set_parameters_value {phy_sim_start_time get_variable $Q_USER_PE_STARTTIME} + #set_parameters_value {phy_sim_end_time get_variable $Q_USER_PE_ENDTIME} +#} +#sgsIf { $Q_USER_PE_CHOICE == "Do not generate power report" } { + #show_text "You have selected NOT to report power-est sections in the physical summary report." + #sgsSet Q_USER_PE_FLAG "false" +#} +#set_parameters_value {phy_power_metric_report get_variable $Q_USER_PE_FLAG} +#set_header_state "Specify Power-est Setup" complete +# +########################################################################## +########################################################################## + +set_property -step_header "Setup Complete" -hide_label -show_index -enable_next_button -hide_quality_bar -show_progress_bar +set_header_state "Setup Complete" complete +create_form -label "PAPR_Completed" { + set_parameters {phy_tech_path phy_sdc phy_def_file phy_optimization_effort phy_enable_hbo phy_blackbox_models_tcl_file phy_dont_use_cell_list phy_def_file phy_def_out_file phy_block_utilization phy_std_cell_utilization phy_aspect_ratio } -geometry { -side bottom } + show_text "Setup is successfully completed. You may review final parameter values as below." +} + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/power_est_average.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/power_est_average.spq new file mode 100644 index 0000000..6c53cc2 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/power_est_average.spq @@ -0,0 +1,34 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal Template File +// +// power_est_average +// Version: 1.1 +// +// Revision History: +// Ver Date Comments +// 1.0 01-jul-2008 For Spyglass 4.1 release +// 1.1 15-may-2009 For Spyglass 4.3 release +// +// Copyright Synopsys Inc, 2008. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_est_average mixed +* +Estimates the average power of the design +* +This goal estimates the average power of the design. You can +supply the power data for standard cells in a sglib file. You +can supply the activity data with a file such as VCD, FSDB or +SAIF, or for an early estimate, by giving activity values for +clocks and other key nets. +=cut+++++++++++ + +-mixed +-policy=power_est +-rules PEPWR02 +-rules poweraudit +-enable_physical_aware_pe +--flat_disable_remove_rtlc_buffer +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/power_est_average_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/power_est_average_debug_help.htm new file mode 100644 index 0000000..79e7d98 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/power_est_average_debug_help.htm @@ -0,0 +1,68 @@ + + + + + + + + + + power_est_average + + + + + + + + + + + + + +


    + +
    +

    +power_est_average +

    +

    +This goal produces a report of the average power estimation. The power browser displays the power in a graphical form. To see this, select the PEPWR02 rule in the message tree and double click on it. The pe_summary.rpt report file contains the same overall power information as the graphical browser. It has several sections, including a summary, hierarchical power, clock power, and memory power. +

    +

    +The pe_design_stats.rpt report file contains information about the number of registers and combnational gates in the design; it also contains information about cells without power models. Several other reports are generated. For details, please see the Power Estimation Reports section of the Power Estimation Rule Reference Guide. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_1_introduction.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_1_introduction.htm new file mode 100644 index 0000000..9bd14e9 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_1_introduction.htm @@ -0,0 +1,109 @@ + + + + + + + + + + + +
    + +

    Introduction

    + +

    + This template performs Early Physical Analysis of the design and generates the timing-optimized design DB. This DB can be used to correctly estimate design power. + The following input is required from user: +

    + +

    1.    +Select Technology Library

    + +

    2.    +Select SDC file

    + +

    3.    +Specify Floorplanning Constraints (Optional)

    + + +

    Please Click Next to proceed.

    + +

     

    + +
    + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_2_select_techlib.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_2_select_techlib.htm new file mode 100644 index 0000000..68c47e9 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_2_select_techlib.htm @@ -0,0 +1,101 @@ + + + + + + + + + + + +
    + +

    1. Select Technology

    + +

    + This template requires a technology library to be selected for physical analysis. This template does not support a generic library. hence, user must specify a precompiled technology library in order to run this template. +

    + +

       +

    + +

    Please select technology library, then Click Next to proceed.

    + +

     

    + +
    + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_3_select_sdc.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_3_select_sdc.htm new file mode 100644 index 0000000..08577ef --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_3_select_sdc.htm @@ -0,0 +1,109 @@ + + + + + + + + + + + +
    + +

    2. Select SDC File

    + +

    + This template requires an SDC file, that defines following design information: +

    + +

    A)    +Clock definitions, defining all clocks and their frequency

    + +

    B)    +Input and Output port delays (Recommended, but not mandatory)

    + +

    C)    +Timing Exceptions (Recommended, but not mandatory)

    + +

     

    + +

    Please select SDC file using File Browser button.

    + +

     

    + +
    + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_4_select_fp1.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_4_select_fp1.htm new file mode 100644 index 0000000..72086f6 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_4_select_fp1.htm @@ -0,0 +1,112 @@ + + + + + + + + + + + +
    + +

    3. Select Floorplanning method

    + +

    + This template allows user to optionally specify FP constraints to control the floorplan method. Available choices are: +

    + +

    1)    +None - software defaults to 70 percent standard cell utilization, and square aspect ratio.

    + +

    2)    +DEF file - input by user

    + +

    3)    +Block utilization and aspect ratio - input by user

    + +

    4)    +Std. cell utilization and aspect ratio - input by user

    + +

     

    + +

    Please select the FP method you would like to use:

    + +

     

    + +
    + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_5_setup_powerest.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_5_setup_powerest.htm new file mode 100644 index 0000000..d23a9c5 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/pppf_5_setup_powerest.htm @@ -0,0 +1,109 @@ + + + + + + + + + + + +
    + +

    4. Select model or data for Power-Estimation report generation:

    + +

    + This template allows you to select one of the following options: +

    + +

    1)    +Generate power-estimate report based on statistical primary input activity

    + +

    2)    +Generate power-estimate report based on input VCD or FSDB file (Recommended method)

    + +

    3)    +Do not generate power-estimate report (Default method)

    + +

     

    + +

    Please select the Power-estimation method you would like to use:

    + +

     

    + +
    + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/regression_run.tcl b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/regression_run.tcl new file mode 100644 index 0000000..a9d32c4 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/physical_aware_power/regression_run.tcl @@ -0,0 +1 @@ +define_regression physical_aware_power_est -goals { physical_power_postfloorplan power_est_average } diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/.submethodology_help new file mode 100644 index 0000000..387c47c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/.submethodology_help @@ -0,0 +1 @@ +Expand to select the recommended goals for power estimation and reduction. The goals are applicable to the RTL stage of design. diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check.spq new file mode 100644 index 0000000..75cfd04 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check.spq @@ -0,0 +1,44 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_activity_check +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.1.0 Initial version +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_activity_check mixed +* +Performs activity analysis +* +This goal analyzes activity for a simulation testbench. For +simulation data such as VCD or FSDB, it produces a graph of +activity over time. +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PESAE04 //Reports activity captured by simulation file for the design. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check_debug_help.htm new file mode 100644 index 0000000..a47307b --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_activity_check + + + + + + + + + + + + + +
    + +
    +

    +power_activity_check +

    +

    +This goal displays a graph of activity over time for the selected simulation database. Select the PESAE04 rule in the message tree, open it, and double click on the message to view the graph browser. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check_setup.sgs new file mode 100644 index 0000000..68934ac --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_activity_check_setup.sgs @@ -0,0 +1,34 @@ +########################################################################## +# SpyGlass Goal Setup File +# +# Revision History: +# Ver Date Comments +# 1.0 24-Jun-2009 For Spyglass 4.3 release +# +# Copyright Synopsys Inc, 2009. All rights reserved. +########################################################################## + +register_variable ACTCHECK_SGDC "$PRJFILES_DIR/actcheck.sgdc" +set_property -hide_quality_bar -show_index -hide_step_numbering -show_progress + +# Introduction +set_property -step_header "Introduction" -enable_next_button +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_activity_check.htm +set_header_state "Introduction" complete + +# Instance list +set_property -step_header "Specify Instances" -enable_next_button +set_constraints2 {instance_trace} -sgdcFile {get_variable $ACTCHECK_SGDC} -hidden_fields {instance_trace:-clock} -sgdcTag "ACTCHECK_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/instance_trace.htm +set_header_state "Specify Instances" complete + +# Activity file +set_property -step_header "Specify Activity File" -enable_next_button +set_constraints2 {activity_data} -sgdcFile {get_variable $ACTCHECK_SGDC} -hidden_fields {activity_data:-weight,-sim_topname,-instname,-sim_rtl_design_nl,-mode,-use} -sgdcTag "ACTCHECK_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/activity_data.htm +set_header_state "Specify Activity File" complete + +# Closure +set_property -step_header "Setup Closure" -enable_next_button +source $SPYGLASS_HOME/.Methodology/Power/closure_step.sgs +set_header_state "Setup Closure" complete + +set_sgdc_state -enable $ACTCHECK_SGDC diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd.htm new file mode 100644 index 0000000..fb6f6bb --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd.htm @@ -0,0 +1,666 @@ + + + + + + + + + + + + + + + + + + + +
    + +

    Introduction

    + +

    This goal performs activity trigger detection for several +instances of the design. It computes activity over time for each instance and +detects the most significant activity events. It also reports trigger signals +for those events which are found by statistical analysis of the simulation +trace.

    + +

    By default the top most instances of the design are +analyzed, and two parameters are available:

    + +

    -          +pe_atd_max_num_modules_to_report: +defines the maximum number of instances which are analyzed

    + +

    -          +pe_atd_min_module_size: +defines the minimal size of a module to be analyzed (in terms of the number of its +leaf instances)

    + +

    If you wish to manually specify the instances, use next to +create the instance_trace constraint which can be set +in this screen. The activity trigger detection is performed from activity data +in VCD or FSDB format. Use the second screen to create the activity_data +constraint to specify the filename, format, and optionally the start and end +times.

    + +
    + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd.spq new file mode 100644 index 0000000..025e175 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd.spq @@ -0,0 +1,48 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_atd +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 16-Apr-2015 5.5.0 Initial version +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_atd mixed +* +Performs activity trigger detection +* +This goal analyzes activity for a simulation file. +It detects and reports signals which trigger significant activity change in the design +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEATD01 // activity trigger detection + +-pe_atd_min_module_size=50 +-pe_atd_enable_surge_detection=yes +-pe_atd_enable_glitch_detection=yes +-pe_atd_idle_filter_size=5 + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd_debug_help.htm new file mode 100644 index 0000000..736f572 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd_debug_help.htm @@ -0,0 +1,69 @@ + + + + + + + + + + power_activity_check + + + + + + + + + + + + + +
    + +
    +

    +power_atd +

    +

    +This goal performs activity trigger detection. It analyses a simulation file and detects signals which trigger significant changes in the design. +Three types of activity events are considered: idle/non-idle changes, +activity up/down surges, and glitches (abrupt and short loss of activity). +The analysis is performed for each instance or a specific set of instances specified through the instance_trace sgdc command. +Signals which are highly correlated to the detected activity events are reported. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd_setup.sgs new file mode 100644 index 0000000..d999bf4 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_atd_setup.sgs @@ -0,0 +1,34 @@ +########################################################################## +# SpyGlass Goal Setup File +# +# Revision History: +# Ver Date Comments +# 1.0 24-Jun-2009 For Spyglass 4.3 release +# +# Copyright Synopsys Inc, 2009. All rights reserved. +########################################################################## + +register_variable ATDCHECK_SGDC "$PRJFILES_DIR/atdcheck.sgdc" +set_property -hide_quality_bar -show_index -hide_step_numbering -show_progress + +# Introduction +set_property -step_header "Introduction" -enable_next_button +show_html $SPYGLASS_HOME/GuideWare3.0-EarlyAdopter/block/rtl_handoff/power/power_atd.htm +set_header_state "Introduction" complete + +# Instance list +set_property -step_header "Specify Instances" -enable_next_button +set_constraints2 {instance_trace} -sgdcFile {get_variable $ATDCHECK_SGDC} -hidden_fields {instance_trace:-clock} -sgdcTag "ATDCHECK_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/instance_trace.htm +set_header_state "Specify Instances" complete + +# Activity file +set_property -step_header "Specify Activity File" -enable_next_button +set_constraints2 {activity_data} -sgdcFile {get_variable $ATDCHECK_SGDC} -hidden_fields {activity_data:-weight,-sim_topname,-instname,-sim_rtl_design_nl,-mode,-use} -sgdcTag "ATDCHECK_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/activity_data.htm +set_header_state "Specify Activity File" complete + +# Closure +set_property -step_header "Setup Closure" -enable_next_button +source $SPYGLASS_HOME/.Methodology/Power/closure_step.sgs +set_header_state "Setup Closure" complete + +set_sgdc_state -enable $ATDCHECK_SGDC diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit.spq new file mode 100644 index 0000000..3824720 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit.spq @@ -0,0 +1,50 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_audit +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.1.0 Initial version +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_audit mixed +* +Performs audit check on the inputs for power estimation +* +This goal performs an audit of the design to list the key +parameters that will be used in a power estimation. While +running this goal, the input parameters, simulation +information, technology libraries etc should be the same as what +will be used for the actual power estimation run. This goal +will create a pe_audit report that will have the detailed report +of how power estimation will comprehend the various inputs. +Please review this report and make sure that it is in sync with +the expectations. +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules poweraudit //Generates audit reports for Power estimation rules + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit_debug_help.htm new file mode 100644 index 0000000..4e0dce7 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_audit + + + + + + + + + + + + + +
    + +
    +

    +power_audit +

    +

    +This goal helps to ensure that the library and design data is set up correctly before running power estimation. Select the power audit report in the report menu. Please see the Power Methodology Guide, section 5.4 for details on what to review. In particular, this report will help you to find cells with missing power models, two dimensional array nets which are not annotated in the simulation data, and other possible power estimation problems. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit_setup.sgs new file mode 100644 index 0000000..20c9336 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_audit_setup.sgs @@ -0,0 +1,50 @@ +########################################################################## +# SpyGlass Goal Setup File +# +# Revision History: +# Ver Date Comments +# 1.0 18-Aug-2008 For Spyglass 4.1 release +# 1.1 24-Jun-2009 For Spyglass 4.3 release +# +# Copyright Synopsys Inc, 2008. All rights reserved. +########################################################################## + +register_variable POWEREST_SGDC "$PRJFILES_DIR/powerest.sgdc" +source $SPYGLASS_HOME/auxi/common_setup/init_central.sgs +register_variable USE_BBOX_RESOLUTION 1 +register_variable USE_DESIGN_CLOCKS 1 +source $SPYGLASS_HOME/auxi/common_setup/get_central_status.sgs +set_property -hide_quality_bar -show_index -hide_step_numbering -show_progress + +# Introduction +set_property -step_header "Introduction" +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_audit.htm +set_header_state "Introduction" complete + +# Common setup +sgsSet STATUS {get_variable_global {$BBOX_RESOLUTION}} +sgsIf { $STATUS != 1} { + source $SPYGLASS_HOME/auxi/common_setup/bb_resolution/bb_resolution.sgs +} +sgsSet STATUS {get_variable_global {$DESIGN_CLOCKS}} +sgsIf { $STATUS != 1} { + source $SPYGLASS_HOME/.Methodology/Clock-reset/CDC-Setup-Manager/CDC_Setup_Manager_clock_setup.sgs +} +source $SPYGLASS_HOME/auxi/common_setup/power/power_bbox_setup.sgs + +# Activity file +set_property -step_header "Specify Activity File" -enable_next_button +set_constraints2 {activity_data} -sgdcFile {get_variable $POWEREST_SGDC} -hidden_fields {activity_data:-weight,-sim_topname,-instname,-sim_rtl_design_nl,-mode,-use} -sgdcTag "POWEREST_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/activity_data.htm +set_header_state "Specify Activity File" complete + +# VT mix percentage +set_property -step_header "Specify VT Mix" +set_constraints2 {vt_mix_percentage} -sgdcFile {get_variable $POWEREST_SGDC} -sgdcTag "POWEREST_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/vt_mix_percentage.htm +set_header_state "Specify VT Mix" complete + +# Closure +set_property -step_header "Setup Closure" +source $SPYGLASS_HOME/.Methodology/Power/closure_step.sgs +set_header_state "Setup Closure" complete + +set_sgdc_state -enable $POWEREST_SGDC diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_calibration.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_calibration.spq new file mode 100644 index 0000000..b808c02 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_calibration.spq @@ -0,0 +1,63 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// power_calibration +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 13-Jun-2014 5.3.0 Initial version +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_calibration mixed +* +Generates the calibration data +* +This goal generates calibration data. It generates the sgdc file showing the +percentage cell allocation and percentage distribution of vt_mix in current +design. It generates the clock buffer information from the netlist design and +generates a sgdc file. It also creates a wireload based on input design and +corresponding SPEF file +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-pe_generate_calibration_data=all //configures which all calibration data is to be generated + +-pe_calibration_data_dir=./sg_calibration_data //Specify the directory path where the calibration data should be generated + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + + +-rules PEVTDIST //Generates the sgdc constraints showing percentage distribution of vt_mix in current design + +-rules PECLKTREE //Generates the clock buffer information from the netlist design + +-rules PECELLDIST //Generates the sgdc constraints showing the percentage cell allocation in current design + +-rules PECWL //creates wireload based on input design and corresponding SPEF file + +-rules PESLEWEXTRACT //Extracts the default slew from the design. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_calibration_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_calibration_debug_help.htm new file mode 100644 index 0000000..b93f65f --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_calibration_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_calibration + + + + + + + + + + + + + +
    + +
    +

    +power_calibration +

    +

    +This goal generates calibration data. It generates the sgdc file showing the percentage cell allocation and percentage distribution of vt_mix in current design. It generates the clock buffer information from the netlist design and generates a sgdc file. It also creates a wireload based on input design and corresponding SPEF file +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling.spq new file mode 100644 index 0000000..5a4cab2 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling.spq @@ -0,0 +1,75 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : power_cge_profiling +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Nov-2016 2017.03 Initial version +// +// Copyright Synopsys Inc, 2016. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_cge_profiling mixed +* +Locates opportunities for power reduction using advanced techniques and reports power savings from these opportunities +This goal enables fsdb trace for PR opportunities and D^Q enable. +* +Locates opportunities for power reduction using advanced +techniques and reports power savings from these +opportunites. For registers that do not have any +enable, this goal finds new enables. For the registers +that already has an enable, this goal finds stronger enables +that will switch off the clock for a larger duration than +the original enable. Additionally this goal estimates +power savings when a memory in design is replaced with an +equivalent half size memory or an equivalent quarter size memory. +=cut++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +-rme_active2 //RTL modification status + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-pe_ignore_clock_xor=1 //This flag is used to enable/disable the handling of Xor gate in clock path while searching for ICG + +-pe_enable_fsdb_trace=1 + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPWR18 //Estimates power savings when a memory in design is replaced with an equivalent half size memory or an equivalent quarter size memory. + +-rules PEPWR13 //Generates the report for power savings of non gated flops in the design + +-rules PEPWR06 //Reports module wise summary of the clock gating enables in the design and their effectiveness. + +-rules poweraudit //Generates audit reports for Power estimation rules + +-rules PEPWR20 //Finds new clock gating opportunities by ODC(observability don't care) technique and estimates the power savings. + +-rules PEPWR21 //Finds new clock gating opportunities by STC(Stability Condition) technique and estimates the power savings. + +-rules PEPWR22 //Finds better enable using ODC techniques for registers that are already gated and estimates the power savings. + +-rules PEPWR23 //Finds better enable using STC techniques for registers that are already gated and estimates the power savings. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling_est.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling_est.spq new file mode 100644 index 0000000..eadf6ed --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling_est.spq @@ -0,0 +1,61 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal Template File +// +// power_cge_profiling_est +// Version: 1.0 +// +// Revision History: +// Ver Date Comments +// 1.0 21-jul-2014 For Spyglass 5.3.0.2 release +// +// Copyright Synopsys Inc, 2014. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_cge_profiling_est mixed +* +Estimates the average power of the design and reports various power components and activity profiling information +This goal also enables fsdb trace for potential clock gating opportunities +* +Estimates the average power of the design and reports various power components and activity profiling information +=cut+++++++++++ + + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +-pe_run_profiling=1 //Controls the license usage for availability of profiling information during the power estimation runs + +-pe_enable_fsdb_trace=1 + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPWR02 //Estimates the leakage, switching and internal powers dissipated during the complete period for the design using activity analysis + +-rules PEPWR03 //Estimates power savings when clock gating is implemented to replace data-muxing controlled by enable signal for flip-flops + +-rules PEPWR05 //Estimates power savings due to existing clock gatings. + +-rules PEPWR06 //Reports module wise summary of the clock gating enables in the design and their effectiveness. + +-rules PESTR26 //Reports all the registers in the design along with their frequency information + +-rules PESTR27 //Generates clock domain wise activity of the design. + +-rules PESTR31 //Clock domain wise clock gating report + +-rules poweraudit //Generates audit reports for Power estimation rules + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling_save.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling_save.spq new file mode 100644 index 0000000..37ad4fb --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_cge_profiling_save.spq @@ -0,0 +1,46 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : power_cge_profiling_save +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 19-Sep-2017 2017.03 Initial version +// +// Copyright Synopsys Inc, 2016. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_cge_profiling_save mixed +* +Saves design database compatible with power_cge_profiling without running any flat rules +* +Saves design database compatible with power_cge_profiling without running any flat rules +=cut++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ +-pe_sim_minclk=1 +--exit_on_save +-pe_enable_fsdb_trace=1 +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ +-rules PEPWR20 //Finds new clock gating opportunities by ODC(observability don't care) technique and estimates the power savings. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average.spq new file mode 100644 index 0000000..82c534e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average.spq @@ -0,0 +1,48 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_est_average +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.1.0 Initial version +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_est_average mixed +* +Estimates the average power of the design +* +This goal estimates the average power of the design. You can +supply the power data for standard cells in a sglib file. You +can supply the activity data with a file such as VCD, FSDB or +SAIF, or for an early estimate, by giving activity values for +clocks and other key nets. +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules poweraudit //Generates audit reports for Power estimation rules. + +-rules PEPWR02 //Estimates the leakage, switching and internal powers dissipated during the complete period for the design using activity analysis. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average_debug_help.htm new file mode 100644 index 0000000..79e7d98 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average_debug_help.htm @@ -0,0 +1,68 @@ + + + + + + + + + + power_est_average + + + + + + + + + + + + + +
    + +
    +

    +power_est_average +

    +

    +This goal produces a report of the average power estimation. The power browser displays the power in a graphical form. To see this, select the PEPWR02 rule in the message tree and double click on it. The pe_summary.rpt report file contains the same overall power information as the graphical browser. It has several sections, including a summary, hierarchical power, clock power, and memory power. +

    +

    +The pe_design_stats.rpt report file contains information about the number of registers and combnational gates in the design; it also contains information about cells without power models. Several other reports are generated. For details, please see the Power Estimation Reports section of the Power Estimation Rule Reference Guide. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average_setup.sgs new file mode 100644 index 0000000..04acf6e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_average_setup.sgs @@ -0,0 +1,50 @@ +########################################################################## +# SpyGlass Goal Setup File +# +# Revision History: +# Ver Date Comments +# 1.0 18-Aug-2008 For Spyglass 4.1 release +# 1.1 24-Jun-2009 For Spyglass 4.3 release +# +# Copyright Synopsys Inc, 2008. All rights reserved. +########################################################################## + +register_variable POWEREST_SGDC "$PRJFILES_DIR/powerest.sgdc" +source $SPYGLASS_HOME/auxi/common_setup/init_central.sgs +register_variable USE_BBOX_RESOLUTION 1 +register_variable USE_DESIGN_CLOCKS 1 +source $SPYGLASS_HOME/auxi/common_setup/get_central_status.sgs +set_property -hide_quality_bar -show_index -hide_step_numbering -show_progress + +# Introduction +set_property -step_header "Introduction" +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_est_average.htm +set_header_state "Introduction" complete + +# Common setup +sgsSet STATUS {get_variable_global {$BBOX_RESOLUTION}} +sgsIf { $STATUS != 1} { + source $SPYGLASS_HOME/auxi/common_setup/bb_resolution/bb_resolution.sgs +} +sgsSet STATUS {get_variable_global {$DESIGN_CLOCKS}} +sgsIf { $STATUS != 1} { + source $SPYGLASS_HOME/.Methodology/Clock-reset/CDC-Setup-Manager/CDC_Setup_Manager_clock_setup.sgs +} +source $SPYGLASS_HOME/auxi/common_setup/power/power_bbox_setup.sgs + +# Activity file +set_property -step_header "Specify Activity File" -enable_next_button +set_constraints2 {activity_data} -sgdcFile {get_variable $POWEREST_SGDC} -hidden_fields {activity_data:-weight,-sim_topname,-instname,-sim_rtl_design_nl,-mode,-use} -sgdcTag "POWEREST_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/activity_data.htm +set_header_state "Specify Activity File" complete + +# VT mix percentage +set_property -step_header "Specify VT Mix" +set_constraints2 {vt_mix_percentage} -sgdcFile {get_variable $POWEREST_SGDC} -sgdcTag "POWEREST_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/vt_mix_percentage.htm +set_header_state "Specify VT Mix" complete + +# Closure +set_property -step_header "Setup Closure" +source $SPYGLASS_HOME/.Methodology/Power/closure_step.sgs +set_header_state "Setup Closure" complete + +set_sgdc_state -enable $POWEREST_SGDC diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_profiling.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_profiling.spq new file mode 100644 index 0000000..36dce8e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_profiling.spq @@ -0,0 +1,58 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal Template File +// +// power_est_profiling +// Version: 1.0 +// +// Revision History: +// Ver Date Comments +// 1.0 21-jul-2014 For Spyglass 5.3.0.2 release +// +// Copyright Synopsys Inc, 2014. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_est_profiling mixed +* +Estimates the average power of the design and reports various power components and activity profiling information +* +Estimates the average power of the design and reports various power components and activity profiling information +=cut+++++++++++ + + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +-pe_run_profiling=1 //Controls the license usage for availability of profiling information during the power estimation runs + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPWR02 //Estimates the leakage, switching and internal powers dissipated during the complete period for the design using activity analysis + +-rules PEPWR03 //Estimates power savings when clock gating is implemented to replace data-muxing controlled by enable signal for flip-flops + +-rules PEPWR05 //Estimates power savings due to existing clock gatings. + +-rules PEPWR06 //Reports module wise summary of the clock gating enables in the design and their effectiveness. + +-rules PESTR26 //Reports all the registers in the design along with their frequency information + +-rules PESTR27 //Generates clock domain wise activity of the design. + +-rules PESTR31 //Clock domain wise clock gating report + +-rules poweraudit //Generates audit reports for Power estimation rules + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_profiling_save.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_profiling_save.spq new file mode 100644 index 0000000..fdaad04 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_est_profiling_save.spq @@ -0,0 +1,46 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal Template File +// +// power_est_profiling_save +// Version: 1.0 +// +// Revision History: +// Ver Date Comments +// 1.0 19-Sep-2017 For Spyglass 17.03-SP2-1 release +// +// Copyright Synopsys Inc, 2016. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_est_profiling_save mixed +* +Saves design database compatible with power_est_profiling without running any flat rules +* +Saves design database compatible with power_est_profiling without running any flat rules +=cut++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ +-pe_sim_minclk=1 +--exit_on_save + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ +-rules PEPWR02 //Estimates the leakage, switching and internal powers dissipated during the complete period for the design using activity analysis + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_factor_conditions.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_factor_conditions.spq new file mode 100644 index 0000000..fbf8837 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_factor_conditions.spq @@ -0,0 +1,49 @@ +// ---------------------------------------------------------------------------- +// SpyGlass EarlyAdopter Goal File +// +// Goal Name : power_factor_conditions +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 27-Oct-2017 2017.03-SP2-2 Initial version +// +// Copyright Synopsys, 2017. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_factor_conditions mixed +* +Extract cell when conditions from libs. +* +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-pe_wtc_mem_conditions=1 + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEMEMCOND +-rules PECHECK04 + + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_factor_values.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_factor_values.spq new file mode 100644 index 0000000..103b93e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_factor_values.spq @@ -0,0 +1,47 @@ +// ---------------------------------------------------------------------------- +// SpyGlass EarlyAdopter Goal File +// +// Goal Name : power_factor_values +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 27-Oct-2017 2017.03-SP2-2 Initial version +// +// Copyright Synopsys, 2017. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_factor_values mixed +* +Generate weight model for all nets. +* +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-pe_toggle_activity_bucket_for_swave=1 + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPTAB01 + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify.spq new file mode 100644 index 0000000..9072036 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify.spq @@ -0,0 +1,45 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_fix_verify +// Version: 1.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0 04-Apr-2015 5.5 Initial version +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_fix_verify mixed +* +Runs automatic RTL modification suggested by power reduction recommendations followed by sequential equivalence checking(SEC) on designs before and after modification. +* +Runs automatic RTL modification suggested by power reduction recommendations followed by sequential equivalence checking(SEC) on designs before and after modification. +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +-sgsyn_opt_file $SPYGLASS_HOME/GuideWare/latest/soc/rtl_handoff/power/red_opt.tcl //Configuration file for synthesis + +-disallow_view_delete //To disable view deletion, required For RTL modification engine to work + +-classic_mode //To run rules in CLASSIC synthesis mode +-pe_generate_equiv_sim_file +-pe_disable_goal_consolidation +-pe_auto_infer_rme=1 +-rme_active + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify_debug_help.htm new file mode 100644 index 0000000..080edfc --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_fix_verify + + + + + + + + + + + + + +
    + +
    +

    +power_fix_verify +

    +

    +This goal generates modified RTL after a power reduction run is completed and reports the status of each modification as reported by SEC. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify_setup.sgs new file mode 100644 index 0000000..6c78ebf --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_fix_verify_setup.sgs @@ -0,0 +1,17 @@ +set_property -show_index +set_property -hide_step_numbering + +set_property -step_header "Before You Start" -show_progress_bar -hide_quality_bar +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_fix_verify_bys.htm +set_header_state "Before You Start" complete + + +set_property -step_header "Set Parameters" +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_fix_verify_parameters.htm +set_parameters rme_selection +set_header_state "Set Parameters" complete + +set_property -step_header "Setup Closure" +show_text " Setup is complete and verified " +set_header_state "Setup Closure" complete + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_gen_pesd.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_gen_pesd.spq new file mode 100644 index 0000000..84c4cad --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_gen_pesd.spq @@ -0,0 +1,53 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : power_gen_pesd +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 08-Jan-2015 5.4.1 Initial version +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_gen_pesd mixed +* +Generates the list of Power-Essential signals for power estimation +* +By extracting the Power-Essential signals in a design, this goal generates a +list of Power-Essential signals that can by used to reduce the simulation +data, with minimum loss in power estimation accuracy. +Power-Essential signals are crucial signals that identify key nodes, which +need to be annotated in the design. Tools used for power estimation can +subsequently propagate toggle rate and probability onto other signals with +minimal loss of accuracy. +Use this goal to reduce the size of simulation data represented in FSDB +format. +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commandus +//------------------------------------------------ + +-mixed //Allow mixed language +-classic_mode //Allow classic mode +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPESD01 +// The PEPESD01 rule generates a list of Power-Essential signals from the +//design, which must be captured during simulation to perform the power +//estimation with reasonable accuracy. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_guidance.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_guidance.spq new file mode 100644 index 0000000..b226e74 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_guidance.spq @@ -0,0 +1,58 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal Template File +// +// power_guidance +// Version: 1.0 +// +// Revision History: +// Ver Date Comments +// 1.0 19-may-2014 For Spyglass 5.3 release + +// +// Copyright Synopsys Inc, 2014. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_guidance mixed +* +Performs high level micro-architectural analysis and reports on aspects of how flops are used in the design. +* +This goal creates various reports reporting information on the use of flops in the design and looking for higher level architectural power reductions. +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PESTR08 //Reports gated clocks that can be shared across the module boundaries. + +-rules PESTR09 //Enable signal should be a state signal and latched in the inactive half of the clock cycle. + +-rules PESTR10 //Flags cascaded gated clocks in the design. + +-rules PESTR11 //Reports clock gating/Memory enable signals that are held at a constant value i.e. being tied high/low + +-rules PESTR12 //Flags the gated clocks that may be further gated by power synthesis tools. + +-rules PESTR32 //Flag a flop that is never idle and at-least one constant is assigned to it + +-rules PRARITH01 //Detection and classification of operator groups with glitchy inputs. + +-rules PRCOUNT01 //Detects and report signal that can be used to gate the counter + +//-rules PRFIFOS01 //Detection and classification of FIFOs. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction.spq new file mode 100644 index 0000000..af4f33e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction.spq @@ -0,0 +1,70 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power__mem_reduction +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 25-Nov-2013 5.2.0 Initial version +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_mem_reduction mixed +* +Reports power savings using memory power reduction techniques and register power reduction techniques. +* +Reports power savings using memory power reduction techniques and register power reduction techniques. +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +-rme_active2 //RTL modification status + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-pe_ignore_clock_xor=1 //This flag is used to enable/disable the handling of Xor gate in clock path while searching for ICG + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPWR06 //Reports module wise summary of the clock gating enables in the design and their effectiveness. + +-rules PEPWR24 //Finds memory gating opportunities by STC(Stability Condition) technique and estimates the power savings. + +-rules PEPWR25 //Finds memory gating opportunities by ODC(observability don't care) technique and estimates power savings. + +-rules PEPWR28 //Finds memory gating opportunities by STC(Stability Condition) technique for gating write pin and estimates the power savings. + +-rules PEPWR18 //Estimates power savings when a memory in design is replaced with an equivalent half size memory or an equivalent quarter size memory. + +-rules PEPWR13 //Generates the report for power savings of non gated flops in the design. + +-rules poweraudit //Generates audit reports for Power estimation rules + +-rules PEPWR20 //Finds new clock gating opportunities by ODC(observability don't care) technique and estimates the power savings. + +-rules PEPWR21 //Finds new clock gating opportunities by STC(Stability Condition) technique and estimates the power savings. + +-rules PEPWR22 //Finds better enable using ODC techniques for registers that are already gated and estimates the power savings. + +-rules PEPWR23 //Finds better enable using STC techniques for registers that are already gated and estimates the power savings. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction_debug_help.htm new file mode 100644 index 0000000..75041ba --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_mem_reduction + + + + + + + + + + + + + +
    + +
    +

    +power_mem_reduction +

    +

    +This goal finds a number of potential power saving opportunities in the design. This goal assumes you are early in the design flow and you do not have simulation data or a technology library. So it does not compute the amount of power savings; to see power values, run the power_reduction_adv goal instead. The first result to review should be the PESTR06 spreadsheet. Select the PESTR06 rule in the message tree and double-click to display a spreadsheet. This shows a "scorecard" for each module in the design with statistics on the number of existing explicit, and potential new implicit enables. Next, review the register and memory power reduction opportunites by double clicking on the violation messages of PERES01 and PERES02 rules. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction_setup.sgs new file mode 100644 index 0000000..2188dc0 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mem_reduction_setup.sgs @@ -0,0 +1,47 @@ +########################################################################## +# SpyGlass Goal Setup File +# +# Revision History: +# Ver Date Comments +# 1.0 24-Jun-2009 For Spyglass 4.3 release +# +# Copyright Synopsys Inc, 2009. All rights reserved. +########################################################################## + +register_variable EARLY_SGDC "$PRJFILES_DIR/early.sgdc" +source $SPYGLASS_HOME/auxi/common_setup/init_central.sgs +register_variable USE_BBOX_RESOLUTION 1 +register_variable USE_DESIGN_CLOCKS 1 +source $SPYGLASS_HOME/auxi/common_setup/get_central_status.sgs +set_property -hide_quality_bar -show_index -hide_step_numbering -show_progress + +# Introduction +set_property -step_header "Introduction" +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_mem_reduction.htm +set_header_state "Introduction" complete + +# Common setup +sgsSet STATUS {get_variable_global {$BBOX_RESOLUTION}} +sgsIf { $STATUS != 1} { + source $SPYGLASS_HOME/auxi/common_setup/bb_resolution/bb_resolution.sgs +} +sgsSet STATUS {get_variable_global {$DESIGN_CLOCKS}} +sgsIf { $STATUS != 1} { + source $SPYGLASS_HOME/.Methodology/Clock-reset/CDC-Setup-Manager/CDC_Setup_Manager_clock_setup.sgs +} +# Activity file +set_property -step_header "Specify Activity File" +set_constraints2 {activity_data} -sgdcFile {get_variable $EARLY_SGDC} -hidden_fields {activity_data:-weight,-sim_topname,-instname,-sim_rtl_design_nl,-mode,-use} -sgdcTag "EARLY_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/activity_data.htm +set_header_state "Specify Activity File" complete + +set_property -step_header "AutoFix Setup" -enable_next_button +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_autofix.htm +set_parameters rme_active +set_header_state "AutoFix Setup" complete + +# Closure +set_property -step_header "Setup Closure" +source $SPYGLASS_HOME/.Methodology/Power/closure_step.sgs +set_header_state "Setup Closure" complete + +set_sgdc_state -enable $EARLY_SGDC diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-mixed.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-mixed.spq new file mode 100644 index 0000000..ec19b06 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-mixed.spq @@ -0,0 +1,28 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal Template File +// +// power_mode_detection +// Version: 1.0 +// +// Revision History: +// Ver Date Comments +// 1.0 04-may-2011 For Spyglass 4.6 release +// +// Copyright Atrenta Inc, 2011. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_mode_detection mixed +* +For auto-detection of different design modes based on simulation information +* +This goal automatically detects modes based on logical conditions which +can be specfied using 'mode_condition' constraint. Mode condition can +be creating a logical expression of valid nets in design. Before +creating a 'mode_condition' please also define a mode set using constraint +'mode_set'. +This goal requires simulation data as VCD file(s) or FSDB file(s). +=cut+++++++++++ + +-mixed +-policy=power_est +-rules PESAE08 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-verilog.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-verilog.spq new file mode 100644 index 0000000..bb0dc8c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-verilog.spq @@ -0,0 +1,28 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal Template File +// +// power_mode_detection +// Version: 1.0 +// +// Revision History: +// Ver Date Comments +// 1.0 04-may-2011 For Spyglass 4.6 release +// +// Copyright Atrenta Inc, 2011. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_mode_detection verilog +* +For auto-detection of different design modes based on simulation information +* +This goal automatically detects modes based on logical conditions which +can be specfied using 'mode_condition' constraint. Mode condition can +be creating a logical expression of valid nets in design. Before +creating a 'mode_condition' please also define a mode set using constraint +'mode_set'. +This goal requires simulation data as VCD file(s) or FSDB file(s). +=cut+++++++++++ + +-verilog +-policy=power_est +-rules PESAE08 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-vhdl.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-vhdl.spq new file mode 100644 index 0000000..a5cf02a --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection-vhdl.spq @@ -0,0 +1,28 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal Template File +// +// power_mode_detection +// Version: 1.0 +// +// Revision History: +// Ver Date Comments +// 1.0 04-may-2011 For Spyglass 4.6 release +// +// Copyright Atrenta Inc, 2011. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_mode_detection vhdl +* +For auto-detection of different design modes based on simulation information +* +This goal automatically detects modes based on logical conditions which +can be specfied using 'mode_condition' constraint. Mode condition can +be creating a logical expression of valid nets in design. Before +creating a 'mode_condition' please also define a mode set using constraint +'mode_set'. +This goal requires simulation data as VCD file(s) or FSDB file(s). +=cut+++++++++++ + +-vhdl +-policy=power_est +-rules PESAE08 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection_debug_help.htm new file mode 100644 index 0000000..8ff6dc1 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_mode_detection_debug_help.htm @@ -0,0 +1,68 @@ + + + + + + + + + + power_mode_detection + + + + + + + + + + + + + +
    + +
    +

    +power_mode_detection +

    +

    +This goal automatically detects modes based on logical conditions which can be specified using 'mode_condition' constraint. Mode condition can be creating a logical expression of valid nets in design. Before creating a 'mode_condition' please also define a mode set using constraint 'mode_set'. This goal requires simulation data as VCD file(s) or FSDB file(s). +

    +

    +The pe_activity.rpt report file contains information about the detected modes. details, please see the Power Estimation Reports section of the Power Estimation Rule Reference Guide. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv.spq new file mode 100644 index 0000000..9c474e7 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv.spq @@ -0,0 +1,73 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_reduction_adv +// Version: 1.1.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Feb-2013 5.1.0 Initial version +// 1.1.0 26-Nov-2013 5.2.0 Aligned Guideware to Methodology template +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_reduction_adv mixed +* +Locates opportunities for power reduction using advanced techniques and reports power savings from these opportunities +* +Locates opportunities for power reduction using advanced +techniques and reports power savings from these +opportunites. For registers that do not have any +enable, this goal finds new enables. For the registers +that already has an enable, this goal finds stronger enables +that will switch off the clock for a larger duration than +the original enable. Additionally this goal estimates +power savings when a memory in design is replaced with an +equivalent half size memory or an equivalent quarter size memory. +=cut++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +-rme_active2 //RTL modification status + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-pe_ignore_clock_xor=1 //This flag is used to enable/disable the handling of Xor gate in clock path while searching for ICG + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPWR18 //Estimates power savings when a memory in design is replaced with an equivalent half size memory or an equivalent quarter size memory. + +-rules PEPWR13 //Generates the report for power savings of non gated flops in the design + +-rules PEPWR06 //Reports module wise summary of the clock gating enables in the design and their effectiveness. + +-rules poweraudit //Generates audit reports for Power estimation rules + +-rules PEPWR20 //Finds new clock gating opportunities by ODC(observability don't care) technique and estimates the power savings. + +-rules PEPWR21 //Finds new clock gating opportunities by STC(Stability Condition) technique and estimates the power savings. + +-rules PEPWR22 //Finds better enable using ODC techniques for registers that are already gated and estimates the power savings. + +-rules PEPWR23 //Finds better enable using STC techniques for registers that are already gated and estimates the power savings. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv_debug_help.htm new file mode 100644 index 0000000..62678af --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_reduction_medium_effort + + + + + + + + + + + + + +
    + +
    +

    +power_reduction_medium_effort +

    +

    +This goal finds a number of potential power saving opportunities in the design. Review the new and stronger enables in the design by selecting the PEPWR20, PEPWR21, PEPWR22 and PEPWR23 rules and double-clicking to see the spreadsheet. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv_setup.sgs new file mode 100644 index 0000000..ac90f54 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_reduction_adv_setup.sgs @@ -0,0 +1,57 @@ +########################################################################## +# SpyGlass Goal Setup File +# +# Revision History: +# Ver Date Comments +# 1.0 18-Aug-2008 For Spyglass 4.1 release +# 1.1 24-Jun-2009 For Spyglass 4.3 release +# +# Copyright Synopsys Inc, 2008. All rights reserved. +########################################################################## + +register_variable POWEREST_SGDC "$PRJFILES_DIR/powerest.sgdc" +source $SPYGLASS_HOME/auxi/common_setup/init_central.sgs +register_variable USE_BBOX_RESOLUTION 1 +register_variable USE_DESIGN_CLOCKS 1 +source $SPYGLASS_HOME/auxi/common_setup/get_central_status.sgs +set_property -hide_quality_bar -show_index -hide_step_numbering -show_progress + +# Introduction +set_property -step_header "Introduction" +#show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_med_reduction.htm +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_reduction_adv.htm +set_header_state "Introduction" complete + +# Common setup +sgsSet STATUS {get_variable_global {$BBOX_RESOLUTION}} +sgsIf { $STATUS != 1} { + source $SPYGLASS_HOME/auxi/common_setup/bb_resolution/bb_resolution.sgs +} +sgsSet STATUS {get_variable_global {$DESIGN_CLOCKS}} +sgsIf { $STATUS != 1} { + source $SPYGLASS_HOME/.Methodology/Clock-reset/CDC-Setup-Manager/CDC_Setup_Manager_clock_setup.sgs +} +source $SPYGLASS_HOME/auxi/common_setup/power/power_bbox_setup.sgs + + +# Activity file +set_property -step_header "Specify Activity File" +set_constraints2 {activity_data} -sgdcFile {get_variable $POWEREST_SGDC} -hidden_fields {activity_data:-weight,-sim_topname,-instname,-sim_rtl_design_nl,-mode,-use} -sgdcTag "POWEREST_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/activity_data.htm +set_header_state "Specify Activity File" complete + +# VT mix percentage +set_property -step_header "Specify VT Mix" +set_constraints2 {vt_mix_percentage} -sgdcFile {get_variable $POWEREST_SGDC} -sgdcTag "POWEREST_SGDC" -html $SPYGLASS_HOME/htmlhelp/power_est/vt_mix_percentage.htm +set_header_state "Specify VT Mix" complete + +set_property -step_header "AutoFix Setup" -enable_next_button +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_autofix.htm +set_parameters rme_active +set_header_state "AutoFix Setup" complete + +# Closure +set_property -step_header "Setup Closure" +source $SPYGLASS_HOME/.Methodology/Power/closure_step.sgs +set_header_state "Setup Closure" complete + +set_sgdc_state -enable $POWEREST_SGDC diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec.spq new file mode 100644 index 0000000..01900c0 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec.spq @@ -0,0 +1,55 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_sec +// Version: 1.0.1 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 26-Nov-2013 5.2.0 Initial version +// 1.0.1 13-Jun-2014 5.3.0 Change of goal name +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_sec mixed +* +Performs sequential equivalence checking on designs before and after power optimization. +* +This goal performs sequential equivalence checking on designs before and after power +optimization. The goal runs in DDR (Dual Design Read) mode and reads in 2 designs. The first +design is the modified RTL created by autofix ( or user) based on power reduction recommendations. +The second design is the original RTL. +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=sec + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +-sgsyn_opt_file $SPYGLASS_HOME/GuideWare/latest/soc/rtl_handoff/power/sec_opt.tcl //Configuration file for synthesis + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-sec_abstract_clock=1 //This parameter specifies whether to perform clock abstraction in SEC. + +-sec_atime=50 //Specifies the CPU time (in seconds) that the tool takes to perform the functional analysis per assertion. + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Sec_Start01 //Performs sequential equivalence checking on designs before and after power optimization + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec_debug_help.htm new file mode 100644 index 0000000..d307df8 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec_debug_help.htm @@ -0,0 +1,68 @@ + + + + + + + + + + power_sec + + + + + + + + + + + + + +
    + +
    +

    +power_sec +

    +

    +This goal performs sequential equivalance checking on designs before and after power +optimization. The goal runs in DDR (Dual Design Read) mode and reads in 2 designs. The first +design is the modified RTL created by autofix ( or user) based on power reduction recommendations. +The second design is the original RTL. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec_setup.sgs new file mode 100644 index 0000000..6e0c198 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_sec_setup.sgs @@ -0,0 +1,26 @@ +set_property -show_index +set_property -hide_step_numbering + +set_property -step_header "Before You Start" -show_progress_bar -hide_quality_bar +show_html $SPYGLASS_HOME/.Methodology/SEC/doc/sec-help1.htm +set_header_state "Before You Start" complete + +set_property -step_header "Configure SpyGlass Design Constraint File" +set_constraints -constraints {clock reset} -html $SPYGLASS_HOME/.Methodology/SEC/doc/sec-help2.htm +set_header_state "Configure SpyGlass Design Constraint File" complete + + +set_property -step_header "Set Reference Design" +show_html $SPYGLASS_HOME/.Methodology/SEC/doc/sec-help3.htm +set_reference_design +set_header_state "Set Reference Design" complete + +set_property -step_header "Set Parameters" +show_html $SPYGLASS_HOME/.Methodology/SEC/doc/sec-help4.htm +set_parameters pe_wdir +set_header_state "Set Parameters" complete + +set_property -step_header "Setup Closure" +show_text " Setup is complete and verified " +set_header_state "Setup Closure" complete + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix.spq new file mode 100644 index 0000000..77932bf --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix.spq @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_selective_autofix +// Version: 1.0.1 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 26-Nov-2013 5.2.0 Initial version +// 1.0.1 13-Jun-2014 5.3.0 Change of goal name +// +// Copyright Synopsys Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_selective_autofix mixed +* +Runs automatic RTL modification based on the power reduction recommendations selected by the user +* +Runs automatic RTL modification based on the power reduction recommendations selected by the user +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +-sgsyn_opt_file $SPYGLASS_HOME/GuideWare/latest/soc/rtl_handoff/power/red_opt.tcl //Configuration file for synthesis + +-disallow_view_delete //To disable view deletion, required For RTL modification engine to work + +-classic_mode //To run rules in CLASSIC synthesis mode + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix_debug_help.htm new file mode 100644 index 0000000..6329872 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_selective_autofix + + + + + + + + + + + + + +
    + +
    +

    +power_selective_autofix +

    +

    +This goal regenerates modified RTL after a power reduction run is completed. There is only one rule and it will not generate any messages. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix_setup.sgs new file mode 100644 index 0000000..60453b5 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_selective_autofix_setup.sgs @@ -0,0 +1,17 @@ +set_property -show_index +set_property -hide_step_numbering + +set_property -step_header "Before You Start" -show_progress_bar -hide_quality_bar +show_html $SPYGLASS_HOME/.Methodology/Power/doc/selective_autofix_bys.htm +set_header_state "Before You Start" complete + + +set_property -step_header "Set Parameters" +show_html $SPYGLASS_HOME/.Methodology/Power/doc/selective_autofix_parameters.htm +set_parameters rme_selection +set_header_state "Set Parameters" complete + +set_property -step_header "Setup Closure" +show_text " Setup is complete and verified " +set_header_state "Setup Closure" complete + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_model.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_model.spq new file mode 100644 index 0000000..0eeaa39 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_model.spq @@ -0,0 +1,41 @@ +// ---------------------------------------------------------------------------- +// SpyGlass EarlyAdopter Goal File +// +// Goal Name : power_wtc_model +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Oct-2016 2016.06-SP1 Initial version +// +// Copyright Atrenta Inc, 2014. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_wtc_model mixed +* +Generates weight toggle count model for the design +* +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPTAB01 + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_profiler.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_profiler.spq new file mode 100644 index 0000000..80c2bf3 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_profiler.spq @@ -0,0 +1,41 @@ +// ---------------------------------------------------------------------------- +// SpyGlass EarlyAdopter Goal File +// +// Goal Name : power_wtc_profiler +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 18-Oct-2016 2016.06-SP1 Initial version +// +// Copyright Atrenta Inc, 2014. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_wtc_profiler mixed +* +Profiles weight toggle count waveform and identifies time windows of peak power +* +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPROFILER01 + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_virtualizer.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_virtualizer.spq new file mode 100644 index 0000000..5724a75 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/power_wtc_virtualizer.spq @@ -0,0 +1,52 @@ +// ---------------------------------------------------------------------------- +// SpyGlass EarlyAdopter Goal File +// +// Goal Name : power_wtc_virtualizer +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 04-Apr-2017 2016.06-SP1 Initial version +// +// Copyright Synopsys, 2017. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +power_wtc_virtualizer mixed +* +Run power wtc virtualizer. +* +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=power_est + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //Allow mixed language + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-pe_toggle_act_profiler_debug=1 // this enables virtualizer mode within PEPWR01 +-pe_toggle_act_profiler_debug_no_power=1 // do not perform power calculations +-pe_toggle_act_profiler_debug_out_fsdb="pwr_act_wtc.fsdb" + +// user must specify pe_toggle_act_profiler_debug_bucket_file generated by power_wtc_model +// user must specify pe_toggle_act_profiler_debug_pwr_num_file generated by PEPWR01 + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules PEPWR01 + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/red_opt.tcl b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/red_opt.tcl new file mode 100644 index 0000000..9949d63 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power/red_opt.tcl @@ -0,0 +1,3 @@ +syn_set_option remove_identical_seq_cells false +syn_set_option preserve_mux 2 +syn_set_option transfer_for_gen_index_value_info 1 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/.submethodology_help new file mode 100644 index 0000000..59420f8 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/.submethodology_help @@ -0,0 +1,5 @@ +Validate voltage/power domain goal overview: + +To check your power intent for level shifters, isolation logic, retention registers and other low power cell types, enter a SpyGlass sgdc file, or a CPF file, or a UPF file. + +Power_verification_RTL checks the intent at the RTL level. Even if you have not added low power cell types to the RTL, SpyGlass will check that the intent is correct and complete. diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_abstract.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_abstract.spq new file mode 100644 index 0000000..509729b --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_abstract.spq @@ -0,0 +1,28 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Goal Template File +// +// power_verif_abstract +// Version: 1.0 +// +// Revision History: +// Ver Date Comments +// 1.0 27-Nov-2014 For Spyglass 5.4.0 release +// +// Copyright Atrenta Inc, 2014. All rights reserved. +// ---------------------------------------------------------------------------- +=template++++++ +power_verif_abstract mixed +* +Abstraction of a block for Power Verification at a higher level of hierarchy +* +This step is used to abstract a block which is to be used at higher level of +hierarchy for Power Verification. The abstracted model helps in following: + - Less run-time at top-level + - Less noise at top-level as no violations will be reported inside the blocks + + Perform this step after doing Power verification of block. +=cut+++++++++++ +-policies=lowpower + +-rules PV_Abstract01 //Generates relevant abstraction of the block + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_abstract_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_abstract_setup.sgs new file mode 100644 index 0000000..b096dca --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_abstract_setup.sgs @@ -0,0 +1,19 @@ +########################################################################## +# SpyGlass Goal Setup File +# +# Revision History: +# Ver Date Comments +# 1.0 24-Nov-2014 For Spyglass 5.4 release +# +# Copyright Atrenta Inc, 2014. All rights reserved. +########################################################################## + +source $SPYGLASS_HOME/auxi/common_setup/init_central.sgs +source $SPYGLASS_HOME/auxi/common_setup/get_central_status.sgs +set_property -hide_quality_bar -show_index -hide_step_numbering -show_progress +set_property -step_header "Introduction" +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_verif_any.htm +set_header_state "Introduction" complete +source $SPYGLASS_HOME/auxi/common_setup/bb_resolution/bb_resolution.sgs +source $SPYGLASS_HOME/.Methodology/Power/pwrintent_step.sgs +source $SPYGLASS_HOME/.Methodology/Power/closure_step.sgs diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_audit.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_audit.spq new file mode 100644 index 0000000..6034709 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_audit.spq @@ -0,0 +1,73 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_verif_audit +// Version: 2.1.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// 2.0.0 31-May-2014 Formating changes for consistent look and feel +// 2.1.0 31-May-2015 Added new rules +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +power_verif_audit +* +Audits the power intent +* +Audits the power intent and flags missing, inconsistent and duplicate commands. +This will also report unsupported commands as well as flags non-existent objects + +=cut++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ +-policy=lowpower + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + + +//------------------------------------------ +// Checks related to UPF +//----------------------------------------- +-rules UPFWRN_16 //Reports the usage of an unsupported command +-rules UPFWRN_17 //Reports the usage of an unsupported field of a command +-rules checkUPF_existence //Checks existence of design objects(instances/nets/pins) specified with UPF commands +-rules UPF_lowpower02 //Checks relationship of power nets between commands 'set_domain_supply_net', 'connect_supply_net' and 'add_port_state' +-rules UPF_lowpower03 //Checks missing specification of power domain for top design unit +-rules UPF_lowpower04 //Checks invalid/duplicate pst state defined in 'add_pst_state' command +-rules UPF_lowpower08 //Check invalid specification of pst table using 'create_pst' commands +-rules UPF_lowpower09 //Checks if supply port or supply net defined in UPF file is either undriven or multiple driven +-rules UPF_lowpower10 //Checks different isolation sense for same isolation signal is specified for a domain. +-rules UPF_lowpower11 //Check to ensure supply net must be declared for associated domain where supply net is used +-rules UPF_lowpower12 //Specify single isolation/levelshifter strategy on domain element. +-rules UPF_lowpower13 //Checks the power switch output port should have same voltage values as parent supply +-rules UPF_lowpower14 //Checks the information of supply nets and their states in power state tables is complete +-rules UPF_lowpower15 //Reports multi supply cells with missing connect_supply_net command +-rules UPF_lowpower16 //Checks the relationship between the bias net and the primary supply net. + +//------------------------------------------ +// Checks related to Reporting +//----------------------------------------- +-rules LP_DECOMPILE_CONSTR //Reports user-specified LowPower constraints interpretation details. + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_audit_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_audit_debug_help.htm new file mode 100644 index 0000000..33946f2 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_audit_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_verif_rtl + + + + + + + + + + + + + +
    + +
    +

    +power_verif_rtl +

    +

    +This goal checks the multiple voltage domain design for correctness of the power intent files. To check that the power intent has been applied correctly, look at the LP_DECOMPILE_CONSTRAINTS report first. Then look for the error messages for the UPF_lowpower*/CPF_lowpower* rules and review messages for each rule. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl.spq new file mode 100644 index 0000000..e114273 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl.spq @@ -0,0 +1,109 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_verif_instr_rtl +// Version: 2.1.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// 2.0.0 31-May-2014 Formating changes for consistent look and feel +// 2.1.0 31-May-2015 Adding new rules +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++ +power_verif_instr_rtl +* +Verifies proper usage of power management circuitry in RTL +* +This goal verifies the proper usage of power management circuitry +in the earliest possible design stage. For design teams that +insert level shifters and isolation logic into the RTL, this goal +will check the design against the power intent. It will ensure +that level shifters protect each voltage domain crossing and the +proper type of isolation logic is inserted at the output of each +power domain. +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ +-policy=lowpower + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + + +//------------------------------------------ +// Checks related to UPF +//----------------------------------------- +-rules UPFWRN_16 //Reports the usage of an unsupported command +-rules UPFWRN_17 //Reports the usage of an unsupported field of a command +-rules checkUPF_existence //Checks existence of design objects(instances/nets/pins) specified with UPF commands +-rules UPF_lowpower02 //Checks relationship of power nets between commands 'set_domain_supply_net', 'connect_supply_net' and 'add_port_state' +-rules UPF_lowpower03 //Checks missing specification of power domain for top design unit +-rules UPF_lowpower04 //Checks invalid/duplicate pst state defined in 'add_pst_state' command +-rules UPF_lowpower08 //Check invalid specification of pst table using 'create_pst' commands +-rules UPF_lowpower09 //Checks if supply port or supply net defined in UPF file is either undriven or multiple driven +-rules UPF_lowpower10 //Checks different isolation sense for same isolation signal is specified for a domain. +-rules UPF_lowpower11 //Check to ensure supply net must be declared for associated domain where supply net is used +-rules UPF_lowpower12 //Specify single isolation/levelshifter strategy on domain element. +-rules UPF_lowpower13 //Checks the power switch output port should have same voltage values as parent supply +-rules UPF_lowpower14 //Checks the information of supply nets and their states in power state tables is complete +-rules UPF_lowpower15 //Reports multi supply cells with missing connect_supply_net command +-rules UPF_lowpower16 //Checks the relationship between the bias net and the primary supply net. + + +//------------------------------------------ +// Checks related to Reporting +//----------------------------------------- +-rules LP_DECOMPILE_CONSTR //Reports user-specified LowPower constraints interpretation details. + +//------------------------------------------ +// Non-instrumented checks +//------------------------------------------ +-rules LPISO04A //Check for missing Isolation Strategy of Power Domain outputs +-rules LPISO04B //Check for incorrect Isolation Strategy of Power Domain + //outputs, -no_isolation given +-rules LPISO05 //Check for redundant Isolation Strategy of Power Domain outputs + +-rules LPLSH01 //Checks that cell defined in command 'map_level_shifter' has + // attribute 'is_level_shifter' in library +-rules LPLSH03 //Check for incorrect Level Shifter Strategy, -no_shift given +-rules LPLSH04 //Check for redundant Level Shifter Strategy +-rules LPLSH05 //Check for missing Level Shifter Strategy + +//------------------------------------------ +// Instrumented rtl checks +//------------------------------------------ +-rules LPSVM12A //Isolation signal should be in always-on domain. +-rules LPSVM53 //Ensure that the always-on pin of a cell should always come from an always-on domain. + +-rules LPSVM04 //Find missing/incorrect level shifters +-overloadrules LPSVM04A+severity=Error +-overloadrules LPSVM04B+severity=Error +-overloadrules LPSVM04C+severity=Error +-overloadrules LPSVM04D+severity=Error +-overloadrules LPSVM04E+severity=Error + +-rules LPSVM08 //Find missing isolation logic +-rules LPSVM09 //Find incorrect isolation logic + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl_debug_help.htm new file mode 100644 index 0000000..44839fe --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_verif_rtl + + + + + + + + + + + + + +
    + +
    +

    +power_verif_rtl +

    +

    +This goal checks the multiple voltage domain design for electrical correctness before synthesis. To check that the power intent has been applied correctly, look at the LP_DECOMPILE_CONSTRAINTS report first. The two key rules are LPSVM04 for level shifters, and LPSVM08 for isolation logic. Review the LPSVM08 violations before reviewing LPSVM09; many errors will generate one message for each rule. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl_setup.sgs new file mode 100644 index 0000000..439b777 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_instr_rtl_setup.sgs @@ -0,0 +1,20 @@ +########################################################################## +# SpyGlass Goal Setup File +# +# Revision History: +# Ver Date Comments +# 1.0 18-Aug-2008 For Spyglass 4.1 release +# 1.1 24-Jun-2009 For Spyglass 4.3 release +# +# Copyright Atrenta Inc, 2009. All rights reserved. +########################################################################## + +source $SPYGLASS_HOME/auxi/common_setup/init_central.sgs +source $SPYGLASS_HOME/auxi/common_setup/get_central_status.sgs +set_property -hide_quality_bar -show_index -hide_step_numbering -show_progress +set_property -step_header "Introduction" +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_verif_any.htm +set_header_state "Introduction" complete +source $SPYGLASS_HOME/auxi/common_setup/bb_resolution/bb_resolution.sgs +source $SPYGLASS_HOME/.Methodology/Power/pwrintent_step.sgs +source $SPYGLASS_HOME/.Methodology/Power/closure_step.sgs diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr.spq new file mode 100644 index 0000000..867c7a9 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr.spq @@ -0,0 +1,92 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : power_verif_noninstr +// Version: 2.1.0 +// +// Revision History: +// Ver Date Comments +// 1.0.0 18-Feb-2013 Initial version +// 2.0.0 31-May-2014 Formating changes for consistent look and feel +// 2.1.0 31-May-2015 Adding new rules +// +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +power_verif_noninstr +* +Verifies proper usage of power management circuitry in Non-Instrmented RTL +* +This goal verifies the proper usage of power management circuitry +in the earliest possible design stage. For design teams that +insert level shifters and isolation logic during Synthesis, this goal +will check the design against the power intent.It will ensure that +level shifters and isolation strategies defined in UPF files are +correct to protect each voltage domain crossing for isolation and +level shifting power domain. +=cut++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ +-policy=lowpower + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + + +//------------------------------------------ +// Checks related to UPF +//----------------------------------------- +-rules UPFWRN_16 //Reports the usage of an unsupported command +-rules UPFWRN_17 //Reports the usage of an unsupported field of a command +-rules checkUPF_existence //Checks existence of design objects(instances/nets/pins) specified with UPF commands +-rules UPF_lowpower02 //Checks relationship of power nets between commands 'set_domain_supply_net', 'connect_supply_net' and 'add_port_state' +-rules UPF_lowpower03 //Checks missing specification of power domain for top design unit +-rules UPF_lowpower04 //Checks invalid/duplicate pst state defined in 'add_pst_state' command +-rules UPF_lowpower08 //Check invalid specification of pst table using 'create_pst' commands +-rules UPF_lowpower09 //Checks if supply port or supply net defined in UPF file is either undriven or multiple driven +-rules UPF_lowpower10 //Checks different isolation sense for same isolation signal is specified for a domain. +-rules UPF_lowpower11 //Check to ensure supply net must be declared for associated domain where supply net is used +-rules UPF_lowpower12 //Specify single isolation/levelshifter strategy on domain element. +-rules UPF_lowpower13 //Checks the power switch output port should have same voltage values as parent supply +-rules UPF_lowpower14 //Checks the information of supply nets and their states in power state tables is complete +-rules UPF_lowpower15 //Reports multi supply cells with missing connect_supply_net command +-rules UPF_lowpower16 //Checks the relationship between the bias net and the primary supply net. + + +//------------------------------------------ +// Checks related to Reporting +//----------------------------------------- +-rules LP_DECOMPILE_CONSTR //Reports user-specified LowPower constraints interpretation details. + +//------------------------------------------ +// Non-instrumented checks +//------------------------------------------ +-rules LPISO04A //Check for missing Isolation Strategy of Power Domain outputs +-rules LPISO04B //Check for incorrect Isolation Strategy of Power Domain outputs, -no_isolation given +-rules LPISO05 //Check for redundant Isolation Strategy of Power Domain outputs + +-rules LPLSH01 //Checks that cell defined in command 'map_level_shifter' has attribute 'is_level_shifter' in library +-rules LPLSH03 //Check for incorrect Level Shifter Strategy, -no_shift given +-rules LPLSH04 //Check for redundant Level Shifter Strategy +-rules LPLSH05 //Check for missing Level Shifter Strategy + + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr_debug_help.htm new file mode 100644 index 0000000..9e6cf4f --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr_debug_help.htm @@ -0,0 +1,65 @@ + + + + + + + + + + power_verif_noninstr + + + + + + + + + + + + + +
    + +
    +

    +power_verif_noninstr +

    +

    +This goal checks the multiple voltage domain design for correctness and completeness of the power intent files. To check that the power intent has been applied correctly, look at the LP_DECOMPILE_CONSTRAINTS report first. Then look for the error messages for the UPF_lowpower*/CPF_lowpower* rules and review messages for each rule. Then review the messages for LPLSH* and LPISO* rules for the completeness/correctness for strategy specified for level shifting and isolation respectively. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr_setup.sgs new file mode 100644 index 0000000..439b777 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/power_verification/power_verif_noninstr_setup.sgs @@ -0,0 +1,20 @@ +########################################################################## +# SpyGlass Goal Setup File +# +# Revision History: +# Ver Date Comments +# 1.0 18-Aug-2008 For Spyglass 4.1 release +# 1.1 24-Jun-2009 For Spyglass 4.3 release +# +# Copyright Atrenta Inc, 2009. All rights reserved. +########################################################################## + +source $SPYGLASS_HOME/auxi/common_setup/init_central.sgs +source $SPYGLASS_HOME/auxi/common_setup/get_central_status.sgs +set_property -hide_quality_bar -show_index -hide_step_numbering -show_progress +set_property -step_header "Introduction" +show_html $SPYGLASS_HOME/.Methodology/Power/doc/power_verif_any.htm +set_header_state "Introduction" complete +source $SPYGLASS_HOME/auxi/common_setup/bb_resolution/bb_resolution.sgs +source $SPYGLASS_HOME/.Methodology/Power/pwrintent_step.sgs +source $SPYGLASS_HOME/.Methodology/Power/closure_step.sgs diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rdc/rdc_verify_struct.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rdc/rdc_verify_struct.spq new file mode 100644 index 0000000..c917828 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rdc/rdc_verify_struct.spq @@ -0,0 +1,110 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : rdc_verify_struct +// Version: 1.15.0 +// +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 06-July-2015 5.5 Initial version +// 1.12.0 16-Nov-2016 2016.06-SP2 Rules Clock_info02 and Reset_info02 removed +// 1.13.0 03-Feb-2017 2017.03 Parameter validate_qual_enable added +// 1.14.0 26-Apr-2017 2017.03-SP1 Parameters check_multiclock_bbox, ignore_qualifier_mismatch_rdc, enable_diff_clkdom_rdc, enable_or_sync added +// 1.15.0 04-Jun-2017 2017.03-SP2 Value of parameter report_all_reset_cross changed from 'no' to 'yes' +// 1.16.0 18-July-2017 2017.12 Parameter report_common_reset added +// Parameter use_inferred_abstract_port added +// 1.17.0 22-Jan-2018 2017.12 Option use_advcdc_features added +// Copyright Atrenta Inc, 2016. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +rdc_verify_struct mixed +* +Reset Domain Crossing Verification +* +This step is used to report reset domain crossings (RDC). It also performs +synchronization analysis, dynamic clock switching checks to identify the +RDC which will not cause the design issues. + +It also provides reset matrix view that shows the RDC count between each reset pair. +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=clock-reset + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + +-mixed //allow mixed language +-enable_const_prop_thru_seq //allow to propagate beyond the sequential elements +-use_advcdc_features //Run Advanced CDC Rules in restore mode + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-enable_mux_sync=all //MUX Synchronization schemes +-enable_and_sync=yes //Enables the AND Gate Synchronization Scheme +-enable_debug_data=yes //Enables annotation of debug information, such as clock, reset, quasi_static signals, and domain information on nets in the schematic +-hier_wild_card=no //Specifies the format of specifying hierarchies by using wildcard expressions in all the constraints used by the SpyGlass CDC solution +-strict_sync_check=yes //Allows combinational logic between the source and destination flip-flops +-enable_sim_check_rdc=yes //enable/disable simulation checks in Ar_resetcross01 +-report_sync_rdc=all //enable/disable reporting of synchronized reset domain crossings in Ar_resetcross01. +-report_for_single_busbit=no //Specifies whether single bit of a bus is to be reported by Ar_resetcross01 +-report_all_reset_cross=yes //enable the reporting the Ar_resetcross01 rules on reset crossings with destination recieving no clear/set. +-validate_qual_enable=rdc //Enable/disable functional analysis at each source qualifier merging gate +-ignore_qualifier_mismatch_rdc=yes //to enable/disable checks to find out mismatches of qualifier's clock and reset domains with that of destination object in reset domain crossing +-enable_diff_clkdom_rdc=yes //To control whether different clock domain RDC should be reported +-enable_or_sync=yes //To enable the "Or Gate Synchronization" scheme +-check_multiclock_bbox=yes //If a BBox has multiple clocks then do NOT ignore inputs +-report_common_reset=yes //To avoid multiple Reset_info09a violations and report common reset source +-use_inferred_abstract_port=yes + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Clock_info03a // Reports unconstrained clock nets +-overloadrules Clock_info03a+severity=Error + +-rules Clock_info05 // MUX descriptions where two or more clock signals converge +-overloadrules Clock_info05+severity=Error + +-rules Reset_info09a // Reports Unconstrained asynchronous reset nets +-overloadrules Reset_info09a+severity=Error + +-rules Clock_info05b // Combinational gates other than MUXes where two or more clock signals converge +-overloadrules Clock_info05b+severity=Error + +-rules Clock_info03b //Flip-flops,latches where the data pins are tied to a constant value + +-rules Clock_info03c // Reports Flip-flops or latches where the clock/enable pin is set to a constant +-overloadrules Clock_info03c+severity=Error + +-rules Setup_port01 //Reports unconstrained ports summary for top design unit + +-rules Setup_blackbox01 //Reports unconstrained pins summary for black-boxes + +-rules Clock_info15 // Generates clock domain information for primary ports + +-rules Info_Case_Analysis // Constant propagation in schematic display + +-rules Ar_resetcross01 // Reports reset domain crossings (RDC) +-overloadrules Ar_resetcross01+msgLabel=AR_RESETCROSS01_WRN_RSN+severity=Error +-overloadrules Ar_resetcross01+msgLabel=AR_RESETCROSS01_WRN_RSN_SINGLE_BIT+severity=Error +-overloadrules Ar_resetcross01+msgLabel=AR_RESETCROSS01_WRN_RSN_BUS_DECOMPRESS+severity=Error +-overloadrules Ar_resetcross01+msgLabel=AR_RESETCROSS01_WRN_RSN_DIFF_CLK+severity=Error +-overloadrules Ar_resetcross01+msgLabel=AR_RESETCROSS01_WRN_RSN_SINGLE_BIT_DIFF_CLK+severity=Error +-overloadrules Ar_resetcross01+msgLabel=AR_RESETCROSS01_WRN_RSN_BUS_DECOMPRESS_DIFF_CLK+severity=Error + +-rules Ar_resetcross_matrix01 // Generates reset crossing matrix view + + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rdc/rdc_verify_struct_setup.sgs b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rdc/rdc_verify_struct_setup.sgs new file mode 100644 index 0000000..b6c0f5d --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rdc/rdc_verify_struct_setup.sgs @@ -0,0 +1,4 @@ +## Register all variables +####END + +source $SPYGLASS_HOME/.Methodology/Clock-reset/CDC-Setup-Manager/CDC_Setup_Manager_setup.sgs diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/regression_run.tcl b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/regression_run.tcl new file mode 100644 index 0000000..ebec061 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/regression_run.tcl @@ -0,0 +1,49 @@ +################################################################################ +# Regression List +# The following regression goals will be available with this methodology. +################################################################################ + +######################################## +# default list of recommend goals to run for sign-off +######################################## +set regression_mandatory_list { lint/lint_rtl + adv_lint/adv_lint_verify + constraints/sdc_audit + constraints/sdc_check + constraints/sdc_redundancy + constraints/sdc_exception_struct + cdc/clock_reset_integrity + cdc/cdc_verify + dft/dft_scan_ready + dft/dft_best_practice + dft/dft_dsm_best_practice + power/power_est_average + power_verification/power_verif_noninstr + txv_verification/fp_mcp_verification + } + +######################################## +# additional goals to run for sign-off +######################################## +set regression_optional_list { lint/lint_abstract + constraints/sdc_abstract + constraints/sdc_equiv + constraints/sdc_hier_equiv + cdc/cdc_abstract + dft/dft_abstract + power/power_audit + power_verification/power_verif_audit + } + + +######################################## +# define/register the actual regression sets +######################################## +define_regression mandatory -goals "$regression_mandatory_list" + +define_regression optional -goals "$regression_optional_list" + +# note this goal is a superset of the mandatory and optional goals +define_regression all -goals "$regression_mandatory_list $regression_optional_list" + +define_regression physical_aware_power_est -goals { physical_aware_power/physical_power_postfloorplan physical_aware_power/power_est_average } diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rtl2netlist/rtl2netlist_migration.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rtl2netlist/rtl2netlist_migration.spq new file mode 100644 index 0000000..b3898ab --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rtl2netlist/rtl2netlist_migration.spq @@ -0,0 +1,50 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : rtl2netlist_migration +// Version: 1.0.0 +// Note: It is a beta feature and contact Atrenta support if you are interested +// in using it. +// Revision History: +// Ver Date SG Ver Comments +// 1.0.0 15-Apr-2015 5.5 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +rtl2netlist_migration mixed +* +Migration of RTL to netlist constraints and object names referred in RTL results +* +This goal is used to migrate following from RTL to netlist: + 1- SGDC constraints + 2- Netlist name mapping of object names referred in RTL + +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policy=rtl2netlist,clock-reset + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ +-mixed //allow mixed language + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Netlist_constraint_migration01 // Migrates the constraints specified at RTL to netlist +-rules Gen_inference_file01 // Maps the rtl result object names to its corresponding netlist object names present in the netlist + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rtl2netlist/rtl2netlist_migration_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rtl2netlist/rtl2netlist_migration_debug_help.htm new file mode 100644 index 0000000..8ad7f50 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/rtl2netlist/rtl2netlist_migration_debug_help.htm @@ -0,0 +1,66 @@ + + + + + + + + + + cdc_setup_check + + + + + + + + + + + + + +
    + +
    +

    +cdc_setup_check +

    +

    +This goal is used to migrate following from RTL to netlist: + 1- SGDC constraints + 2- Netlist name mapping of object names referred in RTL +

    + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/.submethodology_help b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/.submethodology_help new file mode 100644 index 0000000..f6fe739 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/.submethodology_help @@ -0,0 +1,5 @@ +TXV verifies correctness of timing exception constraints like false path and multicycle path. This is done using formal methods. +User can use TXV to verify the following timing exception constraints (provided by the user) - +A) False path constraint combinationally and/or sequentially +B) Multicycle path constraints +This methodology helps designers prepare the design by setting up and cleaning up SDC files diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_mcp_verification.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_mcp_verification.spq new file mode 100644 index 0000000..1887e1c --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_mcp_verification.spq @@ -0,0 +1,72 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : adv_fp_mcp_verification +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Version Comments +// 1.0.0 10-Mar-2015 5.4.1 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++ +fp_mcp_verification +* +False Path and Multicycle Path Verification +* +This template is used to verify false paths and multicycle paths in timing constraints. + +The only difference between this template and the one that exists in Guideware2.0 +is that this template contains two additional parameters and two additional +constraints rules. +Parameters: + 1. 'txv_enable_new_report' set to 'yes' + 2. 'txv_mcp_reactive_flow' set to 'new_flow' +Constraints rules: + 1. Show_Case_Analysis + 2. Show_Clock_Propagation + +* +For more details about this goal, please refer to the SpyGlass-TXV-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut+++++++++++ + +-mixed +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=txv +-policies=constraints + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-txv_enable_new_report=yes // This parameter provides backward compatibility for Spreadsheet reporting +-txv_mcp_reactive_flow=new_flow // This parameter runs the MCP verification in reactive mode +-pt=no // This parameter determines that parsing, verification and generation should follow Design Compiler behavior + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Txv_MCP_StartEnd01 // Reports Multi-cycle path with missing -start/-end option when the involved clocks have different periods +-rules MCP_Check01 // Multi-cycle path command does not satisfy setup/hold criteria +-rules Txv_FP_Warn04 // False path uses same clock in its -from and -to lists +-rules Txv_FP_Warn05 // // False path does not support the options, such as setup, hold, rise or fall +-rules Txv_Info05 // Multiple paths exist from the clock pin of a sequential cell to different clock sources +-rules Txv_Info06 //txv_assess report +-rules Txv_MCP_Warn05 // Multicycle path does not support the options, such as rise or fall +-rules Txv_resetvalue01 // Reports missing '-value' field in 'reset' constraint +-rules Txv_FP01 // fp verification rule +-rules Txv_MCP01 // mcp verification rule +-rules Txv_Info01 // this rule should be added as user can refer to vho only through this rule violation +-rules Show_Case_Analysis // Constraint Rule: Highlights case-analysis settings +-rules Show_Clock_Propagation // Constraint Rule: Shows clock propagation for the port/pin +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_mcp_verification_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_mcp_verification_debug_help.htm new file mode 100644 index 0000000..e145c7e --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_mcp_verification_debug_help.htm @@ -0,0 +1,95 @@ + + + + + + + + + + fp_mcp_verification + + + + + + + + + + + + + +
    + +
    +

    +fp_mcp_verification +

    +

    +This goal is used to verify false path timing constraints. For faster debug and violations resolution, you can first close non functional failures as follow: +

    +

    +1. Analyze and fix setup issues reported by following rules +

    +

    +Txv_clockperiod02*, Txv_Reset03*, Txv_resetvalue01*, Clk_Gen06, Txv_FP_Warn04, Txv_FP_Warn05, Txv_MCP_Warn04, Txv_MCP_Warn05, FP_Inconclusive_Verif01, FP_Inconclusive_Verif02, MCP_Inconclusive_Verif01, MCP_Inconclusive_Verif02, MCP_As_FP_Verif06i, MCP05 +

    +

    +*: these violations need to be fixed only for sequential exception verification +

    +

    +2. Analyze and fix timing exceptions failure due to non functional reasons reported by following rules +

    +

    +Txv_FP_Nontop, MCP_Nontop, FP_Skip_Verif02, MCP_Skip_Verif02, MCP_Skip_Verif03, FP_Fail_Verif01, FP_Fail_Verif05, MCP_Info02 +

    +

    +3. Analyze and fix timing exceptions failing based on functional verification. These failures are reported by following rules +

    +

    +FP_Fail_Verif03, FP_Fail_Verif04, MCP_Fail_Verif01a, MCP_Fail_Verif01b, MCP_Fail_Verif01c, MCP_Fail_Verif02a, MCP_Fail_Verif02b, MCP_Fail_Verif02c +

    +

    +4. Analyze exceptions where functional verification did not complete and proceed with more runs to conclude the verification as needed. The following rules need to be reviewed +

    +

    +Rules FP_Incomplete_Verif01, FP_Incomplete_Verif02, MCP_Incomplete_Verif01, MCP_Incomplete_Verif02, MCP_Incomplete_Verif03 +

    +

    +The goal needs to be run again whenever the setup, exceptions, or the design has been changed. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_verification.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_verification.spq new file mode 100644 index 0000000..770ecba --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_verification.spq @@ -0,0 +1,69 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare2.0 Goal File +// +// Goal Name : fp_verification +// Version: 1.0.0 +// +// Revision History: +// Ver Date SG Version Comments +// 1.0.0 10-Mar-2015 5.4.1 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// --------- + +=template++++++ +fp_verification +* +False Path Verification +* +This template is used to verify false paths in timing constraints. The given +false path is correct if there exists no input vectors that can sensitize the +given path. If the given false path is incorrect, a witness or counter +example is provided. Both combinational and sequential false paths can be +verified. + +The only difference between this template and the one that exists in Guideware2.0 +is that this template contains one additional parameters and two additional +constraints rules. +Parameter: + 'txv_enable_new_report' set to 'yes' +Constraints rules: + 1. Show_Case_Analysis + 2. Show_Clock_Propagation + +For more details about this goal, please refer to the SpyGlass-TXV-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut+++++++++++ + +-mixed +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=txv +-policies=constraints + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-txv_enable_new_report=yes // This parameter provides backward compatibility for Spreadsheet reporting +-pt=no // This parameter determines that parsing, verification and generation should follow Design Compiler behavior + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Txv_FP_Warn04 // False path uses same clock in its -from and -to lists +-rules Txv_FP_Warn05 // False path does not support the options, such as setup, hold, rise or fall +-rules Txv_Info05 // Multiple paths exist from the clock pin of a sequential cell to different clock sources +-rules Txv_Info06 //txv_assess report +-rules Txv_resetvalue01 // Reports missing '-value' field in 'reset' constraint +-rules Txv_FP01 // fp verification rule +-rules Txv_Info01 // this rule should be added as user can refer to vho only through this rule violation +-rules Show_Case_Analysis // Constraint Rule: Highlights case-analysis settings +-rules Show_Clock_Propagation // Constraint Rule: Shows clock propagation for the port/pin +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_verification_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_verification_debug_help.htm new file mode 100644 index 0000000..1aa9681 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/fp_verification_debug_help.htm @@ -0,0 +1,95 @@ + + + + + + + + + + fp_verification + + + + + + + + + + + + + +
    + +
    +

    +fp_verification +

    +

    +This goal is used to verify false path and multi-cycle path timing constraints. For faster debug and resolution of the violations, you can first close non functional failures as follow: +

    +

    +1. Analyze and fix setup issues reported by the following rules: +

    +

    +Txv_clockperiod02*, Txv_resetvalue01*, Clk_Gen06, Txv_FP_Warn04, Txv_FP_Warn05, FP_Inconclusive_Verif01, FP_Inconclusive_Verif02 +

    +

    +*: these violations need to be fixed only for sequential exception verification +

    +

    +2. Analyze and fix timing exceptions failure due to non functional reasons reported by the following rules +

    +

    +Txv_FP_Nontop, FP_Skip_Verif02, FP_Fail_Verif01, FP_Fail_Verif05 +

    +

    +3. Analyze and fix timing exceptions failing based on functional verification. These failures are reported by following rules +

    +

    +FP_Fail_Verif03, FP_Fail_Verif04 +

    +

    +4. Analyze exceptions where functional verification did not complete and proceed with more runs to conclude the verification as needed. Following rules need to be reviewed +

    +

    +FP_Incomplete_Verif01, FP_Incomplete_Verif02 +

    +

    +The goal needs to be run again whenever the setup, exceptions, or the design has been changed. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/mcp_verification.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/mcp_verification.spq new file mode 100644 index 0000000..32d76fa --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/mcp_verification.spq @@ -0,0 +1,71 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : txv_debug +// +// Revision History: +// Ver Date SG Version Comments +// 1.0.0 09-Mar-2015 5.4.1 Initial version +// +// Copyright Atrenta Inc, 2015. All rights reserved. +// ----------------------------------------------------------------------------- + +=template++++++ +mcp_verification +* +Multicycle Path Verification +* +This template is used to verify multicycle paths in timing constraints by +analyzing the sequential state space. The given multicycle path of N cycles +is correct if the transition that originates from the start point can arrive +at the end point in N or more clock cycles. Over-constrained multipliers can +also be verified. + +The only difference between this template and the one that exists in Guideware2.0 +is that this template contains two additional parameters and two additional +constraints rules. +Parameters: + 1. 'txv_enable_new_report' set to 'yes' + 2. 'txv_mcp_reactive_flow' set to 'new_flow' +Constraints rules: + 1. Show_Case_Analysis + 2. Show_Clock_Propagation + +For more details about this goal, please refer to the SpyGlass-TXV-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. + +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-mixed +-policies=txv +-policies=constraints + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-txv_enable_new_report=yes // This parameter provides backward compatibility for Spreadsheet reporting +-txv_mcp_reactive_flow=new_flow // This parameter runs the MCP verification in reactive mode +-pt=no // This parameter determines that parsing, verification and generation should follow Design Compiler behavior + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Txv_MCP_StartEnd01 // Reports Multi-cycle path with missing -start/-end option when the involved clocks have different periods +-rules MCP_Check01 // Multi-cycle path command does not satisfy setup/hold criteria +-rules Txv_Info05 // Multiple paths exist from the clock pin of a sequential cell to different clock sources +-rules Txv_Info06 // txv_assess report +-rules Txv_MCP_Warn05 // Multicycle path does not support the options, such as rise or fall +-rules Txv_resetvalue01 // Reports missing '-value' field in 'reset' constraint +-rules Txv_MCP01 // mcp verification rule +-rules Txv_Info01 // this rule should be added as user can refer to vho only through this rule violation +-rules Show_Case_Analysis // Constraint Rule: Highlights case-analysis settings +-rules Show_Clock_Propagation // Constraint Rule: Shows clock propagation for the port/pin +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/mcp_verification_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/mcp_verification_debug_help.htm new file mode 100644 index 0000000..39b3c25 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/mcp_verification_debug_help.htm @@ -0,0 +1,95 @@ + + + + + + + + + + mcp_verification + + + + + + + + + + + + + +
    + +
    +

    +mcp_verification +

    +

    +This goal is used to verify multi-cycle path timing constraints. For faster debug and violations resolution, you can first close non functional failures as follow: +

    +

    +1. Analyze and fix setup issues reported by the following rules +

    +

    +Txv_clockperiod02*, Txv_Reset03*, Txv_resetvalue01*, Clk_Gen06, Txv_MCP_Warn04, Txv_MCP_Warn05, MCP_Inconclusive_Verif01, MCP_Inconclusive_Verif02, MCP_As_FP_Verif06, MCP05 +

    +

    +*: these violations need to be fixed only for sequential exception verification +

    +

    +2. Analyze and fix timing exceptions failure due to non functional reasons reported by the following rules +

    +

    +MCP_Nontop, MCP_Skip_Verif02, MCP_Skip_Verif03, MCP_Info02 +

    +

    +3. Analyze and fix timing exceptions failing based on functional verification reported by following rules +

    +

    +MCP_Fail_Verif01a, MCP_Fail_Verif01b, MCP_Fail_Verif01c, MCP_Fail_Verif02a, MCP_Fail_Verif02b, MCP_Fail_Verif02c +

    +

    +4. Analyze exceptions where functional verification did not complete and proceed with more runs to conclude the verification as needed. The following rules need to be reviewed +

    +

    +MCP_Incomplete_Verif01, MCP_Incomplete_Verif02, MCP_Incomplete_Verif03 +

    +

    +The goal needs to be run again whenever the setup, exceptions, or the design has been changed. +

    + + + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_glitch.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_glitch.spq new file mode 100644 index 0000000..28a0afb --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_glitch.spq @@ -0,0 +1,23 @@ +// ----------------------------------------------------------------------------- +// SpyGlass Goal Template File for Clock to clock False Path Generation from RTL +// +// Copyright Atrenta Inc, 2008. All rights reserved. +// ----------------------------------------------------------------------------- +=template++++++ +txv_glitch +* +Failed due to Glitch because of reconvergence +* +The rule flags false-path commands where there is a probablity of a glitch +because of reconvergence from 'from' point. This rule checks for reconvergence +if and only if no clock is specified in the from list of the false path. + +The failed false-path commands are also listed in the autogenerated +txv_fail_ file in the $CWD/_reports/txv directory. +=cut+++++++++++ + + +-mixed +-policies=txv +-pt=no // This parameter determines that parsing, verification and generation should follow Design Compiler behavior +-rules Txv_FP_Glitch01 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_rtl_gen.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_rtl_gen.spq new file mode 100644 index 0000000..97afdd1 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_rtl_gen.spq @@ -0,0 +1,26 @@ +// ----------------------------------------------------------------------------- +// SpyGlass Goal Template File for Clock to clock False Path Generation from RTL +// +// Copyright Atrenta Inc, 2008. All rights reserved. +// ----------------------------------------------------------------------------- +=template++++++ +txv_rtl_gen +* +clock to clock False Path Generation +* +This template is used to report pair of unrelated clocks. If parameter txv_verify_c2c +is set to 'yes', it reports clock to clock false paths after validation. If parameter +txv_verify_c2c is set to 'no', it reports candidate for clock to clock false paths. +This template also reports the terminals on which generated clocks should be specified +and interacting clock pairs with non integer period ratio. + +For more details about this goal, please refer to the SpyGlass-TXV-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. +=cut+++++++++++ + + +-mixed +-policies=txv +-pt=no // This parameter determines that parsing, verification and generation should follow Design Compiler behavior +-rules Txv_Info08 +-rules Txv_Info09 +-rules Txv_C2C_Fp diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_run_audit.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_run_audit.spq new file mode 100644 index 0000000..2707b58 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_run_audit.spq @@ -0,0 +1,78 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : txv_run_audit +// Version: 1.0.1 +// +// Revision History: +// Ver Date SG Version Comments +// 1.0.0 30-Oct-2014 5.4.0 Initial version +// +// Copyright Atrenta Inc, 2014. All rights reserved. +// ----------------------------------------------------------------------------- + +=template++++++ +txv_run_audit +* +Run TXV in audit mode +* +This template is used to run TXV in audit mode. In audit mode, only +structural (non-functional) verification is performed. Constraints which +require functional verification are not verified. They are reported under +'Skip' category in this mode. + +For more details about this goal, please refer to the SpyGlass-TXV-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. + +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-mixed +-policies=txv +#-policies=constraints + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-txv_run_audit=yes +#-txv_detect_te_overlap=no +-pt=no // This parameter determines that parsing, verification and generation should follow Design Compiler behavior + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Txv_MCP_StartEnd01 // Reports Multi-cycle path with missing -start/-end option when the involved clocks have different periods +-rules MCP_Check01 // Multi-cycle path command does not satisfy setup/hold criteria +#-rules Txv_clockperiod02 // This rule reports the clocks rounded with their actual period and rounded value +-rules Txv_FP_Warn04 // False path uses same clock in its -from and -to lists +-rules Txv_FP_Warn05 // // False path does not support the options, such as setup, hold, rise or fall +-rules Txv_Info05 // Multiple paths exist from the clock pin of a sequential cell to different clock sources +-rules Txv_Info06 //txv_assess report +-rules Txv_MCP_Warn05 // Multicycle path does not support the options, such as rise or fall +-rules Txv_resetvalue01 // Reports missing '-value' field in 'reset' constraint +-rules Txv_FP01 // fp verification rule +-rules Txv_MCP01 // mcp verification rule +-rules Txv_Info01 // this rule should be added as user can refer to vho only through this rule violation +#-rules Show_Case_Analysis +#-rules Clk_Gen33 +#-rules Clk_Gen23 +#-rules Clk_Gen02 +#-rules Clk_Gen03 +#-rules Clk_Gen08 +#-rules Clk_Gen09 +#-rules Clk_Gen22 +#-rules Clk_Gen06 // Multiple paths exist from the clock pin of a sequential cell to different clock sources +#-rules TE_Methodology02 +#-rules SDC_Methodology66 +#-rules SDC_Methodology67 +#-rules MCP05 // Multi-cycle path command does not satisfy setup/hold criteria +#-rules Clk_Gen01a +#-rules Clk_Gen01b +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_run_audit_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_run_audit_debug_help.htm new file mode 100644 index 0000000..db96e76 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_run_audit_debug_help.htm @@ -0,0 +1,63 @@ + + + + + + + + + + mcp_verification + + + + + + + + + + + + + +
    + +
    +

    +mcp_verification +

    +

    +This goal is used to audit set_multicycle_path and set_false_path timing constraints. When this goal is run only structural (non-functional) verification is performed. Constraints which require functional verification are skipped. This provides a quick overview of timing exception verification. +

    + + +
    + +
    + + + +
    + + + + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_sdc_migration.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_sdc_migration.spq new file mode 100644 index 0000000..9a9f524 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/txv_verification/txv_sdc_migration.spq @@ -0,0 +1,49 @@ +// ---------------------------------------------------------------------------- +// SpyGlass Methodology2.0 Goal File +// +// Goal Name : txv_sdc_migration +// Version: 1.0.1 +// +// Revision History: +// Ver Date SG Version Comments +// 1.0.0 27-Nov-2014 5.4.0 Initial version +// +// Copyright Atrenta Inc, 2014. All rights reserved. +// ----------------------------------------------------------------------------- + +=template++++++ +txv_sdc_migration +* +Migrate netlist constraints to RTL +* +This template is used to convert netlist design constraints to rtl level design constraints. +It is used on customer designs where we have rtl design but constraints on netlist. + +For more details about this goal, please refer to the SpyGlass-TXV-Methodology.pdf file in the doc subdirectory of your SpyGlass installation. + +=cut+++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-mixed +#-policies=txv +-policies=constraints + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + +-pt=no // This parameter determines that parsing, verification and generation should follow Design Compiler behavior + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules SDC_Methodology73 + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/del_tmp_files.sh b/src/UWE_projectCode/tmp/tmp/Scripts/del_tmp_files.sh new file mode 100644 index 0000000..c623688 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/del_tmp_files.sh @@ -0,0 +1,17 @@ +find . -name "command.log" -exec rm -fr "{}" \; +find . -name "pt_shell_command.log" -exec rm -fr "{}" \; +find . -name "pt.log" -exec rm -fr "{}" \; +find . -name "default.svf" -exec rm -fr "{}" \; +find . -name "*_constr.pt" -exec rm -fr "{}" \; +find . -name "alib-52" -exec rm -fr "{}" \; +find . -name "lib2db.log" -exec rm -fr "{}" \; +find . -name "synopsysdc" -exec rm -fr "{}" \; +find . -name "analyzed" -exec rm -fr "{}" \; +find . -name "*~" -exec rm -fr "{}" \; +find . -name "filenames_*.log" -exec rm -fr "{}" \; +find . -name "*.lck" -exec rm -fr "{}" \; +find . -name "*fm_shell_command*.log" -exec rm -fr "{}" \; +find . -name "*FM_WORK*" -exec rm -fr "{}" \; +find . -name "*formality*_svf" -exec rm -fr "{}" \; +find . -name "*formality*.log" -exec rm -fr "{}" \; +find . -name "filenames.log" -exec rm -fr "{}" \; diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/error_find.perl b/src/UWE_projectCode/tmp/tmp/Scripts/error_find.perl new file mode 100644 index 0000000..3813ec2 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/error_find.perl @@ -0,0 +1,9 @@ +#! /usr/bin/perl +open(USER,"dc.log") || die "can't open"; +open(Data,">error.txt") || die "can't open"; +while(){chomp;if($_ eq ""){next;} if($_=~/#+/){next;} +#if(/Warning\:/) {print Data "$_\n";} +if(/Error\:/) {print Data "$_\n";} +} +close(USER); +close(Data); diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/ezeco_setup.sh b/src/UWE_projectCode/tmp/tmp/Scripts/ezeco_setup.sh new file mode 100644 index 0000000..b2d6934 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/ezeco_setup.sh @@ -0,0 +1,101 @@ +moduleName=`tclsh setModuleName.tcl` +echo $moduleName + +PP=`setPP.sh` +echo "PP = ${PP}" + +while read line +do + echo $line + R1_PATH=`echo $line` + echo $R1_PATH +done < dc.work/R1_PATH.txt + +echo $ECO_COMM + +EZ_FLOW=$1 +echo $EZ_FLOW +echo $EZECO_HOME + +if [ ${EZ_FLOW} == "dc" ]; then + POSTFIX="" +fi + +if [ ${EZ_FLOW} == "dft" ]; then + POSTFIX="_dft" +fi + +if [ ${EZ_FLOW} == "pr" ]; then + POSTFIX="_pr" +fi + +echo $POSTFIX + +cp $EZECO_HOME/scripts/easyeco_setup.template.script ./ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + +sed -i "s?easyeco.lic?$EZECO_HOME/../easyeco.lic?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + +sed -i "s?lib /lib/std2.lib?lib_file ez.work/lib.f?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i '/std1.lib/d' ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i '/std3.lib/d' ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + +if [ -e $R1_PATH/result/${moduleName}${POSTFIX}.v ]; then + sed -i "s?old.v?$R1_PATH/result/${moduleName}${POSTFIX}.v?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +else + sed -i "s?old.v?$R1_PATH/result/${moduleName}${POSTFIX}.sv?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +fi +if [ -e $R1_PATH/result/${moduleName}.v ]; then + sed -i "s?old_syn.v?$R1_PATH/result/${moduleName}.v?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +else + sed -i "s?old_syn.v?$R1_PATH/result/${moduleName}.sv?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +fi + +if [ ${EZ_FLOW} == "dc" ] ; then + if [ -e ${PP}/result/${moduleName}.sv ]; then + sed -i "s?new.v?${PP}/result/${moduleName}.sv?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + else + sed -i "s?new.v?${PP}/result/${moduleName}.v?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + fi +fi + +if [ ${EZ_FLOW} == "dft" ]; then + if [ -e ${R1_PATH}/result/${moduleName}_eco.v ]; then + sed -i "s?new.v?${R1_PATH}/result/${moduleName}_eco.v?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + else + sed -i "s?new.v?${R1_PATH}/result/${moduleName}_eco.sv?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + fi +fi + +if [ ${EZ_FLOW} == "pr" ]; then + if [ -e ${R1_PATH}/result/${moduleName}_eco.v ]; then + sed -i "s?new.v?${R1_PATH}/result/${moduleName}_eco.v?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + else + sed -i "s?new.v?${R1_PATH}/result/${moduleName}_eco.sv?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + fi +fi + +sed -i "s?old1.svf old2.svf?$R1_PATH/fm_svf.txt?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "s?new1.svf new2.svf?${PP}/fm_svf.txt?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + + +sed -i "s?lef lef?#lef lef?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "s?def old.def?#def old.def?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + +sed -i "s?ecoed.v?ez.work/$ECO_COMM/${moduleName}${POSTFIX}_eco.sv?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "s?ecoed.script?ez.work/$ECO_COMM/ecoed${POSTFIX}.script?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "s?ecoed.log?ez.work/$ECO_COMM/ecoed${POSTFIX}.log?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i '/debug/a\fast' ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + +sed -i "s?map_constant_by_tie_cell?#map_constant_by_tie_cell?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "s?spare_module?#spare_module?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + +sed -i "s?spare_instance?#spare_instance?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "s?spare_filler?#spare_filler?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "s?eco_gate_array_cell?#eco_gate_array_cell?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "s?# ignore_optimized_ff_in_setup?ignore_optimized_ff_in_setup?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i '/ignore_optimized_ff_in_setup/a\ignore_false_add_port' ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "/ignore_optimized_ff_in_setup/a\include ez.work/dont_use_cells.tcl" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script +sed -i "/ignore_optimized_ff_in_setup/a\ignore_false_eco_sub_module_input" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + +sed -i "s?top top?top ${moduleName}?" ez.work/$ECO_COMM/easyeco${POSTFIX}_setup.script + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/ezlec.sh b/src/UWE_projectCode/tmp/tmp/Scripts/ezlec.sh new file mode 100644 index 0000000..468b7bf --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/ezlec.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# You may add the directory of the ezlec executable to PATH by $ export PATH=$PATH: +# or modify the "ezlec" below to the absolute path of ezlec executable +# Options description: +# old_file_list and new_file_list: paths to the file containing the list of RTL files. +# old_root and new_root: root module name in the old/new design from which the comparison starts. +# output_dir: path to the output directory +# rtlec_log_file: path to the RTL-EC log file +#ezlec --old_file_list old.f --new_file_list new.f \ + +moduleName=`tclsh setModuleName.tcl` +echo $moduleName + +while read line +do + echo $line + R1_PATH=`echo $line` + echo $R1_PATH +done < dc.work/R1_PATH.txt + +if [ -d ./ez.work/R1src ]; then + echo "R1 src already exit" +else + cp $R1_PATH/update_RTL_SVN.sh ./src/ + cd src + chmod +x update_RTL_SVN.sh + ./update_RTL_SVN.sh + rm ./update_RTL_SVN.sh + cd - + mkdir ./ez.work/R1src + cp -r ./src/* ./ez.work/R1src/ + grep 'Opening include file' $R1_PATH/dc.log > ez.work/R1src/R1_filelist.f + sed -i 's?Opening include file ./src?./ez.work/R1src?' ez.work/R1src/R1_filelist.f + sed -i 's?Opening include file ??' ez.work/R1src/R1_filelist.f + sed -i '/filelist/d' ez.work/R1src/R1_filelist.f +fi + +cd src +svn up +cd - + +cp -r ./src ./ez.work/$ECO_COMM/ + +ezeco -in ./ez.work/$ECO_COMM/easyeco_setup.script -write_ungroup_info_from_svf +cp old_ungroup_list.rpt ez.work/${ECO_COMM}/old_ungroup_list.rpt +cp new_ungroup_list.rpt ez.work/${ECO_COMM}/new_ungroup_list.rpt + +if [ ${moduleName} == "gsm_sub_top" ]; then + OLD_TOP=gsm_top + NEW_TOP=gsm_top +else + OLD_TOP=${moduleName} + NEW_TOP=${moduleName} +fi + +echo ${LAST_ECO} +if [ ${LAST_ECO} == "" ]; then + OLD_FILE=ez.work/R1src/R1_filelist.f +else + OLD_FILE=${LAST_ECO}/ECO_filelist.f +fi +echo ${OLD_FILE} + +echo ${PP} +grep 'Opening include file' ${PP}/dc.log > ez.work/${ECO_COMM}/ECO_filelist.f +sed -i 's?Opening include file ??' ez.work/${ECO_COMM}/ECO_filelist.f +sed -i '/filelist/d' ez.work/${ECO_COMM}/ECO_filelist.f + +ezlec --old_file_list ${OLD_FILE} --new_file_list ./ez.work/${ECO_COMM}/ECO_filelist.f \ + --old_top ${OLD_TOP} --new_top ${NEW_TOP} \ + --old_root ${moduleName} --new_root ${moduleName} \ + --output_dir ez.work/${ECO_COMM} \ + --old_flatten_paths_list old_ungroup_list.rpt \ + --new_flatten_paths_list new_ungroup_list.rpt \ + --rtlec_log_file ez.work/${ECO_COMM}/rtlec.log diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/filelist_gen.sh b/src/UWE_projectCode/tmp/tmp/Scripts/filelist_gen.sh new file mode 100644 index 0000000..0fb6d6a --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/filelist_gen.sh @@ -0,0 +1,58 @@ +echo "######################################################################" +echo "=====================Filelist_Generator===============================" +echo "This script is used for generating the initial version of the filelist" +echo "for your designed unit. Users should modified it manually in order to " +echo "make it correct for both simulation and synthesis. " +echo "Currently, only .h .vh .v .vp are supported. If other files are needed" +echo "to be included, please do it manually! " +echo "======================================================================" +echo "This script is generated by LI CHEN. 2020.05.28." +echo "======================================================================" +echo "######################################################################" + + +dir=`tclsh $RELATIVEPATH/ProjectPathSetting.tcl` +moduleName=`tclsh setModuleName.tcl` + +if [ ! -d ${dir}/src/${moduleName} ]; then + echo "Source code is not exist, exit." + exit +fi + +echo "The source code path is $dir/src/${moduleName}, the module name is $moduleName" + +#echo "Please type the dir name of your design unit: " +#read dir + +if [ -e ${dir}/src/${moduleName}/${moduleName}_filelist.v ]; then + mv ${dir}/src/${moduleName}/${moduleName}_filelist.v ${dir}/src/${moduleName}/${moduleName}_filelist_before.v +fi + +if [ `find $dir/src/${moduleName} -name "*.h"` ]; then + echo "//=============define files==============" >>${dir}/src/${moduleName}/${moduleName}_filelist.v +fi + +for hfile in `find $dir/src/${moduleName} -name "*.h"` +do + echo '`'"include" '"'$hfile'"' >> ${dir}/src/${moduleName}/${moduleName}_filelist.v +done + +for vhfile in `find $dir/src/${moduleName} -name "*.vh"` +do + echo '`'"include" '"'$vhfile'"' >> ${dir}/src/${moduleName}/${moduleName}_filelist.v +done + +echo "//=============design files==============" >> ${dir}/src/${moduleName}/${moduleName}_filelist.v + + +for vfile in `find $dir/src/${moduleName} -name "*.v"` +do + echo '`'"include" '"'$vfile'"' >> ${dir}/src/${moduleName}/${moduleName}_filelist.v +done + +for vpfile in `find $dir/src/${moduleName} -name "*.vp"` +do + echo '`'"include" '"'$vpfile'"' >> ${dir}/src/${moduleName}/${moduleName}_filelist.v +done + +echo "${dir}/src/${moduleName}/${moduleName}_filelist.v is generated successfully!" diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/get_CURRENT_DESIGN.sh b/src/UWE_projectCode/tmp/tmp/Scripts/get_CURRENT_DESIGN.sh new file mode 100644 index 0000000..331dcb2 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/get_CURRENT_DESIGN.sh @@ -0,0 +1,3 @@ +design=`tclsh setModuleName.tcl` +echo $design + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/get_DBs_info.sh b/src/UWE_projectCode/tmp/tmp/Scripts/get_DBs_info.sh new file mode 100644 index 0000000..bfa7227 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/get_DBs_info.sh @@ -0,0 +1,23 @@ +moduleName=`tclsh setModuleName.tcl` +echo $moduleName + +PP=`setPP.sh` +echo "PP = ${PP}" + +grep '\.db' ${PP}/report/${moduleName}_area.txt > tmp.log + +sed -i "1i\ " RTL_DC_info.log +sed -i "1i\################################" RTL_DC_info.log +while read line +do + #echo $line + d=`echo $line | cut -d' ' -f3` + #echo $d + p=${d%/*} + dd=${d##*/} + ddd=${dd%)*} + #echo $ddd + #echo $p + sed -i "1i\# Use $ddd in `realpath $p`" RTL_DC_info.log +done < tmp.log +sed -i "1i\######### DBs Info###############" RTL_DC_info.log diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/get_PROJECT_PATH.sh b/src/UWE_projectCode/tmp/tmp/Scripts/get_PROJECT_PATH.sh new file mode 100644 index 0000000..a2c4401 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/get_PROJECT_PATH.sh @@ -0,0 +1,3 @@ +dir=`tclsh ProjectPathSetting.tcl` +echo $dir + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/quick_start b/src/UWE_projectCode/tmp/tmp/Scripts/quick_start new file mode 100644 index 0000000..f7bcf24 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/quick_start @@ -0,0 +1,70 @@ +echo "######################################################################" +echo "=====================quick start===============================" +echo "This script is used for generating the initial version of the files " +echo "used by synthesizing. Users should modified files manually if necessary." +echo "======================================================================" +echo "This script is generated by LIU CHANG. 2020.05.28." +echo "======================================================================" +echo "Last modifed 2020.05.29." +echo "======================================================================" +echo "######################################################################" + +if [ -e ProjectPathSetting.tcl ]; then + echo "project path is exist" +else + read -p "Please type the PROJECTPATH : " projectpath + n=${projectpath%?} + c1="${projectpath##$n}" + if [ "$c1" == "/" ]; then + projectpath_=$n + else + projectpath_=$projectpath + fi + echo $projectpath_ + echo "set PROJECTPATH ${projectpath_}" > ProjectPathSetting.tcl + echo 'puts ${PROJECTPATH}' >> ProjectPathSetting.tcl + echo "ProjectPathSetting.tcl is generated successfully!" +fi + +if [ -e ./src ]; then + echo "./src is exist." +else + read -p "Please type the source code path: " sourcecodepath + ln -s ${sourcecodepath} ./src + echo "./src soft link is created." +fi + +if [ -e setModuleName.tcl ]; then + echo "../setModuleName.tcl is exist." +else + read -p "Please type the name of top module: " moduleName + echo "set Design ${moduleName}" > setModuleName.tcl + echo 'puts ${Design}' >> setModuleName.tcl + echo " setModuleName.tcl is created." + + cp -r $RELATIVEPATH/Template/* ./ + touch tmp.log + echo "copy files in Template here." + + filelistpath=`find ./src/ -maxdepth 1 -name '*flist*' -type f` + echo $filelistpath + filelistname=${filelistpath#*src/} + echo $filelistname + echo '`'"include" '"./'$filelistname'"' > ./dc.work/filelist.v + + incdirlistpath=`find ./src/ -maxdepth 1 -name '*incdir*' -type f` + echo $incdirlistpath + incdirlistname=${incdirlistpath#*src/} + echo $incdirlistname + echo -f ./src/$incdirlistname \ > ./nc.work/sim_filelist.f + + echo ./dc.work/filelist.v \ >> ./nc.work/sim_filelist.f + echo " " >> ./nc.work/sim_filelist.f + echo //Add simulation files bellow >> ./nc.work/sim_filelist.f + echo "./$moduleName/dc.work/filelist.v is generated successfully!" + echo "./$moduleName/nc.work/sim_filelist.f is generated successfully!" + mv ./spyglass.work/demo.prj ./spyglass.work/$moduleName.prj + mv ./spyglass.work/waiver/demo.awl ./spyglass.work/waiver/$moduleName.awl +fi + + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/report_dc_summary.sh b/src/UWE_projectCode/tmp/tmp/Scripts/report_dc_summary.sh new file mode 100644 index 0000000..4e9d183 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/report_dc_summary.sh @@ -0,0 +1,74 @@ +#!/bin/sh + +moduleName=`tclsh setModuleName.tcl` +echo $moduleName + +PP=`setPP.sh` +echo "PP = ${PP}" + +if [ ! -f dc.work/syn_summary.log ]; then + echo "Date"$'\t'$'\t'"|"$'\t'"RTL"$'\t'"|"$'\t'"Area"$'\t'$'\t'$'\t'"(Comb Area,"$'\t'$'\t'"NonComb Area,"$'\t'"Block Area )"$'\t'"|"$'\t'"Cells"$'\t'"(Comb Cells,"$'\t'"Seq Cells)"$'\t'"|"$'\t'"Slack(reg2reg)" > dc.work/syn_summary.log +fi + +PP_date=${PP#*dc.work/${moduleName}_} +echo "PP_date = $PP_date" + +Revision=`grep 'Revision' RTL_DC_info.log` +RTL=`echo $Revision | cut -d' ' -f2` +echo RTL = $RTL + +area=`grep 'Cell Area' ${PP}/report/${moduleName}_qor.txt` +Area=`echo $area | cut -d' ' -f3` +echo Area = $Area + +Conarea=`grep 'Combinational Area:' ${PP}/report/${moduleName}_qor.txt` +ConArea=`echo $Conarea | cut -d' ' -f3` +echo ConArea = $ConArea + +NonConarea=`grep 'Noncombinational Area:' ${PP}/report/${moduleName}_qor.txt` +NonConArea=`echo $NonConarea | cut -d' ' -f3` +if [ -z $NonConArea ]; then + NonConarea=`grep -A1 'Noncombinational Area:' ${PP}/report/${moduleName}_qor.txt | grep -A1 -v 'Noncombinational Area:'` + NonConArea=`echo $NonConarea | cut -d' ' -f1` +fi +echo NonConArea = $NonConArea + +Blockarea=`grep 'Noncombinational Area:' ${PP}/report/${moduleName}_qor.txt` +BlockArea=`echo $Blockarea | cut -d' ' -f4` +if [ -z $BlockArea ]; then + Blockarea=`grep -A1 'Macro/Black Box Area:' ${PP}/report/${moduleName}_qor.txt | grep -A1 -v 'Macro/Black Box Area:'` + BlockArea=`echo $Blockarea | cut -d' ' -f1` +fi +echo BlockArea = $BlockArea + +cell=`grep 'Leaf Cell Count' ${PP}/report/${moduleName}_qor.txt` +cellNum=`echo $cell | cut -d' ' -f4` +echo Cells = $cellNum + +Comcell=`grep 'Combinational Cell Count' ${PP}/report/${moduleName}_qor.txt` +ComcellNum=`echo $Comcell | cut -d' ' -f4` +echo ComCells = $ComcellNum + +Seqcell=`grep 'Sequential Cell Count' ${PP}/report/${moduleName}_qor.txt` +SeqcellNum=`echo $Seqcell | cut -d' ' -f4` +echo SeqCells = $SeqcellNum + +slack=`grep -A4 'reg2reg' ${PP}/report/${moduleName}_qor.txt | grep 'Critical Path Slack:'` +Slack=`echo $slack | cut -d' ' -f4` +echo Slack = $Slack + +#grep '.db' ${PP}/report/${moduleName}_area.txt > tmp.log +# +#while read line +#do +# #echo $line +# d=`echo $line | cut -d' ' -f3` +# #echo $d +# p=${d%/*} +# dd=${d##*/} +# ddd=${dd%)*} +# #echo $ddd +# #echo $p +#done < tmp.log + +echo "$PP_date"$'\t'"$RTL"$'\t'"$Area"$'\t'"$ConArea"$'\t'"$NonConArea"$'\t'"$BlockArea"$'\t'$'\t'"$cellNum"$'\t'$'\t'"$ComcellNum"$'\t'$'\t'"$SeqcellNum"$'\t'$'\t'$'\t'"$Slack" >> dc.work/syn_summary.log diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/runAll.sh b/src/UWE_projectCode/tmp/tmp/Scripts/runAll.sh new file mode 100644 index 0000000..771edd8 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/runAll.sh @@ -0,0 +1,108 @@ +MODULES=(DDR_top PCIE_Top RapidIO_top DMA0_wrapper RA14S_top SMC_BankMem) +MASK=( 1 1 1 1 0 1) + +i=0 +for m in ${MODULES[@]} +do + echo $i ${MASK[$i]} + if [ ${MASK[$i]} == 1 ]; then + echo $m + if [ $m == SMC_BankMem ]; then + gnome-terminal --geometry=100x30+100*$i+0 --window --title="$m" -x csh -c "cd Syn_SubModule/$m; make flow; cd ../SMC_Top; make flow; cd ../../; touch ${m}_done.tmp; exec csh" + else + gnome-terminal --geometry=100x30+100*$i+0 --window --title="$m" -x csh -c "cd Syn_SubModule/$m; make flow; cd ../../; touch ${m}_done.tmp; exec csh" + fi + fi + i=$(($i+1)) +done + +j=1 +while [ $j == 1 ] +do + echo "sleep 1" + sleep 1 + i=0 + k=0 + for m in ${MODULES[@]} + do + if [ ${MASK[$i]} == 1 ]; then + if [ -f ${m}_done.tmp ]; then + echo $i $m "continue" + i=$(($i+1)) + continue + else + echo $i $m "break" + k=1 + break + fi + fi + i=$(($i+1)) + done + if [ $k == 0 ]; then + j=0 + fi +done + +gnome-terminal --geometry=100x30+100*$i+0 --window --title="M8024V_SuperNode" -x csh -c "cd Syn_SubModule/M8024V_SuperNode; make flow; cd ../../; touch M8024V_SuperNode_done.tmp; exec csh" + +j=1 +while [ $j == 1 ] +do + echo "sleep 1" + sleep 1 + k=0 + if [ ! -f M8024V_SuperNode_done.tmp ]; then + echo "M8024V_SuperNode break" + k=1 + else + echo "M8024V_SuperNode continue" + fi + if [ $k == 0 ]; then + j=0 + fi +done + +date=`date +%Y_%m%d_%H%M` +echo $date +reportfile=flow_${date}.report +touch reportfile +i=0 +for m in ${MODULES[@]} +do + if [ ${MASK[$i]} == 1 ]; then + echo $m >> $reportfile + cat Syn_SubModule/${m}/R0_check.result >> $reportfile + echo " " >> $reportfile + echo " " >> $reportfile + fi + i=$(($i+1)) +done + +echo "M8024V_SuperNode:" >> $reportfile +cat Syn_SubModule/M8024V_SuperNode/R0_check.result >> $reportfile +echo " " >> $reportfile +echo " " >> $reportfile + +gnome-terminal --geometry=100x30+110*$i+0 --window --title="M8024V_FullChip" -x csh -c "cd Syn_Top; make flow; cd ..; touch M8024V_FullChip_done.tmp; exec csh" + +j=1 +while [ $j == 1 ] +do + echo "sleep 1" + sleep 1 + k=0 + if [ ! -f M8024V_FullChip_done.tmp ]; then + echo "M8024V_FullChip break" + k=1 + else + echo "M8024V_FullChip continue" + fi + if [ $k == 0 ]; then + j=0 + fi +done + +echo "M8024V_FullChip:" >> $reportfile +cat Syn_Top/R0_check.result >> $reportfile + +rm *_done.tmp diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/setPP.sh b/src/UWE_projectCode/tmp/tmp/Scripts/setPP.sh new file mode 100644 index 0000000..2acb7a6 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/setPP.sh @@ -0,0 +1,12 @@ +dir=`tclsh ./Tcls/ProjectPathSetting.tcl` +moduleName=`tclsh ./Tcls/setModuleName.tcl` +#echo $dir +#echo $moduleName +if [ ${PP} == "./" ]; then + #echo "PP = ./" + find ./dc.work -maxdepth 1 -name "${moduleName}_202*" | sort > tmp.log + PP=`tail -n 1 tmp.log` + echo ${PP} +else + echo ${PP} +fi diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/tab_change b/src/UWE_projectCode/tmp/tmp/Scripts/tab_change new file mode 100644 index 0000000..a1459d5 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/tab_change @@ -0,0 +1,20 @@ +#!/bin/sh +#author: wdzs-liusheng +#date:2018.7.18 +PROJECTPATH=`tclsh $RELATIVEPATH/ProjectPathSetting.tcl` +if grep -n " " -r $PROJECTPATH -R --include=*.{v,sv} re . + then + echo -e "there is TAB in the .v or .sv file of your directory. \c" + echo -e "please type N=2/4/8, here N means replacing 1*TAB with N*BLANKSPACE. \c" + echo -e "Usually, in UltraEdit N=2; in DVT, N=4; and in Nedit, N=8." + echo -e "N=\c"; + read N + case $N in + 2) sed -i "s/\t/ /g" `grep " " -rl $PROJECTPATH --include=*.{v,sv} re .`;; + 4) sed -i "s/\t/ /g" `grep " " -rl $PROJECTPATH --include=*.{v,sv} re .`;; + 8) sed -i "s/\t/ /g" `grep " " -rl $PROJECTPATH --include=*.{v,sv} re .`;; + esac + else + echo "there is no TAB in the .v or .sv file of your directory" +fi + diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/temp_files_cleaner.sh b/src/UWE_projectCode/tmp/tmp/Scripts/temp_files_cleaner.sh new file mode 100644 index 0000000..affb9af --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/temp_files_cleaner.sh @@ -0,0 +1,41 @@ +echo "############################################################" +echo "This script is used for deleting temporary files and .svn files" +echo "Created by LI CHEN, 2020/5/28 ." +echo "###########################################################" + +echo "Please type the directory you want to delete temporary files and .svn files: " +read arg + +cd $arg + +find . -name "*.bak" +find . -name "*~" +find . -name "*.log" +find . -name "*.swp" +echo "Are you sure to delete these files? (y/n)" +read arga + +case $arga in +Y|y) +rm -f `find . -name "*.bak"` +rm -f `find . -name "*~"` +rm -f `find . -name "*.log"` +rm -f `find . -name "*.swp"` +echo "Deleted!" +;; +*) +;; +esac + +echo "Do you want to delete .svn in this dir? (y/n)" +read argb + +case $argb in +Y|y) rm -rf `find . -name ".svn"` +echo "Deleted!" + ;; +*) +;; +esac + +#deleting more files or directories can be extendied. diff --git a/src/UWE_projectCode/前后端信息交互引用库/themes/black/numberbox.css b/src/UWE_projectCode/tmp/tmp/Scripts/tmp.log similarity index 100% rename from src/UWE_projectCode/前后端信息交互引用库/themes/black/numberbox.css rename to src/UWE_projectCode/tmp/tmp/Scripts/tmp.log diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/warning_find.perl b/src/UWE_projectCode/tmp/tmp/Scripts/warning_find.perl new file mode 100644 index 0000000..27b42b1 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/warning_find.perl @@ -0,0 +1,9 @@ +#! /usr/bin/perl +open(USER,"dc.log") || die "can't open"; +open(Data,">warning.txt") || die "can't open"; +while(){chomp;if($_ eq ""){next;} if($_=~/#+/){next;} +if(/Warning\:/) {print Data "$_\n";} +#if(/Error\:/) {print Data "$_\n";} +} +close(USER); +close(Data); diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/#syn_main.tcl# b/src/UWE_projectCode/tmp/tmp/Tcls/#syn_main.tcl# new file mode 100644 index 0000000..b79db47 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/#syn_main.tcl# @@ -0,0 +1,345 @@ +set run_dc true +set run_pt false + +set RTL_DC_ID "" +set RTL_SIM_ID "" + +source -echo "./ProjectPathSetting.tcl" + +#-------------------------------------------------------------- +# NOTE: CHANGE DESIGN NAME TO YOUR OWN +source -echo "./setModuleName.tcl" + +source -echo "${PROJECTPATH}/syn/synopsys_dc.setup" + +if { [string match *FullChip $Design]} then { + echo "current design is $Design" + #source -echo "RTL_SIM_ID.tcl" + #source -echo "RTL_DC_ID.tcl" + if { $RTL_DC_ID != $RTL_SIM_ID} then { + echo "RTL_DC_ID != RTL_SIM_ID" + echo "RTL_DC_ID = $RTL_DC_ID" + echo "RTL_SIM_ID = $RTL_SIM_ID" + return + } +} + +#-------------------------------------------------------------- +#Reload ddc +echo $env(LOADDDC) +if { $env(LOADDDC) == "TRUE"} { + read_ddc $env(PP)/report/${Design}.ddc + return +} +#-------------------------------------------------------------- +set dc_date [exec date +%Y_%m%d_%H%M] +exec mkdir dc.work/${Design}_${dc_date} +exec mkdir dc.work/${Design}_${dc_date}/result +exec mkdir dc.work/${Design}_${dc_date}/report + +remove_design -all + +#-------------------------------------------------------------- + +set view_command_win {true} +set_host_options -max_cores 16 + +set compile_enable_async_mux_mapping {true} +set template_naming_style {%s_%p} +set template_parameter_style {%d} +set template_separator_style {_} + +set hdl_keep_licenses {false} +set hdlin_ff_always_async_set_reset {true} +set hdlin_latch_always_async_set_reset {true} +set hdlin_ff_always_sync_set_reset {false} +##set hdlin_use_carry_in true +set hdlin_check_no_latch {true} +set hdlin_mux_size_limit {32} +set hdlin_shorten_long_module_name true +set hdlin_while_loop_iterations 8192 +set hdlin_module_name_limit 128 + +set verilogout_equation {false} +set verilogout_single_bit {false} +set verilogout_higher_designs_first {true} +set verilogout_no_tri {true} +#set verilogout_show_unconnected_pins {false} +set verilogout_show_unconnected_pins {true} + +define_name_rules M2G_MODULE_LEVEL -allowed "A-Z a-z 0-9 _" ; +define_name_rules M2G_MODULE_LEVEL -first_restricted "0-9" ; +define_name_rules M2G_MODULE_LEVEL -replacement_char "_" ; +define_name_rules M2G_MODULE_LEVEL -collapse_name_space ; +define_name_rules M2G_MODULE_LEVEL -case_insensitive ; +define_name_rules M2G_MODULE_LEVEL -remove_internal_net_bus ; +define_name_rules M2G_MODULE_LEVEL -equal_ports_nets ; +define_name_rules M2G_MODULE_LEVEL -add_dummy_nets ; +define_name_rules M2G_MODULE_LEVEL -max_length 128 -type port ; +define_name_rules M2G_MODULE_LEVEL -max_length 64 -type cell ; +define_name_rules M2G_MODULE_LEVEL -max_length 64 -type net ; + +set default_name_rules M2G_MODULE_LEVEL ; + +set bus_dimension_separator_style {_} +set bus_naming_style {%s[%d]} +set bus_range_separator_style {:} +set bus_inference_descending_sort {true} +set bus_inference_style {%s[%d]} +#set write_name_nets_same_as_ports {false} +set write_name_nets_same_as_ports {true} +set bus_minus_style {-%d} +set bus_extraction_style {%s[%d:%d]} + +set change_names_dont_change_bus_members {false} +set uniquify_naming_style %s_%d + +set compile_instance_name_prefix {U} +set compile_instance_name_suffix {} + +set compile_preserve_subdesign_interfaces {true} +set compile_assume_fully_decoded_three_state_busses {false} +set compile_disable_hierarchical_inverter_opt {true} +set enable_recovery_removal_arcs {false} + +set fsm_auto_inferring {true} +set gen_show_created_symbols {true} +set case_analysis_with_logic_constants {true} +set power_cg_auto_identify {true} +set compile_auto_ungroup_count_leaf_cells {true} +set compile_auto_ungroup_override_wlm {true} + +set compile_delete_unloaded_sequential_cells {true} +set compile_seqmap_propagate_constants {true} +set compile_seqmap_propagate_high_effort {true} +set compile_seqmap_propagate_constants_size_only {true} + +set_svf dc.work/${Design}_${dc_date}/report/${Design}.svf + +#-------------------------------------------------------------- +#void warning Info # +#-------------------------------------------------------------- +#suppress_message HDL-193 +#suppress_message LINT-45 +#suppress_message OPT-1056 +#suppress_message PWR-877 +#set suppress_errors {VHDL-2285} + +#-------------------------------------------------------------- +#read↦ link↦ Check design# +#-------------------------------------------------------------- +source -echo "./dc.work/specific_filelist.tcl" +analyze -f SVERILOG -library work -vcs "-f ./nc.work/sim_filelist.f" +redirect -append -file dc.log {elaborate $Design} +current_design $Design +#link +if { [link] == 0} { + echo "Link failed!" + echo $env(CHECKCODE) + if { $env(CHECKCODE) == "TRUE"} { + exit + } + return +} + +#**set timing_enable_multiple_clocks_per_reg true +check_design > dc.work/${Design}_${dc_date}/report/${Design}_check_design.txt + +echo $env(CHECKCODE) +if { $env(CHECKCODE) == "TRUE"} { + echo "Link success!" + exit +} + +#-------------------------------------------------------------- +# set library +# NOTE: ADD YOUR OWN LIBRARY +# ------------------------------------------------------------- +#set_operating_conditions ssg_cworst_max_0p81v_m40c +#set zerowireload Zero +#set auto_wire_load_selection false +#set_wire_load_mode top +##set_wire_load_model -name "$zerowireload" [current_design] +#current_design $Design +source -echo "${PROJECTPATH}/syn/set_library.tcl" + +#------------------------------------------------------------------ +#set_dont_use +source -echo "${PROJECTPATH}/syn/dont_use.tcl" +#------------------------------------------------------------------ + +#remove_license HDL-Compiler + +#change name before compile +report_names -rules verilog -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_1.rpt +redirect -append -file dc.log {change_names -rules verilog -hierarchy -verbose} +report_names -rules M2G_MODULE_LEVEL -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_2.rpt +redirect -append -file dc.log {change_names -rules M2G_MODULE_LEVEL -hierarchy -verbose} + + +#-------------------------------------------------------------- +# read clock set and input output constraints +# NOTE: CHANGE FILE NAME TO YOUR OWN +# --------------------------------------------------------------- +echo $env(DEBUGSDC) +if { $env(DEBUGSDC) == "TRUE"} { + return +} + +redirect -append -file dc.log {source -echo "$env(SDCPATH)/${Design}.sdc"} +source -echo "$env(SDCPATH)/synopsys.sdc" + +#----------------------------------------------------------------- +#set dont_touch design +#----------------------------------------------------------------- +source -echo ./dc.work/syn_specific.tcl + +uniquify -dont_skip_empty_designs + +#---------------------------------------------------------------------------- +#set UPF file +#NOTE: +# +#load_upf MatrixIP_top_u2.upf +#set upf_allow_DD_primary_with_supply_sets true +#set_voltage 0.81 -object_list {VDD VDD1sw VDD2sw} +#set_voltage 0.0 -object_list {VSS} +##insert_mv_cells -isolation -verbose +#check_mv_design -verbose + +#-------------------------------------------------------------- +#check design +report_port -verbose > dc.work/${Design}_${dc_date}/report/${Design}_port.txt +report_clock > dc.work/${Design}_${dc_date}/report/${Design}_clock.txt + + +set_fix_multiple_port_nets -all -buffer_constants -feedthroughs [ get_designs "*" ] + +current_design $Design + +#set_ultra_optimization true + +set_max_dynamic_power 0.0 + +#ungroup -all -flatten + +#set ports_clock_root [filter_collection [get_attribute [get_clocks] sources] object_class==port] +#group_path -name REGOUT -to [all_outputs] +#group_path -name REGIN -from [remove_from_collection [all_inputs] $ports_clock_root] +#group_path -name FEEDTHROUGH -from [remove_from_collection [all_inputs] $ports_clock_root] -to [all_outputs] + +group_path -name in2reg -from [all_inputs] -critical_range 1000.0 +group_path -name reg2out -to [all_outputs] -critical_range 1000.0 +group_path -name in2out -from [all_inputs] -to [all_outputs] -critical_range 1000.0 +group_path -name reg2reg -from [all_registers] -to [all_registers] -critical_range 1000.0 + +#set_compile_directives -constant_propagation true [get_cells -hierarchical *] + +set_cost_priority -delay +set_critical_range 0.2 $Design +redirect -append -file dc.log {remove_unconnected_ports [get_cells -hier * ] } + +check_design > dc.work/${Design}_${dc_date}/report/${Design}_check_design_aftercom.txt +analyze_datapath_extraction > dc.work/${Design}_${dc_date}/report/${Design}_analyze_datapath_extraction.rpt + +compile_ultra -no_autoungroup -timing_high_effort -gate_clock -no_seq_output_inversion -scan +#compile_ultra -no_autoungroup -timing_high_effort -gate_clock -no_seq_output_inversion + +#foreach_in_collection desig [remove_from_collection [get_designs "*"] [get_designs {FADDSUB_top}]] { +# lappend rename_design_list $desig +#} + +#rename_design $rename_design_list -prefix FADDSUB_ +rename_design [remove_from_collection [get_designs "*"] $Design] -prefix ${Design}_ + + +#-------------------------------------------------------------- +#write_report + +if { [llength [get_cells main_gate -hier -filter "clock_gating_logic == true"]] != 0 } { + remove_clock_gating_check [get_cells main_gate -hier -filter "clock_gating_logic == true"] +} + + +report_names -rules verilog -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_3.rpt +redirect -append -file dc.log {change_names -rules verilog -hierarchy -verbose} +report_names -rules M2G_MODULE_LEVEL -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_4.rpt +redirect -append -file dc.log {change_names -rules M2G_MODULE_LEVEL -hierarchy -verbose} + +#write_report +write -format verilog -hierarchy $Design -output dc.work/${Design}_${dc_date}/result/${Design}.sv +write -format ddc -hierarchy -output dc.work/${Design}_${dc_date}/report/${Design}.ddc +report_timing -max 1000 -transition_time -capacitance > dc.work/${Design}_${dc_date}/report/${Design}_timing.txt +report_constraint -all_violators > dc.work/${Design}_${dc_date}/report/${Design}_constraint.txt +write_script > dc.work/${Design}_${dc_date}/report/${Design}.sdc +write_sdc -nosplit dc.work/${Design}_${dc_date}/report/${Design}.sdc +report_design > dc.work/${Design}_${dc_date}/report/${Design}_design.txt +report_reference -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_reference.rpt +report_net > dc.work/${Design}_${dc_date}/report/${Design}_net.rpt +report_names -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_names.rpt +report_resources -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_resource.rpt +report_multibit -hier > dc.work/${Design}_${dc_date}/report/${Design}_multibit.rpt +report_power > dc.work/${Design}_${dc_date}/report/${Design}_power.txt +report_qor > dc.work/${Design}_${dc_date}/report/${Design}_qor.txt +report_clock_tree_power > dc.work/${Design}_${dc_date}/report/${Design}_clkpower.txt +report_clock_gating > dc.work/${Design}_${dc_date}/report/${Design}_clock_gating.txt +report_area -nosplit -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_area.txt +report_timing -max 100 -transition_time -capacitance -group in2reg > dc.work/${Design}_${dc_date}/report/${Design}_in2reg +report_timing -max 100 -transition_time -capacitance -group reg2out > dc.work/${Design}_${dc_date}/report/${Design}_reg2out +report_timing -max 100 -transition_time -capacitance -group in2out > dc.work/${Design}_${dc_date}/report/${Design}_in2out +report_timing -max 100 -transition_time -capacitance -group reg2reg > dc.work/${Design}_${dc_date}/report/${Design}_reg2reg +check_timing -include {gated_clock clock_crossing} > dc.work/${Design}_${dc_date}/report/${Design}_check_timing.rpt +#report_timing \ +# -path full_clock \ +# -transition_time \ +# -crosstalk_delta \ +# -capacitance \ +# -input_pins \ +# -nets \ +# -delay max \ +# -derate \ +# -max_paths 100 > ${dc_date}/timing/${DESIGN}_${dc_date}_timing_dc.txt +# + +set_svf -off + +check_mv_design -verbose > dc.work/${Design}_${dc_date}/report/${Design}_check_upf.log + +#remove_design -hierarchy MatrixIP_Core_Scalar_PG +#remove_design -hierarchy MatrixIP_Core_Vector_PG + +#write -format verilog -hierarchy $Design -output dc.work/${Design}_${dc_date}/result/${Design}_hier.sv +#exec rm ../Netlist_9T_125C/${Design}.v +#exec cp dc.work/${Design}_${dc_date}/result/${Design}.sv ../Netlist_9T_125C/${Design}.v +#-------------------------------------------------------------- +#quit + +set dc_date0 [exec date +%Y_%m%d_%H%M] +echo ${dc_date} ${dc_date0} + +exec $env(SCRIPTPATH)/get_DBs_info.sh +exec $env(SCRIPTPATH)/report_dc_summary.sh +exec cp dc.work/${Design}_${dc_date}/report/${Design}_check_design.txt dc.work/${Design}_${dc_date}/check_design.txt +exec cp dc.work/${Design}_${dc_date}/report/${Design}_check_timing.rpt dc.work/${Design}_${dc_date}/check_timing.txt +exec cp dc.log dc.work/${Design}_${dc_date}/dc.log +exec cp command.log dc.work/${Design}_${dc_date}/command.log +exec cp RTL_DC_info.log dc.work/${Design}_${dc_date}/RTL_DC_info.log +exec cp RTL_DC_ID.tcl dc.work/${Design}_${dc_date}/RTL_DC_ID.tcl +exec cp update_RTL_SVN.sh dc.work/${Design}_${dc_date}/update_RTL_SVN.sh + +#remove_sdc +#source -echo "${PROJECTPATH}/syn/SDC/${Design}.sdc" + +source -echo "./dc.work/syn_specific_after.tcl" + +if { [file exists dc.work/${Design}_${dc_date}/result/${Design}.sv] == 1} { +exec mkdir NetlistSubmit/${Design}_${dc_date} +exec cp dc.work/${Design}_${dc_date}/result/${Design}.sv NetlistSubmit/${Design}_${dc_date}/ +exec cp dc.work/${Design}_${dc_date}/report/${Design}_qor.txt NetlistSubmit/${Design}_${dc_date}/ +#exec cp dc.work/${Design}_${dc_date}/report/${Design}_memory_clock.rpt NetlistSubmit/${Design}_${dc_date}/ +} + +echo $env(FLOW) +if { $env(FLOW) == "TRUE"} { + exit +} diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swm b/src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swm new file mode 100644 index 0000000000000000000000000000000000000000..7dec6b60ef27c341dc89a95612f3814119ac75ed GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swn b/src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swn new file mode 100644 index 0000000000000000000000000000000000000000..1c6231ec981690915f9982bd920d8691dc055ea3 GIT binary patch literal 16384 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 O+T_bln=OpV`T1|TUL;ol literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swo b/src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swo new file mode 100644 index 0000000000000000000000000000000000000000..5e63db137024aa5b501b17eb4f6fcc3d23a13d83 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swp b/src/UWE_projectCode/tmp/tmp/Tcls/.syn_main.tcl.swp new file mode 100644 index 0000000000000000000000000000000000000000..d1fa3271a5b6531e2849f944664dc410208b0bdc GIT binary patch literal 16384 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 ${dc_date}/check_design.txt + +current_design $DESIGN +set timing_enable_multiple_clocks_per_reg true + +current_design $DESIGN +change_names -rules verilog -hierarchy -verbose > ${dc_date}/change_names_0.v + +set BACKEND false +source "../../SDC/$DESIGN.sdc" + +source "../../SDC/DontUseCells.sdc" + +set_dont_touch_network [all_clocks] + +report_clock +check_timing -include {gated_clock clock_crossing} > ${dc_date}/check_timing.txt + +current_design $DESIGN + +foreach_in_collection design_name [get_designs *] { + current_design $design_name + set_fix_multiple_port_nets -all -buffer_constants + set_fix_multiple_port_nets -feedthroughs + set_max_fanout 40 $design_name +} + +current_design $DESIGN + +#set_wire_load_mode segmented +remove_wire_load_model +set_operating_conditions SS0P99VN40C +set_wire_load_model -name ZeroWLM +uniquify -force + +set_ultra_optimization true +set compile_seqmap_propagate_constants true + +set_driving_cell -lib_cell STN_BUF_S_4 -library RHSTD_ss0p99vn40c [remove_from_collection [all_inputs] {clk rstn}] +set_input_transition 0.05 [all_inputs] +set_max_transition 0.1 $DESIGN +set_load 0.015 [all_outputs] +set_max_fanout 10 $DESIGN +set_max_fanout 1 [all_inputs] +set_fanout_load 10 [all_outputs] +set_max_area 0.0 +#set_max_dynamic_power 0.0 + +set_cost_priority -delay +set_critical_range 0.3 $DESIGN + +#compile_ultra -no_autoungroup -gate_clock -scan +compile_ultra -no_autoungroup -timing_high_effort_script -gate_clock -no_seq_output_inversion -scan +#set_max_capacitance 3.0 $DESIGN +#compile_ultra -incremental + +set_fix_multiple_port_nets -all -buffer_constants -feedthroughs +change_names -rules verilog -hierarchy -verbose > ${dc_date}/change_names_3.v + +write -format ddc -hierarchy $DESIGN -output ${dc_date}/ddc/${DESIGN}_${dc_date}_ultra.ddc + +report_area > ${dc_date}/area/${DESIGN}_${dc_date}_area_ultra.txt +report_power > ${dc_date}/power/${DESIGN}_${dc_date}_power_ultra.txt +report_area -nosplit -hierarchy > ${dc_date}/area/${DESIGN}_${dc_date}_area_ultra_ALL.txt +report_qor > ${dc_date}/qor/${DESIGN}_${dc_date}_qor.txt +report_constraint -all_violators > ${dc_date}/constraint/${DESIGN}_${dc_date}_constraint.txt +write_sdc -nosplit ${dc_date}/sdc/${DESIGN}_${dc_date}.sdc +#report_transitive_fanout -clock_tree > ${dc_date}/clock.info + + +#report_timing -max 50 > ${dc_date}/timing/${DESIGN}_${dc_date}_setup.rpt +#report_timing -delay min -max 50 > ${dc_date}/timing/${DESIGN}_${dc_date}_hold.rpt + +report_timing \ + -path full_clock \ + -transition_time \ + -crosstalk_delta \ + -capacitance \ + -input_pins \ + -nets \ + -delay max \ + -derate \ + -max_paths 100 > ${dc_date}/timing/${DESIGN}_${dc_date}_timing_detailed.txt + +set_svf -off + +write -format verilog -hierarchy $DESIGN -output ${dc_date}/result/${DESIGN}_${dc_date}_ultra.v + +check_timing -include {gated_clock clock_crossing} > ${dc_date}/check_timing_1.txt + +exec date + +exit diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/cdc_goal.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/cdc_goal.tcl new file mode 100644 index 0000000..3361831 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/cdc_goal.tcl @@ -0,0 +1,120 @@ +#--------------------------------------------------------- +# CDC Hierarchical flow settings +#--------------------------------------------------------- +#set_option decompile_block_constraints yes +#set_option abstract_file_name_style short +#set_option include_block_interface abstract +#set_option use_block_interface yes + +#--------------------------------------------------------- +# sdc constraint to check cdc settings +#--------------------------------------------------------- +#set_option sdc2sgdc yes +#set_option sdc2sgdcfile ./${top-module-name}.sdc2sgdc.out + +#--------------------------------------------------------- +# CDC goal settings +#--------------------------------------------------------- +proc cdc_setup_check_add_settings {} { + +#set_option sdc_domain_mode sta_scg +#set_parameter sdc_generated_clocks yes; ## sdc generated clocks translated as sgdc clocks +#set_parameter pt supermode ; ##supports largest set of SDC queries +#set_parameter show_all_sdc_violations yes ; ##enables reporting of *all* issues in sdc +#set_parameter tc_ignored_commands sdc_ignored.txt; ## file containing list of sdc commands to be ignored for cdc +#set_parameter tc_stop_parsing_ignored_commands yes; ## avoids parsing of sdc commands ignored in tc_ignored_commands file +set_parameter use_inferred_abstract_port no +set_goal_option overloadrules { Reset_check12+severity=Error+msgLabel=NORMAL_WARNING Reset_check12+severity=Info+msgLabel=CORNER_WARNING } +} + +proc cdc_verify_struct_add_settings {} { + +#set_goal_option addrule { Ac_abstract01 } ; ##used for CDC hierarchical flow +#set_goal_option block_abstract yes ; ##used for CDC hierarchical flow +set_goal_option report { CDC-detailed-report SynchInfo moresimple} +set_parameter dump_sync_info detailed_mod +set_parameter show_module_in_spreadsheet yes +set_parameter enable_ac_sync_qualdepth yes +set_parameter conv_sync_as_src yes +set_parameter conv_src_seq_depth 0 +set_parameter check_multiclock_bbox yes +set_parameter cdc_qualifier_depth 3 +set_parameter conv_sync_seq_depth 1 +set_parameter handle_combo_arc yes +set_parameter allow_combo_logic yes +set_parameter report_common_reset yes +set_parameter allow_merged_qualifier strict +set_parameter show_clock_tag_debug_data yes + +set_goal_option addrules { Clock_sync05a Clock_sync06a } +set_goal_option overloadrule { Clock_sync05a+severity=Error } +set_goal_option overloadrule { Clock_sync06a+severity=Error } +set_goal_option overloadrules Reset_sync02+severity=Error + +#set_parameter enable_sync no ; ## disable automatically recognize synchronization scheme +#set_parameter enable_clock_gate_sync no ;## disable automatically recognize synchronization scheme +#set_parameter enable_multiflop_sync no ; ## disbale automatically recognize synchronization scheme +#set_parameter enable_mux_sync none ; ## disable automatically recognize synchronization scheme +#set_parameter enable_and_sync no ; ## disable automatically recognize synchronization scheme +#set_parameter glitch_protect_cell "gp_and,gp_mux" ; ## specify glitch protect cell naem + +#set_parameter synchronize_cells "sync1,sync2" ; ## user defined synchronizer for scalar control signal +#set_parameter reset_synchronize_cells "sync1,sync2" ; ## user defined synchronizer for scalar control signal +#set_parameter synchronize_data_cells "sync1,sync2" ; ## user defined synchronizer for vector control signal +#set_parameter msg_inst_mod_report all ; ## + +#set_parameter report_all_flops yes ; ## report all flops for Reset_sync02 +#set_parameter enable_reset_cone_spreadsheet yes ; ## enable spreadsheet for Reset_sync02 +} + +proc cdc_verify_add_settings {} { + +#set_parameter fa_proof_mode cdr; ## enable coverage driven formal (cdf) mode +#set_parameter fa_enable_cdr_coverage yes; ## with previous +#set_parameter fa_enable_cdr_reactive no; ## with previous +#set_parameter fa_coverage_witness yes; ## show waveform for partially-proved in cdf mode +#set_parameter fa_atime 200; ## increase maximum time (in sec) spent verifying each property +#set_parameter fa_enable_rca yes; ## enable root cause analysis for 0% coverage and vacuously-proved properties +##set_parameter fa_msgmode audit; ## enable cdc_verify to create property file then quit without verifying +##set_parameter fa_propfile ; ## enables manual selection of properties to verify (useful for focusing effort) +#set_parameter cdc_bus_compress none; ## make Ac_glitch03 and Ac_cdc01a check all bits of vectored destination +set_parameter cdc_dump_assertions sva +set_parameter fa_audit yes + +} + +current_goal cdc/cdc_setup +#set_goal_option addrules {Setup_port01 Setup_blackbox01} +current_goal none + +current_goal cdc/cdc_setup_check +read_file -type awl waiver/cdc.awl +cdc_setup_check_add_settings +current_goal none + + + + +current_goal cdc/clock_reset_integrity +read_file -type awl waiver/cdc.awl + +current_goal none + + + + +current_goal cdc/cdc_verify_struct +read_file -type awl waiver/cdc.awl +cdc_setup_check_add_settings +cdc_verify_struct_add_settings +current_goal none + + + + +current_goal cdc/cdc_verify +read_file -type awl waiver/cdc.awl +cdc_setup_check_add_settings +cdc_verify_struct_add_settings +cdc_verify_add_settings +current_goal none diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/common_options.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/common_options.tcl new file mode 100644 index 0000000..5735127 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/common_options.tcl @@ -0,0 +1,22 @@ +set_option project_read_only yes +set_option mthresh 1000000 +set_option dw yes +set_option disable_amg yes +set_option show_lib yes +set_option allow_duplicate_files true +set_option allow_module_override yes +set_option sort yes +set_option prefer_tech_lib yes +set_option enable_pgnetlist_all_products yes +set_option enable_pgnetlist yes +set_option max_err_count 0 +set_option perflog yes +set_option enable_unified_naming_search yes +set_option nosavepolicies all +set_option report_max_inst {-1} +set_option report_inst_backref yes +set_option report_ip_waiver yes +set_option enable_elapsed_time yes +set_option disable_html_report {datasheet dashboard html} +set_option pragma {synopsys synthesis} + diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/compile.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/compile.tcl new file mode 100644 index 0000000..a33e599 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/compile.tcl @@ -0,0 +1,34 @@ +sh mkdir synopsysdc +sh mkdir synopsysdc/grlib +define_design_lib grlib -path synopsysdc/grlib +sh mkdir synopsysdc/techmap +define_design_lib techmap -path synopsysdc/techmap +sh mkdir synopsysdc/gaisler +define_design_lib gaisler -path synopsysdc/gaisler +sh mkdir synopsysdc/work +define_design_lib work -path synopsysdc/work +analyze -f VHDL -library grlib $PROJECTPATH/LEON3LIB/grlib/stdlib/version.vhd +analyze -f VHDL -library grlib $PROJECTPATH/LEON3LIB/grlib/stdlib/config.vhd +analyze -f VHDL -library grlib $PROJECTPATH/LEON3LIB/grlib/stdlib/stdlib.vhd +analyze -f VHDL -library grlib $PROJECTPATH/LEON3LIB/grlib/stdlib/stdio.vhd +analyze -f VHDL -library grlib $PROJECTPATH/LEON3LIB/grlib/util/util.vhd +analyze -f VHDL -library grlib $PROJECTPATH/LEON3LIB/grlib/amba/amba.vhd +analyze -f VHDL -library grlib $PROJECTPATH/LEON3LIB/grlib/amba/devices.vhd +analyze -f VHDL -library techmap $PROJECTPATH/SPI/gencomp.vhd +analyze -f VHDL -library gaisler $PROJECTPATH/LEON3LIB/gaisler/uart/uart.vhd +analyze -f VHDL -library work $PROJECTPATH/UART/CONV.vhd +analyze -f VHDL -library work $PROJECTPATH/UART/CONV_1.vhd +analyze -f VHDL -library work $PROJECTPATH/UART/apbuart.vhd +analyze -f VHDL -library work $PROJECTPATH/UART/apbuart_top.vhd +analyze -f VHDL -library techmap $PROJECTPATH/SPI/SPI_syncram_2p_tx.vhd +analyze -f VHDL -library techmap $PROJECTPATH/SPI/SPI_syncram_2p_rx.vhd +analyze -f VHDL -library gaisler $PROJECTPATH/SPI/spictrlx_extended.vhd + +if {$DESIGN=={SMC_Top}} then { +analyze -f SVERILOG -library work -define {_USE_SYNED_COREPAC_ _USE_SYNED_SMC_BANKPORT_} $PROJECTPATH/DM6672VList.v +} else { +analyze -f SVERILOG -library work -define {_USE_SYNED_COREPAC_} $PROJECTPATH/DM6672VList.v +} + +analyze -f VERILOG -library work $PROJECTPATH/CorePac/MBIST_Ctrl/mgc_utility.v + diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/copyLib.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/copyLib.tcl new file mode 100644 index 0000000..28fdda7 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/copyLib.tcl @@ -0,0 +1,25 @@ +source -echo "$env(RELATIVEPATH)/ProjectPathSetting.tcl" +set run_dc true +source "${PROJECTPATH}/syn/synopsys_dc.setup" + +#echo $design_library + +foreach lib $design_library { + set strs [string trimright $lib db] + #echo $strs + if {$strs == "cdn_hs_phy_top."} { + break + } + echo ${strs}lib + #78-82 + exec find /space/PRJ_Back_End/FT-M8024V/ -name ${strs}lib | xargs -n1 -I \{\} cp \{\} ${PROJECTPATH}/syn/db-8024/tmp + exec find /space/PRJ_Back_End/FT-M8024V/ -name "u028efuhc01603218400_wc.lib" | grep "V1P1" | xargs -n1 -I \{\} cp \{\} ${PROJECTPATH}/syn/db-8024/tmp + #only read ,cann't gzip + exec find /space/PRJ_Back_End/FT-M8024V/ -name "*FXTDC012NSHJ0C_ssg0p81vm40c.lib*" | xargs -n1 -I \{\} cp \{\} ${PROJECTPATH}/syn/db-8024/tmp + #two + exec find /space2/Library/UMC28HPC/IP -name "*FXPLL357HJ0C_ssg0p81vm40c.lib*" | grep -v "Z-old_version" |xargs -n1 -I \{\} cp \{\} ${PROJECTPATH}/syn/db-8024/tmp + exec find /space/PRJ_Back_End/FT-M8024V/ -name "*TCSU2802_core_WC.lib*" |xargs -n1 -I \{\} cp \{\} ${PROJECTPATH}/syn/db-8024/tmp + exec find /space/PRJ_Back_End/FT-M8024V/ -name "*foj0c_qrs18_io_ssg0p81v1p62vm40c.lib*" | grep "V1.6.7" | xargs -n1 -I \{\} cp \{\} ${PROJECTPATH}/syn/db-8024/tmp + #echo $libs +} +exit diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/custom_options.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/custom_options.tcl new file mode 100644 index 0000000..b3c0265 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/custom_options.tcl @@ -0,0 +1,48 @@ +#--------------------------------------------------------- +# Increase the threshold limit for the size of the macro +# in order to completely simulate the macro. +# Resolve FLAT_504 message +#--------------------------------------------------------- +set_option define_cell_sim_depth 14 + +#--------------------------------------------------------- +# Enable module based report for block owner to review +#--------------------------------------------------------- +#set_option enable_module_based_reporting yes + +#--------------------------------------------------------- +# Option to enable SystemVerilog syntax +#--------------------------------------------------------- +set_option enableSV09 yes + +#--------------------------------------------------------- +# Option to enable Verilog2005 syntax +#--------------------------------------------------------- +set_option enableV05 yes + +#--------------------------------------------------------- +# Libraries setting +#--------------------------------------------------------- +#set_option v /path/to/your/library/file.v +#set_option y /path/to/your/library/directory +#set_option libext { .v .sv .vhd .vh } + +#--------------------------------------------------------- +# define macro and include file path setting +#--------------------------------------------------------- +#set_option define your-macro +#set_option incdir /path/to/your/include/directory + + +#--------------------------------------------------------- +# grey box or blackbox setting +#--------------------------------------------------------- +#set_option stop eth_miim +#set_option stop module-name +set_option stop DW_lp_fp_multifunc +#set_option stopfile RTL-file-name +#set_option stopdir HDL-directory +#set_option ignoredu module-name +#set_option ignorefile RTL-file-name +#set_option ignoredir HDL-directory + diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/formality.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/formality.tcl new file mode 100644 index 0000000..71ae6f6 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/formality.tcl @@ -0,0 +1,136 @@ +source "./ProjectPathSetting.tcl" + +exec date + +source "./setModuleName.tcl" + +set PP [exec bash $env(SCRIPTPATH)/setPP.sh] +echo "PP = ${PP}" + +set netlistfile ./${PP}/result/$Design.sv +#set sdcfile ./${PP}/report/$Design.sdc +set svffile ./${PP}/report/$Design.svf + +############################################ +#setup +############################################ +set run_dc false +set run_pt false +set synopsys_auto_setup true +#set hdlin_unresolved_modules black_box +#set hdlin_dwroot /space/CAD_Front_End/Synopsys2013/H-2013.03-SP2/ +#set hdlin_dwroot /CAD/Synopsys2015/syn_vK-2015.06/ +set hdlin_dwroot /space/CAD_Front_End/Synopsys2019/syn/ + +if {$Design=={PCIE_Top}} then { +set hdlin_ignore_translate true +set verification_verify_unread_tech_cell_pins false +} + +############################################ +#SVF +############################################ +set_svf $svffile + +source -echo "${PROJECTPATH}/syn/synopsys_dc.setup" + +############################################ +#Read db +############################################ +#read_db RHSTD_ss0p99vn40c.db +read_db $link_library + +if {$Design=={SMC_Top}} then { +read_db $PROJECTPATH/syn/db_sc12l28/SMC_BankMem.db +} + +############################################ +#RTL code +############################################ +if { [string match *fullchip* $Design]} then { +echo "current design is $Design" +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/stdlib/version.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/stdlib/config.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/stdlib/stdlib.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/stdlib/stdio.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/util/util.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/amba/amba.vhd +read_vhdl -container r -libname grlib $PROJECTPATH/src/LEON3LIB/grlib/amba/devices.vhd +read_vhdl -container r -libname techmap $PROJECTPATH/src/SPI/rtl/gencomp.vhd +read_vhdl -container r -libname gaisler $PROJECTPATH/src/SPI/rtl/SPI_syncram_2p_tx.vhd +read_vhdl -container r -libname gaisler $PROJECTPATH/src/SPI/rtl/SPI_syncram_2p_rx.vhd +read_vhdl -container r -libname gaisler $PROJECTPATH/src/SPI/rtl/spictrlx_extended.vhd +} + +read_sverilog -container r -libname work -define {_USE_SYNED_COREPAC_} -f ./nc.work/sim_filelist.f + +###read_verilog -container r -libname work $PROJECTPATH/CorePac/MBIST_Ctrl/mgc_utility.v + +set_top r:/work/$Design + + +############################################ +#netlist +############################################ +read_verilog -container i -libname work -01 $netlistfile + +set_top i:/work/$Design + +if {$Design=={PCIE_Top}} then { +set_constant -type port r:/WORK/PCIE_Top/mbist_en 0 +set_constant -type port i:/WORK/PCIE_Top/mbist_en 0 +set_constant -type port r:/WORK/PCIE_Top/test_en 0 +set_constant -type port i:/WORK/PCIE_Top/test_en 0 +set_constant -type port r:/WORK/PCIE_Top/test_clk 0 +set_constant -type port i:/WORK/PCIE_Top/test_clk 0 +set_constant -type port r:/WORK/PCIE_Top/scan_reset 0 +set_constant -type port i:/WORK/PCIE_Top/scan_reset 0 + +} +############################################ +#match +############################################ +#if {$Design=={RapidIO_top}} then { +#set_constant -type port r:/WORK/RapidIO_top/mbist_en 0 +#set_constant -type port i:/WORK/RapidIO_top/mbist_en 0 +#} + +match + +############################################ +#verify +############################################ +if {$Design=={M8024V_FullChip}} then { +set_dont_verify { +r:/WORK/M8024V_FullChip/AAAA_M8024V_top/AAA_efuse/efuse_ctrl_state/u028efuhc01603218400/VDD +r:/WORK/M8024V_FullChip/AAAA_M8024V_top/AAA_efuse/efuse_ctrl_state/u028efuhc01603218400/VSS +r:/WORK/M8024V_FullChip/AAAA_M8024V_top/AAA_efuse/efuse_ctrl_state/u028efuhc01603218400/VQPS +} +} + +if {$Design=={M66AK_FullChip}} then { +set_dont_verify { +r:/WORK/M66AK_FullChip/AAAA_M66AK/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VDD +r:/WORK/M66AK_FullChip/AAAA_M66AK/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VSS +r:/WORK/M66AK_FullChip/AAAA_M66AK/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VQPS +} +} + +if {$Design=={M6674_FullChip}} then { +set_dont_verify { +r:/WORK/M6674_FullChip/AAAA_M6674/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VDD +r:/WORK/M6674_FullChip/AAAA_M6674/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VSS +r:/WORK/M6674_FullChip/AAAA_M6674/AAA_EFUSE/efuse_ctrl_state/u028efuhc01603218400/VQPS +} +} + +verify + +exec date + +exec cp fm.log ${PP}/fm.log +exec cp formality_svf/svf.txt ${PP}/fm_svf.txt + +exit + +##debug## diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/genus_flow.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/genus_flow.tcl new file mode 100644 index 0000000..ac7dbbf --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/genus_flow.tcl @@ -0,0 +1,644 @@ + +#if {[file exists /proc/cpuinfo]} { +# sh grep "model name" /proc/cpuinfo +# sh grep "cpu MHz" /proc/cpuinfo +#} +# +#puts "Hostname : [info hostname]" + +############################################################################## +## Preset global variables and attributes +############################################################################## + +source -echo "./ProjectPathSetting.tcl" + +source -echo "./setModuleName.tcl" +#set Design fullchip_top +#for example : set Design M66AK_FullChip + +######set Generic & Map & Optional's effort +set GEN_EFF medium +set MAP_OPT_EFF high +set DATE [clock format [clock seconds] -format "%b%d-%T"] +#set ET_WORKDIR +set _OUTPUTS_PATH ${Design}_${DATE}/outputs_${DATE} +set _REPORTS_PATH ${Design}_${DATE}/reports_${DATE} +set _LOG_PATH ${Design}_${DATE}/logs_${DATE} +set_db invs_temp_dir ${Design}_${DATE}/invs_temp_dir_${DATE} +set_db innovus_executable "/space/CAD_Back_End/Cadence20/INNOVUS20.11.000-ISR1/bin/innovus" +set_db statistics_log_data true +set_db source_verbose true +set_db / .information_level 9 + +##Uncomment and specify machine names to enable super-threading. +###set_db / .super_thread_servers {} +###For design size of 1.5M - 5M gates, use 8 to 16 CPUs. For designs > 5M gates, use 16 to 32 CPUs +set_db / .max_cpus_per_server 32 + +set_db init_blackbox_for_undefined false +set_db ui_respects_preserve false +##Default undriven/unconnected setting is 'none'. +set_db / .hdl_unconnected_value none +set_db hdl_track_filename_row_col true +set_db "message:GLO-32" .truncate false +set_db "message:GLO-34" .truncate false + +############################################################################## +#set lib or hdl search path +############################################################################### +set_db / .init_lib_search_path " \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/SerDes/Latest/pma/timing/9M_2Xa1Xd_h_3Xe_vhv_2Z/lib_pg/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/SerDes_X1/Latest/pma/timing/1P11M_DV_3DM_Q1_3Q2_2B_2TMa_ALPA2_14SHK/lib_pg/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/Memory/Latest/memory_lib_dbs/ssgs_ccw0p72vn40c/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/CoreLib/Latest/RVT/lib/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/CoreLib/Latest/LVT/lib/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/CoreLib/Latest/ULVT/lib/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/VTsensor/Latest/Lib/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/PLL/P1232/Latest/lib/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/GPIO/Latest/syn/1p8v/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/efuse/Latest/S14NSFPEFUSE_PIPO1KB_V0.2.3/Lib/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/PSensor/Latest/Lib/ \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/SerDes/Latest \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/SerDes/Latest/upcs/include \ + /space/PRJ_Front_End/M7004V/hardmacro_backend/ip/SerDes/Latest/phy/include \ + /space/PRJ_Front_End/M7004V/src/DSPCORE/ARF/lib/ \ + /space/PRJ_Front_End/M7004V/src/DSPCORE/VRF/lib/ \ + $PROJECTPATH/syn/db \ + " +set_db / .init_hdl_search_path " \ + ./src \ + /home/admin/liuchang/M7004V/src/LEON3LIB/grlib/stdlib \ + /home/admin/liuchang/M7004V/src/LEON3LIB/grlib/util \ + /home/admin/liuchang/M7004V/src/LEON3LIB/gaisler/uart \ + /home/admin/liuchang/M7004V/src/LEON3LIB/grlib/amba \ + /home/admin/liuchang/M7004V/src/SPI/rtl \ + " + +############################################################### +## Library setup +############################################################### +set_db library "RHSTD_LVT_ssg0p72vm40c_ccs.lib" + +read_libs " \ + RHSTD_LVT_ssg0p72vm40c_ccs.lib \ + RHSTD_RVT_ssg0p72vm40c_ccs.lib \ + RHSTD_ULVT_ssg0p72vm40c_ccs.lib \ + S14NSFPVT_V0.1.1_ssg_V1p62v0p72_-40C.lib \ + P1232_ssg0p72vm40c.lib \ + SPC14NSFPD18RN_ss_V0p72_-40C.lib \ + S14NSFPEFUSE_PIPO1KB_V0.1.1_ssg_V1p62v0p72_-40C.lib \ + S14NSFPPS_V0.1.1_ssg_V0p72_-40C.lib \ + AM_RAM1024W39B.lib \ + ARF_16X36_6W_7R_WC.lib \ + VRF_32X32_8W_14R_WC.lib \ + BTB.lib \ + CAC_RAM_TP_128W67.lib \ + CrossNet_MEM32W100.lib \ + CrossNet_MEM32W120.lib \ + CrossNet_MEM32W68.lib \ + CrossNet_MEM32W84.lib \ + CrossNet_MEM256W33.lib \ + CrossNet_MEM256W54.lib \ + CrossNet_MEM256W58.lib \ + CrossNet_MEM256W61.lib \ + DCACHE_DATA.lib \ + DCACHE_DATA_ECC.lib \ + DCACHE_TAG.lib \ + DCACHE_TAG_ECC.lib \ + DMA_RFSP64W39B.lib \ + GHB.lib \ + gsm_data_sp_8192w137b.lib \ + gsm_tag_sp_1024w23b.lib \ + ICACHE_DATA.lib \ + ICACHE_TAG.lib \ + IP.lib \ + L1P_RAMSP256W23B.lib \ + L1P_RAMSP256W33B.lib \ + L2CACHE_DATA_ECC_4K.lib \ + L2CACHE_TAGS.lib \ + L2_PREFETCH_STRIDE_QUEUE.lib \ + L2_SNOOP_TAG.lib \ + L2_TLB.lib \ + RAMSP512W13B.lib \ + RAMSP512W28B.lib \ + RAMSP_D768W76.lib \ + RAMTP_D128W72.lib \ + RAMTP_D32W100.lib \ + RAMTP_D32W118.lib \ + RAMTP_D32W46.lib \ + RAMTP_D32W66.lib \ + RAMTP_D32W84.lib \ + RAMTP_D32W72.lib \ + RAMTP_D352W72.lib \ + RAMTP_D416W74.lib \ + RAMTP_D48W70.lib \ + RAMTP_D512W15.lib \ + RAMTP_D512W74.lib \ + RAMTP_D544W32.lib \ + RAMTP_D544W40.lib \ + RBL_512w64b_ROM0.lib \ + RBL_512w64b_ROM1.lib \ + RBL_512w64b_ROM2.lib \ + RBL_512w64b_ROM3.lib \ + SPI_syncram_2p.lib \ + Txfifo_512x76.lib \ + xgmac_dmi_sram.lib \ + xgmac_ec_ef_sram.lib \ + xgmac_fifo.lib \ + dwc_e25mp_pma_x4_ns_ss0p72vn40c_cworst_CCworst_pg.lib.gz \ + dwc_e25mp_pma_x1_ns_ss0p72vn40c_rcworst_CCworst_pg.lib \ + RA14S_1024x72.lib \ + RA14S_32x72.lib \ + SRIO_SP_256W40.lib \ + SRIO_SP_64W128.lib \ + SRIO_SP_64W16.lib \ + SRIO_TP_1024W36.lib \ + SRIO_TP_128W12.lib \ + SRIO_TP_128W20.lib \ + SRIO_TP_128W30.lib \ + SRIO_TP_128W76.lib \ + SRIO_TP_256W13.lib \ + SRIO_TP_256W70.lib \ + SRIO_TP_256W84.lib \ + SRIO_TP_288W72.lib \ + SRIO_TP_320W10.lib \ + SRIO_TP_320W128.lib \ + SRIO_TP_32W102.lib \ + SRIO_TP_32W70.lib \ + SRIO_TP_32W84.lib \ + SRIO_TP_32W88.lib \ + SRIO_TP_512W72.lib \ + SRIO_TP_512W74.lib \ + SRIO_TP_64W70.lib \ + SRIO_TP_64W92.lib \ + gsm_sub_top.lib \ + CORTEXA15.lib \ + gsm_top.lib \ + mt32_core_wrapper.lib \ + RA14S_top.lib \ + SRIO_top.lib \ + dmu.lib \ + " + +#set_operating_conditions ssgnp_0p675v_125c_cworst_CCworst_T +#source -echo "../common/dc_setup.tcl" +#source -echo "../common/dc_file_RH.tcl" + +#################################################################################### +#Physical Flow needs the files (LEF CAP_TABLE QRC DEF) +################################################################################### +#set_db / .init_lef_files "" +####You can read lef files in two ways. read_physical -lef or source -echo "...." +####read_physical -lef +#read_physical -lef "/space3/Library/SMIC12SFe/Techfile/PRTechFile/INNOVUS_12SFE_9T_v1p0b/TF/1P11M_DV_3DM_Q1_3Q2_2B_2TMa_ALPA2.lef \ +# /space3/Library/SMIC12SFe/Techfile/PRTechFile/INNOVUS_12SFE_9T_v1p0/TF/DFM_via_SFP/1P11M_DV_3DM_Q1_3Q2_2B_2TMa_DFM_via_SFP.lef \ +# /space/PRJ_Back_End/FT-M7004V_RH/CoreLib/Latest/LVT/lef/RHSTD_LVT.lef \ +# /home/project/FT-M7004V_RH/GPIO/Latest/lef/SPC14NSFPD18RN_1P11M_DV_3DM_Q1_3Q2_2B_2TMa.lef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/crossnet/CrossNet_MEM32W100/CrossNet_MEM32W100.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/crossnet/CrossNet_MEM32W68/CrossNet_MEM32W68.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/crossnet/CrossNet_MEM32W84/CrossNet_MEM32W84.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/crossnet/CrossNet_MEM32W120/CrossNet_MEM32W120.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/crossnet/CrossNet_MEM256W33/CrossNet_MEM256W33.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/crossnet/CrossNet_MEM256W54/CrossNet_MEM256W54.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/crossnet/CrossNet_MEM256W58/CrossNet_MEM256W58.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/crossnet/CrossNet_MEM256W61/CrossNet_MEM256W61.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/spi/SPI_syncram_2p/SPI_syncram_2p.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/rgmii/Txfifo_512x76/Txfifo_512x76.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/boot/RBL_512w64b_ROM1/RBL_512w64b_ROM1.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/boot/RBL_512w64b_ROM2/RBL_512w64b_ROM2.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/boot/RBL_512w64b_ROM0/RBL_512w64b_ROM0.plef \ +# /home/project/FT-M7004V_RH/Memory/Latest/memory/boot/RBL_512w64b_ROM3/RBL_512w64b_ROM3.plef \ +# /home/project/FT-M7004V_RH/PLL/P1232/Latest/lef/P1232.lef \ +# /home/project/FT-M7004V_RH/efuse/V1P0/S14NSFPEFUSE_PIPO1KB_V0.2.3/Lef/S14NSFPEFUSE_PIPO1KB_V0.2.3_5M.lef \ +# /space3/Library/7004V/Block_B4DFT/CORTEXA15/lef/CORTEXA15.lef \ +# /space3/Library/7004V/Block_B4DFT/gsm_sub_top/lef/gsm_sub_top.lef \ +# /space3/Library/7004V/Block_B4DFT/mt32_core_wrapper/lef/mt32_core_wrapper.lef \ +# /space3/Library/7004V/Block_B4DFT/pcie_top_wrapper/lef/pcie_top_wrapper_H.lef \ +# /space3/Library/7004V/Block_B4DFT/RA14S_top/lef/RA14S_top.lef \ +# /space3/Library/7004V/Block_B4DFT/SRIO_top/lef/SRIO_top_V.lef \ +# /space3/Library/7004V/Block_B4DFT/xgmac_x1_top_wrapper/lef/xgmac_x1_top_wrapper.lef \ +# /home/project/FT-M7004V_RH/VTsensor/Latest/Lef/S14NSFPVT_V0.3.1_6M.lef" + +#source -echo "/space3/Library/7004V/Block_B4DFT/FullChip_top/lef/fullchip_top.lef" +###for example : source -echo "lef_for_M66AK_FullChip.tcl" +## Provide either cap_table_file or the qrc_tech_file +#set_db / .cap_table_file "........." +#for example : set_db / .cap_table_file "/space2/Library/UMC28HPC/arm_tech/r14p0/cadence_captable/1p8m1a1u/Cmax.captbl" +#read_qrc "/space3/Library/SMIC12SFe/Techfile/QRC/SMIC_CCIQRC_12SFE_0818_1P11M_DV_3DM_Q1_3Q2_2B_2TMa_ALPA2_14SHK_V1.0_REV4_1/rulefiles/CMAX/qrcTechFile" +#for example : read_qrc "/space2/Library/UMC28HPC/Techfile/QRC/UMC_G-DF-LOGIC_MIXED_MODE28N-1P8M1A1U-HPC_AL28K_QRC-LPE_V0.4.P1/Cmax/qrcTechFile" +##generates _reg[] format +## + + + +################################################# +#Making DRC the Highest Priority +################################################### + +set_db / .drc_first true + + + +############################################# +#Datapath +############################################### +set_db dp_analytical_opt standard + + + +########################################################### +#insert clock gate +############################################################ +set_db / .lp_insert_clock_gating true + + + + +#################################################################### +## Load Design +#################################################################### +read_hdl -f ./nc.work/sim_filelist.f +#read_hdl -language sv -define _SYN_TOP_ "sys_filelist.v" +#read_hdl "../../../netlist_toDFT/RH/fullchip_top/AsyncClockSwitching_3_0_0.v ../../../netlist_toDFT/RH/fullchip_top/AsyncClockSwitching_2_0_0.v" +read_hdl -language vhdl -library grlib stdio.vhd +read_hdl -language vhdl -library grlib config.vhd +read_hdl -language vhdl -library grlib version.vhd +read_hdl -language vhdl -library grlib stdlib.vhd +read_hdl -language vhdl -library grlib amba.vhd + +read_hdl -language vhdl -library grlib util.vhd +read_hdl -language vhdl -library gaisler uart.vhd +read_hdl -language vhdl -library grlib devices.vhd +read_hdl -language vhdl -library techmap gencomp.vhd +read_hdl -language vhdl -library grlib spictrlx_extended.vhd +read_hdl -language vhdl -library grlib SPI_syncram_2p_rx.vhd +read_hdl -language vhdl -library grlib SPI_syncram_2p_tx.vhd +#for example:read_hdl -sv "66xDSPList_2.v" + +elaborate $Design +puts "Runtime & Memory after 'read_hdl'" +time_info Elaboration + +init_design +check_design -unresolved +check_timing_intent + +exit + + +#create_ple_model $Design -out_file PLE_file +################################################################################## +#DEF +#################################################################################### +#set_db read_def_libcell_mismatch_error false +#read_def "/space3/Library/7004V/Block_B4DFT/FullChip_top/def/fullchip_top.def.gz" +#for example: read_def "/home/user/dft/jn/FT-M66AK/DEF/M66AK_FullChip.def" + + + +##################################################################### +### Constraints Setup +##################################################################### +read_sdc "/home/user1/dft1/FT-M7004V/netlist_toDFT/RH/fullchip_top/fullchip_top.sdc" +#for example:read_sdc /home/user/dft/jn/FT-M66AK/GENUS_FULLCHIP_CWORST/submit/M66AK_FullChip/M66AK_FullChip.sdc + + + + +####################################################################### +#create new directory +####################################################################### +# +if {![file exists ${_LOG_PATH}]} { + file mkdir ${_LOG_PATH} + puts "Creating directory ${_LOG_PATH}"} + +## +if {![file exists ${_OUTPUTS_PATH}]} { + file mkdir ${_OUTPUTS_PATH} + puts "Creating directory ${_OUTPUTS_PATH}" +} +# +if {![file exists ${_REPORTS_PATH}]} { + file mkdir ${_REPORTS_PATH} + puts "Creating directory ${_REPORTS_PATH}" +} + + +################################################################################## +#Timing Setup +################################################################################## + +set_db time_recovery_arcs false + +#report_timing -lint +# +# + + +################################################################################### +#dont +#################################################################################### +#source -echo "/home/user/dft/jn/FT-M3000+/GENUS/VPE/common/set_dont_use.tcl" +#set_dont_touch mz_fmac +#set_dont_touch [get_cells -hierarchical -filter "ref_name == PREICG_X5B_A12PP140ZTR_C30"] +#set_dont_touch VRF_32X64_8W_14R_1 +#set_dont_touch VRF_32X64_8W_14R_0 +#[ -hierarchical | -of_objects list [-leaf] +#| pattern [-hsc string] [-regexp [-nocase]] ] +#[-quiet] +#get_cells [-hierarchical -filter ["ref_name == PREICG_X5B_A12PP140ZTR_C30"| "is_dont_touch {true}"] + + + +################################################################################### +## Define cost groups (clock-clock, clock-output, input-clock, input-output) +################################################################################### + +## Uncomment to remove already existing costgroups before creating new ones. +## delete_obj [vfind /designs/* -cost_group *] + +if {[llength [all_registers]] > 0} { + define_cost_group -name I2R -design $Design + define_cost_group -name R2O -design $Design + define_cost_group -name R2R -design $Design + + path_group -from [all_inputs] -to [all_registers] -group I2R -name I2R + path_group -from [all_registers] -to [all_outputs] -group R2O -name R2O + path_group -from [all_registers] -to [all_registers] -group R2R -name R2R +} + +define_cost_group -name I2O -design $Design +path_group -from [all_inputs] -to [all_outputs] -group I2O -name I2O +#foreach cg [vfind / -cost_group *] { +##Divide into corresponding PATH GROUPs and report +# report_timing -cost_group [list $cg] >> $_REPORTS_PATH/${Design}_pretim.rpt +#} +report_timing -group R2R > $_REPORTS_PATH/${Design}_R2R_pretim.rpt +report_timing -group I2R > $_REPORTS_PATH/${Design}_I2R_pretim.rpt +report_timing -group R2O > $_REPORTS_PATH/${Design}_R2O_pretim.rpt +report_timing -group I2O > $_REPORTS_PATH/${Design}_I2O_pretim.rpt + +#set_db auto_ungroup none +#ungroup -threshold 5 + + +################################################################################################## +## DFF ---> SDFF Mapping to Complex Sequential Cells +################################################################################################## + +set_db / .dft_scan_style muxed_scan +set_db / .dft_prefix DFT_ +# For VDIO customers, it is recommended to set the value of the next two attributes to false. +set_db / .use_scan_seqs_for_non_dft true +set_db "design:$Design" .dft_scan_map_mode force_all + + +###################################################################################### +##### Retime +###################################################################################### +# +# +#set rt_modules {module:/ module:/ module:/} +#foreach mod $rt_modules { +# set_db $mod .retime true +# ####Uncomment to prevent registers from being moved across the subdesign boundaries +# ##set_db $subd .retime_hard_region true +# ####Uncomment to minimize issues with Conformal LEC +# ##set_db $mod .boundary_opto false +#} +#####Setting 'retime' attribute on the top-level as shown below +#####is not recommended due to possible verification/ECO issues unless for very small designs +###set_db "design:$Design" .retime true +# +#####set dont_retime on registers which should not be retimed +#set dont_rt_flops "inst: inst: inst: ..." +#foreach rtf $rt_flops { +# set_db $rtf .dont_retime true +#} +## Enable verification flow +#set_db / .retime_verification_flow true + +#################################################### +#### To turn off sequential merging on the design +#### uncomment & use the following attributes. +set_db / .optimize_merge_flops true +set_db / .optimize_merge_latches true +#### For a particular instance use attribute 'optimize_merge_seqs' to turn off sequential merging. + + + +########################################### +#Setting Boundary Optimization +########################################### +set_db boundary_opto true +set_db boundary_optimize_constant_hpins true +set_db boundary_optimize_equal_opposite_hpins true +set_db boundary_optimize_feedthrough_hpins true +set_db boundary_optimize_invert_hpins true + + + +############################################## +#Optimizing Total Negative Slack +############################################## +set_db tns_opto true +set_db tns_critical_range 0.2 + +################################## +#Datapath +#################################### +set_db "design:$Design" .dp_csa basic +set_db dp_rewriting advanced +set_db dp_speculation basic +set_db dp_sharing advanced + + +###################################################### +# Allow merging of combinational hierarchical instances +###################################################### + +#set_db merge_combinational_hier_instances true + + + +############################################################### +#Low Power +################################################################## + +set_db "design:$Design" .lp_clock_gating_auto_cost_grouping true +set_db lp_clock_gating_infer_enable true + +#declone_clock_gate -hierarchical +##Power root attributes +#set_db / .lp_clock_gating_prefix +set_db / .lp_power_analysis_effort high +set_db / .lp_power_unit mW +set_db / .lp_toggle_rate_unit /ns +set_db "design:$Design" .lp_clock_gating_extract_common_enable true +set_db lp_insert_discrete_clock_gating_logic true + + + +####################################################################################### +## Leakage/Dynamic power/Clock Gating setup. +####################################################################################### +## The attribute has been set to default value "medium" +## you can try setting it to high to explore MVT QoR for low power optimization +set_db / .leakage_power_effort medium +#set_db "design:$Design" .lp_clock_gating_cell [vfind /lib* -lib_cell ] +#set_db "design:$Design" .max_leakage_power 0.0 +set_db "design:$Design" .lp_power_optimization_weight 0.99 +set_db "design:$Design" .max_dynamic_power 100 + +#set_db "design:$Design" .lp_clock_gating_test_signal +## read_tcf +## read_saif +## read_vcd + +#decrypt PLE_file + +#################################################################################################### +## Synthesizing to generic +#################################################################################################### + +set_db / .syn_generic_effort $GEN_EFF +syn_generic -physical + +puts "Runtime & Memory after 'syn_generic -physical'" +time_info GENERIC +report_dp > $_REPORTS_PATH/generic/${Design}_datapath.rpt +write_snapshot -outdir $_REPORTS_PATH -tag generic +report_summary -directory $_REPORTS_PATH + + +#### Build RTL power models +#build_rtl_power_models -design $Design -clean_up_netlist [-clock_gating_logic] [-relative ] +#report power -rtl + + + +#################################################################### +#Enabling Cell Merging to Multibit Cells +#################################################################### + +set_db use_multibit_cells true + +#################################################################################################### +## Synthesizing to gates +#################################################################################################### + + +## Add '-auto_identify_shift_registers' to 'syn_map' to automatically +## identify functional shift register segments. Not applicable for n2n flow. +set_db / .syn_map_effort $MAP_OPT_EFF + +set_db dp_ungroup_during_syn_map true +set_db optimize_net_area true + +syn_map -physical +puts "Runtime & Memory after 'syn_map -physical'" +time_info MAPPED +write_snapshot -outdir $_REPORTS_PATH -tag map +report_summary -directory $_REPORTS_PATH +report_dp > $_REPORTS_PATH/map/${Design}_datapath.rpt + + +#foreach cg [vfind / -cost_group *] { +# report_timing -cost_group [list $cg] > $_REPORTS_PATH/${Design}_[vbasename $cg]_post_map.rpt +#} +report_timing -group R2R > $_REPORTS_PATH/${Design}_R2R_post_map.rpt +report_timing -group I2R > $_REPORTS_PATH/${Design}_I2R_post_map.rpt +report_timing -group R2O > $_REPORTS_PATH/${Design}_R2O_post_map.rpt +report_timing -group I2O > $_REPORTS_PATH/${Design}_I2O_post_map.rpt + +###The files are used for conformal +write_do_lec -revised_design fv_map -logfile ${_LOG_PATH}/rtl2intermediate.lec.log > ${_OUTPUTS_PATH}/rtl2intermediate.lec.do + +####################################################################################################### +## Optimize Netlist +####################################################################################################### +set_db / .syn_opt_effort $MAP_OPT_EFF +syn_opt -physical +write_snapshot -outdir $_REPORTS_PATH -tag syn_opt +report_summary -directory $_REPORTS_PATH + +puts "Runtime & Memory after 'syn_opt -physical'" +time_info OPT + +#foreach cg [vfind / -cost_group *] { +# report_timing -cost_group [list $cg] > $_REPORTS_PATH/${Design}_[vbasename $cg]_post_opt.rpt +#} +report_timing -group R2R > $_REPORTS_PATH/${Design}_R2R_post_opt.rpt +report_timing -group I2R > $_REPORTS_PATH/${Design}_I2R_post_opt.rpt +report_timing -group R2O > $_REPORTS_PATH/${Design}_R2O_post_opt.rpt +report_timing -group I2O > $_REPORTS_PATH/${Design}_I2O_post_opt.rpt + + + +## Uncomment to remove assigns & insert tiehilo cells during Incremental synthesis +##set_db / .remove_assigns true +##set_remove_assign_options -buffer_or_inverter -design +##set_db / .use_tiehilo_for_const + +###################################################################################### +#incremental opto +###################################################################################### +#########Actually,incremental opto should be run in the Genus Physical Flow. +#########However,it always reports errors in this flow(3rd).This problem has not been solved yet.Thus,we shield incremental opto momentarily. +#########We can use incremental opto in 1st(Simple PLE Flow)\2nd(Spatial Flow) Flow and other cases except 3rd(Genus Physical Flow) Flow. + +## An effort of low was selected to minimize runtime of incremental opto. +## If your timing is not met, rerun incremental opto with a different effort level +#syn_opt -physical -incremental +#write_snapshot -outdir $_REPORTS_PATH -tag syn_opt_low_incr +#report_summary -directory $_REPORTS_PATH +#puts "Runtime & Memory after 'syn_opt -physical -incremental'" +#time_info INCREMENTAL_POST_SCAN_CHAINS + + +############################################# +#Preserving Instances and Modules +############################################## +set_db "design:$Design" .preserve true + + + +###################################################################################################### +## write backend file set (verilog, SDC, config, etc.) +###################################################################################################### +report_area -detail >$_REPORTS_PATH/${Design}_area_detail.rpt +report_clock_gating > $_REPORTS_PATH/${Design}_clockgating.rpt +report_power > $_REPORTS_PATH/${Design}_power.rpt +report_gates -power > $_REPORTS_PATH/${Design}_gates_power.rpt +report_area > $_REPORTS_PATH/${Design}_area.rpt +report_dp > $_REPORTS_PATH/${Design}_datapath_incr.rpt +report_messages > $_REPORTS_PATH/${Design}_messages.rpt +write_snapshot -outdir $_REPORTS_PATH -tag final +report_summary -directory $_REPORTS_PATH +write_hdl > ${_OUTPUTS_PATH}/${Design}_m.v +write_script > ${_OUTPUTS_PATH}/${Design}_m.script +write_sdc > ${_OUTPUTS_PATH}/${Design}_m.sdc +report_ple > $_REPORTS_PATH/ple.rpt +check_design -all > Check_D +write_design -innovus +#write_design -innovus > ${_OUTPUTS_PATH}/${Design}_genp_output.v +#write_design -innovus -base_name > invs_temp_dir/${Design}_genp_output.v + + +################################# +### write_do_lec +################################# +write_do_lec -golden_design fv_map -revised_design ${_OUTPUTS_PATH}/${Design}_m.v -logfile ${_LOG_PATH}/intermediate2final.lec.log > ${_OUTPUTS_PATH}/intermediate2final.lec.do +##Uncomment if the RTL is to be compared with the final netlist.. +write_do_lec -revised_design ${_OUTPUTS_PATH}/${Design}_m.v -logfile ${_LOG_PATH}/rtl2final.lec.log > ${_OUTPUTS_PATH}/rtl2final.lec.do + +puts "Final Runtime & Memory." +time_info FINAL +puts "============================" +puts "Synthesis Finished ........." +puts "============================" + +file copy [get_db / .stdout_log] ${_LOG_PATH}/. + +##quit diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/lib_to_db.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/lib_to_db.tcl new file mode 100644 index 0000000..382e1da --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/lib_to_db.tcl @@ -0,0 +1,7 @@ +set PP [exec bash $env(SCRIPTPATH)/setPP.sh] +echo "PP = ${PP}" + +source "setModuleName.tcl" +read_lib ./${PP}/result/$Design.lib +write_lib $Design -o ./${PP}/result/$Design.db +exit diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/lint_goal.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/lint_goal.tcl new file mode 100644 index 0000000..7a532ad --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/lint_goal.tcl @@ -0,0 +1,25 @@ +#--------------------------------------------------------- +# Lint Hierarchical flow settings +#--------------------------------------------------------- +#set_option decompile_block_constraints yes +#set_option abstract_file_name_style short +#set_option include_block_interface abstract +#set_option use_block_interface yes + +#--------------------------------------------------------- +# Lint turbo flow settings +#--------------------------------------------------------- +#set_option turbo yes +#set_option smart_rule_execution yes +#set_option honor_spq_parameter_with_turbo yes +#set_option disable_turbo_param yes + +current_goal lint/lint_rtl +read_file -type awl $env(SPYGLASSWORK)/waiver/lint.awl +source $env(TCLPATH)/spyglass_lint_rules.tcl +#set_goal_option ignorerules {W164a W164b} +current_goal none + +current_goal lint/design_audit +set_goal_option report {Audit} +current_goal none diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/power_goal.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/power_goal.tcl new file mode 100644 index 0000000..37b43cf --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/power_goal.tcl @@ -0,0 +1,113 @@ +#--------------------------------------------------------- +# power product specific options +#--------------------------------------------------------- +set_option enable_precompile_vlog no +set_option remove_work yes +set_option include_opt_data yes + +#--------------------------------------- +# Synthesis control settings +#--------------------------------------- +# Hierarchical boundary optimization (HBO) can be enabled if SpyGlass reported +# RTL design area is very much higher than reference design run area +# Change the below variable value to 'yes' to enable HBO in the relevant goals +set ENABLE_HBO_FLOW no + +#current_methodology $SPYGLASS_HOME/GuideWare/2018.09-EarlyAdopter/block/rtl_handoff +#--------------------------------------- +# Globally used parameter settings +#--------------------------------------- + +#Tcl proc which defines commonly used PE settings +proc pwr_recommended_est_setting_proc {} { + #global PROJECT_DIR_PATH + # Set the clock gating threshold to match that used by power synthesis + set_parameter sgsyn_clock_gating_threshold 3 + # Set the targeted synthesis to select scan flops + set_goal_option use_scan_flops yes + # Enables monitor on clock and enable nets to improve accuracy + set_parameter pe_enable_monitor_on_clock_nets yes + set_parameter pe_enable_monitor_on_enable_nets yes + #To increase amount of nets covered under monitors + set_parameter pe_logic_depth 25 + # Enable multi-process synthesis to save runtime + global env + if { [ file exists $env(TCLPATH)/synth_options.tcl ] } { + set_option sgsyn_opt_file $env(TCLPATH)/synth_options.tcl + } + #To display the additional clock-gating efficiency metrics + set_parameter pe_enable_advance_cgemetric 1 + set_parameter pe_num_unset_nets 2000000 + #set_parameter pe_generate_fsdb 1 + #set_parameter pe_enable_component_power_graph 1 + #set_parameter pe_enable_component_activity_graph 1 + #set_parameter pe_report_power_for_each_simfile 1 + #set_parameter pe_num_clock_cycles_avg_power 10 +} +# end pwr_recommended_est_setting_proc +################### Optional GOAL ################################## +## Grading vectors and finding activity hotspots ## +#################################################################### +current_goal power/power_activity_check + # Specifies the intervals (in terms of number of cycles of the fastest clock) + # at which activity values should be averaged. + set_parameter pe_num_clock_cycles_avg_act 100 + # Enables monitor on clock and enable nets to improve accuracy + set_parameter pe_enable_monitor_on_clock_nets yes + set_parameter pe_enable_monitor_on_enable_nets yes + set_parameter pe_num_unset_nets 2000000 +current_goal none + +################### Mandatory GOAL ################################# +## Power Audit for checking the data integrity ## +#################################################################### +current_goal power/power_audit + # Use settings defined in the Tcl proc + pwr_recommended_est_setting_proc +current_goal none + +proc DefinePowerEstGoal {goal_name} { + global ENABLE_HBO_FLOW + + ################### Optional GOAL ################################ + ## Power Estimation on Original RTL without calibration data ## + ################################################################## + #current_goal power/$goal_name -scenario NoCalibData + current_goal power/$goal_name + # Use settings defined in the Tcl proc + pwr_recommended_est_setting_proc + # HBO flow is enabled if the top level variable is set + if { $ENABLE_HBO_FLOW == "yes" } { + set_goal_option enable_hbo yes + } + ##Uncomment below parameters to display component power/activity graphs in n-cycle mode + #set_parameter pe_num_clock_cycles_avg_power 100 + #set_parameter pe_enable_component_power_graph 1 + #set_parameter pe_enable_component_activity_graph 1 + current_goal none + } +# end proc DefinePowerEstGoal + +#power_est_average : power estimation. +DefinePowerEstGoal power_est_average +#power_est_profiling : power estimation + profiling. +DefinePowerEstGoal power_est_profiling + +################### Recommended GOAL ############################### +## CGE profiling across multiple simulation files (New in 2017.03)## +## This is a LCA feature in 2017.03 and needs additional license ## +#################################################################### +#current_goal power/power_cge_profiling -scenario NoCalibData +current_goal power/power_cge_profiling + # Use settings defined in the Tcl proc + pwr_recommended_est_setting_proc + # HBO flow is enabled if the top level variable is set + if { $ENABLE_HBO_FLOW == "yes" } { + set_goal_option enable_hbo yes + } + + + + +current_goal none + diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/pt.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/pt.tcl new file mode 100644 index 0000000..af8ecad --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/pt.tcl @@ -0,0 +1,84 @@ +source "./ProjectPathSetting.tcl" + +set sh_enable_page_mode true +set power_enable_analysis true +set run_dc false +set run_pt true + +source "./setModuleName.tcl" +set pt_date [exec date +%Y_%m%d_%H%M] + +set PP [exec bash $env(SCRIPTPATH)/setPP.sh] +echo "PP = ${PP}" + +source "${PROJECTPATH}/syn/synopsys_dc.setup" + +set timing_non_unate_clock_compatibility true + +echo $env(FLAT) +if { $env(FLAT) == "TRUE"} { +source "./dc.work/filelist_pt.v" +set sdcfile1 $env(SDCPATH)/${Design}_flatten.sdc +} else { +set netlistfile ./${PP}/result/$Design.sv +set sdcfile1 $env(SDCPATH)/${Design}.sdc +} +#set sdcfile1 ./${PP}/report/$Design.sdc +set sdcfile2 ${PROJECTPATH}/syn/SDC/synopsys.sdc +set specialfile ./dc.work/syn_specific.tcl + +read_verilog $netlistfile +current_design $Design + +link_design + +source -echo $sdcfile1 +source -echo $sdcfile2 +source -echo $specialfile +source -echo "${PROJECTPATH}/syn/set_library.tcl" + +echo $env(DEBUGSDC) +if { $env(DEBUGSDC) == "TRUE"} { + return +} + +check_timing -include {clock_crossing} -verbose > check_timing_pt.txt +if { $env(FLAT) == "TRUE"} { +exec perl $env(SCRIPTPATH)/clock_cross.pl check_timing_pt.txt ${Design}_FLAT_clock_cross.log +} else { +exec perl $env(SCRIPTPATH)/clock_cross.pl check_timing_pt.txt ${Design}_clock_cross.log +} + +group_path -name in2reg -from [all_inputs] +group_path -name reg2out -to [all_outputs] +group_path -name in2out -from [all_inputs] -to [all_outputs] +group_path -name reg2reg -from [all_registers] -to [all_registers] + +report_timing -group [get_path_groups] -max_paths 1000 -transition_time -capacitance > report_timing_pt.txt + +echo $env(CHECKTIMING) +if { $env(CHECKTIMING) == "TRUE"} { + return +} + +if { ! [string match *FullChip $Design]} then { +echo "current design is $Design" +set extract_model_clock_transition_limit 0.4 +set extract_model_capacitance_limit 0.4 +set extract_model_data_transition_limit 0.4 +set extract_model_num_capacitance_points 5 +set extract_model_num_clock_transition_points 5 +set extract_model_num_data_transition_points 5 +extract_model -output ./${PP}/result/$Design -format lib -library_cell +} + +exec cp pt.log ${PP}/pt.log +exec cp check_timing_pt.txt ${PP}/check_timing_pt.txt +exec cp report_timing_pt.txt ${PP}/report_timing_pt.txt +if { $env(FLAT) == "TRUE"} { +exec cp ${Design}_FLAT_clock_cross.log ${PP}/${Design}_FLAT_clock_cross.log +} else { +exec cp ${Design}_clock_cross.log ${PP}/${Design}_clock_cross.log +} + +exit diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/rdc_goal.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/rdc_goal.tcl new file mode 100644 index 0000000..89d60e0 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/rdc_goal.tcl @@ -0,0 +1,59 @@ +#--------------------------------------------------------- +# sdc constraint to check cdc settings +#--------------------------------------------------------- +#set_option sdc2sgdc yes +#set_option sdc2sgdcfile ./${top-module-name}.sdc2sgdc.out + +proc cdc_verify_struct_add_settings {} { + +#set_goal_option addrule { Ac_abstract01 } ; ##used for CDC hierarchical flow +#set_goal_option block_abstract yes ; ##used for CDC hierarchical flow +set_goal_option report { CDC-detailed-report SynchInfo } +set_parameter dump_sync_info detailed_mod +set_parameter show_module_in_spreadsheet yes +set_parameter enable_ac_sync_qualdepth yes +set_parameter conv_sync_as_src yes +set_parameter conv_src_seq_depth 0 +set_parameter check_multiclock_bbox yes +set_parameter cdc_qualifier_depth 3 +set_parameter conv_sync_seq_depth 1 +set_parameter handle_combo_arc yes +set_parameter allow_combo_logic yes +set_parameter report_common_reset yes +set_parameter allow_merged_qualifier strict + +set_goal_option addrules { Clock_sync05a Clock_sync06a } +set_goal_option overloadrule { Clock_sync05a+severity=Error } +set_goal_option overloadrule { Clock_sync06a+severity=Error } +set_goal_option overloadrules Reset_sync02+severity=Error + +#set_parameter enable_sync no ; ## disable automatically recognize synchronization scheme +#set_parameter enable_clock_gate_sync no ;## disable automatically recognize synchronization scheme +#set_parameter enable_multiflop_sync no ; ## disbale automatically recognize synchronization scheme +#set_parameter enable_mux_sync none ; ## disable automatically recognize synchronization scheme +#set_parameter enable_and_sync no ; ## disable automatically recognize synchronization scheme +#set_parameter glitch_protect_cell "gp_and,gp_mux" ; ## specify glitch protect cell naem + +#set_parameter synchronize_cells "sync1,sync2" ; ## user defined synchronizer for scalar control signal +#set_parameter reset_synchronize_cells "sync1,sync2" ; ## user defined synchronizer for scalar control signal +#set_parameter synchronize_data_cells "sync1,sync2" ; ## user defined synchronizer for vector control signal +#set_parameter msg_inst_mod_report all ; ## + +#set_parameter report_all_flops yes ; ## report all flops for Reset_sync02 +#set_parameter enable_reset_cone_spreadsheet yes ; ## enable spreadsheet for Reset_sync02 +} + +proc rdc_verify_struct_add_settings {} { +#set_goal_option treat_import_as_ip_block yes +#set_parameter report_flop_reset_info yes +set_parameter report_reset_type all +} + +current_goal rdc/rdc_verify_struct +read_file -type awl waiver/rdc.awl +cdc_verify_struct_add_settings +rdc_verify_struct_add_settings +current_goal none + + + diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/sdc_goal.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/sdc_goal.tcl new file mode 100644 index 0000000..195f057 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/sdc_goal.tcl @@ -0,0 +1,42 @@ + +proc sdc_add_settings {} { + +} + +current_goal constraints/sdc_gen +read_file -type awl waiver/sdc.awl +sdc_add_settings +current_goal none + + +current_goal constraints/sdc_audit +read_file -type awl waiver/sdc.awl +sdc_add_settings +current_goal none + +current_goal constraints/sdc_check +read_file -type awl waiver/sdc.awl +sdc_add_settings +current_goal none + +current_goal constraints/sdc_exception_struct +read_file -type awl waiver/sdc.awl +sdc_add_settings +current_goal none + + +current_goal constraints/sdc_redundancy +read_file -type awl waiver/sdc.awl +sdc_add_settings +current_goal none + +current_goal constraints/sdc_equiv +read_file -type awl waiver/sdc.awl +sdc_add_settings +current_goal none + +current_goal constraints/sdc_hier_equiv +read_file -type awl waiver/sdc.awl +sdc_add_settings +current_goal none + diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/spyglass_lint_rules.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/spyglass_lint_rules.tcl new file mode 100644 index 0000000..3618e20 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/spyglass_lint_rules.tcl @@ -0,0 +1,140 @@ +set_goal_option rules { +ArrayIndex +BitOrder-ML +#checkOPPinConnectedToNet_a +CheckTimeUnitandPrecision-ML +CombLoop +DeadCode +DisallowCaseX-ML +DisallowXInCaseZ-ML +HangingInstInput-ML +HangingInst-ML +#HangingInstOutput-ML +FlopClockConstant +FlopEConst +NoExprInPort-ML +SepStateMachine +SetBeforeRead-ML +#sim_race01 +sim_race02 +STARC05-2.2.3.3 +STARC05-2.3.6.1 +STARC05-2.8.1.6 +STARC05-2.10.3.5 +STARC05-2.11.3.1 +STARC05-3.2.3.1 +STARC05-3.2.3.2 +STARC05-2.3.2.2 +STARC-1.4.3.4 +STARC-2.3.6.1 +STARC-2.8.1.4 +STARC-3.2.3.2 +SYNTH_5255 +SYNTH_5192 +UndrivenInTerm-ML +W120 +W122 +W123 +W154 +W18 +W19 +W192 +W193 +W245 +W263 +W287a +W337 +W398 +W414 +W415 +W415a +W422 +W423 +W442a +W480 +W490 +W502 +WRN_27 +} + +set_goal_option overloadrules W398+severity=ERROR +set_goal_option overloadrules W480+severity=ERROR +set_goal_option overloadrules W122+severity=ERROR +set_goal_option overloadrules W123+severity=ERROR +set_goal_option overloadrules FlopClockConstant+severity=ERROR +set_goal_option overloadrules W415+severity=ERROR +set_goal_option overloadrules W415a+severity=WARNING ## +set_goal_option overloadrules STARC-3.2.3.2+severity=ERROR +set_goal_option overloadrules W120+severity=WARNING +set_goal_option overloadrules W154+severity=ERROR +set_goal_option overloadrules W18+severity=ERROR +set_goal_option overloadrules W19+severity=ERROR +set_goal_option overloadrules W192+severity=ERROR +set_goal_option overloadrules W193+severity=ERROR +set_goal_option overloadrules W423+severity=ERROR +set_goal_option overloadrules ArrayIndex+severity=ERROR +set_goal_option overloadrules DisallowCaseX-ML+severity=ERROR +set_goal_option overloadrules STARC-2.3.6.1+severity=ERROR +set_goal_option overloadrules STARC-2.8.1.4+severity=ERROR +set_goal_option overloadrules STARC05-3.2.3.1+severity=ERROR +set_goal_option overloadrules STARC05-2.3.2.2+severity=ERROR +set_goal_option overloadrules UndrivenInTerm-ML+severity=ERROR +set_goal_option overloadrules STARC05-2.2.3.3+severity=ERROR +#set_goal_option overloadrules checkOPPinConnectedToNet_a+severity=WARNING +set_goal_option overloadrules CombLoop+severity=ERROR +set_goal_option overloadrules CheckTimeUnitandPrecision-ML+severity=ERROR +set_goal_option overloadrules DisallowXInCaseZ-ML+severity=ERROR +set_goal_option overloadrules HangingInstInput-ML+severity=ERROR +set_goal_option overloadrules HangingInst-ML+severity=ERROR +#set_goal_option overloadrules HangingInstOutput-ML+severity=WARNING +set_goal_option overloadrules STARC-1.4.3.4+severity=ERROR +set_goal_option overloadrules STARC05-2.11.3.1+severity=ERROR +set_goal_option overloadrules W263+severity=ERROR +set_goal_option overloadrules FlopEConst+severity=ERROR +set_goal_option overloadrules W287a+severity=ERROR +set_goal_option overloadrules BitOrder-ML+severity=ERROR +set_goal_option overloadrules STARC05-2.10.3.5+severity=ERROR +set_goal_option overloadrules SepStateMachine+severity=ERROR +set_goal_option overloadrules SYNTH_5255+severity=ERROR +set_goal_option overloadrules W442a+severity=ERROR +set_goal_option overloadrules W337+severity=ERROR +set_goal_option overloadrules W414+severity=ERROR +set_goal_option overloadrules W422+severity=ERROR +set_goal_option overloadrules SYNTH_5192+severity=ERROR +set_goal_option overloadrules SetBeforeRead-ML+severity=ERROR +set_goal_option overloadrules STARC05-2.3.6.1+severity=ERROR +set_goal_option overloadrules STARC05-3.2.3.2+severity=ERROR +#set_goal_option overloadrules sim_race01+severity=WARNING +set_goal_option overloadrules sim_race02+severity=ERROR +set_goal_option overloadrules WRN_27+severity=ERROR +set_goal_option overloadrules W490+severity=ERROR +set_goal_option overloadrules STARC05-2.8.1.6+severity=ERROR +set_goal_option overloadrules W245+severity=ERROR +set_goal_option overloadrules W502+severity=ERROR +set_goal_option overloadrules W71+severity=WARNING +set_goal_option overloadrules W116+severity=WARNING +set_goal_option overloadrules W362+severity=WARNING +set_goal_option overloadrules UndrivenInTerm-ML+severity=WARNING +set_goal_option overloadrules W164a+severity=WARNING +set_goal_option overloadrules NoExprInPort-ML+severity=WARNING +set_goal_option overloadrules DeadCode+severity=WARNING +set_goal_option overloadrules W240+severity=WARNING +set_goal_option overloadrules STARC-2.6.2.2+severity=WARNING +set_goal_option overloadrules W164b+severity=WARNING +set_goal_option overloadrules SignedUnsignedExpr-ML+severity=WARNING + + +set_parameter assume_driver_load both +set_parameter checkInHierarchy yes +set_parameter checkRTLCInst yes +set_parameter handle_greybox yes +set_parameter instname {/^[a-zA-Z0-9_]+$/} +set_parameter check_static_value yes +set_parameter strict yes +set_parameter report_reset_type all +set_parameter report_underflow_expressions yes +set_parameter report_max_val_overflow yes +set_parameter handle_equivalent_drivers yes +set_parameter checkconstassign yes +set_parameter check_bbox_driver yes +set_parameter ignore_sync_reset yes diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/syn_main.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/syn_main.tcl new file mode 100644 index 0000000..c6dbde1 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/syn_main.tcl @@ -0,0 +1,347 @@ +set run_dc true +set run_pt false + +set RTL_DC_ID "" +set RTL_SIM_ID "" + +source -echo "./ProjectPathSetting.tcl" + +#-------------------------------------------------------------- +# NOTE: CHANGE DESIGN NAME TO YOUR OWN +source -echo "./setModuleName.tcl" + +source -echo "./synopsys_dc.setup" + +if { [string match *FullChip $Design]} then { + echo "current design is $Design" + #source -echo "RTL_SIM_ID.tcl" + #source -echo "RTL_DC_ID.tcl" + if { $RTL_DC_ID != $RTL_SIM_ID} then { + echo "RTL_DC_ID != RTL_SIM_ID" + echo "RTL_DC_ID = $RTL_DC_ID" + echo "RTL_SIM_ID = $RTL_SIM_ID" + return + } +} + +#-------------------------------------------------------------- +#Reload ddc +echo $env(LOADDDC) +if { $env(LOADDDC) == "TRUE"} { + read_ddc $env(PP)/report/${Design}.ddc + return +} +#-------------------------------------------------------------- +set dc_date [exec date +%Y_%m%d_%H%M] +exec mkdir dc.work/${Design}_${dc_date} +exec mkdir dc.work/${Design}_${dc_date}/result +exec mkdir dc.work/${Design}_${dc_date}/report + +remove_design -all + +#-------------------------------------------------------------- + +set view_command_win {true} +set_host_options -max_cores 16 + +set compile_enable_async_mux_mapping {true} +set template_naming_style {%s_%p} +set template_parameter_style {%d} +set template_separator_style {_} + +set hdl_keep_licenses {false} +set hdlin_ff_always_async_set_reset {true} +set hdlin_latch_always_async_set_reset {true} +set hdlin_ff_always_sync_set_reset {false} +##set hdlin_use_carry_in true +set hdlin_check_no_latch {true} +set hdlin_mux_size_limit {32} +set hdlin_shorten_long_module_name true +set hdlin_while_loop_iterations 8192 +set hdlin_module_name_limit 128 + +set verilogout_equation {false} +set verilogout_single_bit {false} +set verilogout_higher_designs_first {true} +set verilogout_no_tri {true} +#set verilogout_show_unconnected_pins {false} +set verilogout_show_unconnected_pins {true} + +define_name_rules M2G_MODULE_LEVEL -allowed "A-Z a-z 0-9 _" ; +define_name_rules M2G_MODULE_LEVEL -first_restricted "0-9" ; +define_name_rules M2G_MODULE_LEVEL -replacement_char "_" ; +define_name_rules M2G_MODULE_LEVEL -collapse_name_space ; +define_name_rules M2G_MODULE_LEVEL -case_insensitive ; +define_name_rules M2G_MODULE_LEVEL -remove_internal_net_bus ; +define_name_rules M2G_MODULE_LEVEL -equal_ports_nets ; +define_name_rules M2G_MODULE_LEVEL -add_dummy_nets ; +define_name_rules M2G_MODULE_LEVEL -max_length 128 -type port ; +define_name_rules M2G_MODULE_LEVEL -max_length 64 -type cell ; +define_name_rules M2G_MODULE_LEVEL -max_length 64 -type net ; + +set default_name_rules M2G_MODULE_LEVEL ; + +set bus_dimension_separator_style {_} +set bus_naming_style {%s[%d]} +set bus_range_separator_style {:} +set bus_inference_descending_sort {true} +set bus_inference_style {%s[%d]} +#set write_name_nets_same_as_ports {false} +set write_name_nets_same_as_ports {true} +set bus_minus_style {-%d} +set bus_extraction_style {%s[%d:%d]} + +set change_names_dont_change_bus_members {false} +set uniquify_naming_style %s_%d + +set compile_instance_name_prefix {U} +set compile_instance_name_suffix {} + +set compile_preserve_subdesign_interfaces {true} +set compile_assume_fully_decoded_three_state_busses {false} +set compile_disable_hierarchical_inverter_opt {true} +set enable_recovery_removal_arcs {false} + +set fsm_auto_inferring {true} +set gen_show_created_symbols {true} +set case_analysis_with_logic_constants {true} +set power_cg_auto_identify {true} +set compile_auto_ungroup_count_leaf_cells {true} +set compile_auto_ungroup_override_wlm {true} + +set compile_delete_unloaded_sequential_cells {true} +set compile_seqmap_propagate_constants {true} +set compile_seqmap_propagate_high_effort {true} +set compile_seqmap_propagate_constants_size_only {true} + +set_svf dc.work/${Design}_${dc_date}/report/${Design}.svf + +#-------------------------------------------------------------- +#void warning Info # +#-------------------------------------------------------------- +#suppress_message HDL-193 +#suppress_message LINT-45 +#suppress_message OPT-1056 +#suppress_message PWR-877 +#set suppress_errors {VHDL-2285} + +#-------------------------------------------------------------- +#read↦ link↦ Check design# +#-------------------------------------------------------------- +set DESIGN_RTL_DIR ../cv32e40p-master/rtl + +source -echo "./dc.work/specific_filelist.tcl" +analyze -f SVERILOG -library work -vcs "-f ./nc.work/sim_filelist.f" +redirect -append -file dc.log {elaborate $Design} +current_design $Design +#link +if { [link] == 0} { + echo "Link failed!" + echo $env(CHECKCODE) + if { $env(CHECKCODE) == "TRUE"} { + exit + } + return +} + +#**set timing_enable_multiple_clocks_per_reg true +check_design > dc.work/${Design}_${dc_date}/report/${Design}_check_design.txt + +echo $env(CHECKCODE) +if { $env(CHECKCODE) == "TRUE"} { + echo "Link success!" + exit +} + +#-------------------------------------------------------------- +# set library +# NOTE: ADD YOUR OWN LIBRARY +# ------------------------------------------------------------- +#set_operating_conditions ssg_cworst_max_0p81v_m40c +#set zerowireload Zero +#set auto_wire_load_selection false +#set_wire_load_mode top +##set_wire_load_model -name "$zerowireload" [current_design] +#current_design $Design +source -echo "${PROJECTPATH}/syn/set_library.tcl" + +#------------------------------------------------------------------ +#set_dont_use +source -echo "${PROJECTPATH}/syn/dont_use.tcl" +#------------------------------------------------------------------ + +#remove_license HDL-Compiler + +#change name before compile +report_names -rules verilog -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_1.rpt +redirect -append -file dc.log {change_names -rules verilog -hierarchy -verbose} +report_names -rules M2G_MODULE_LEVEL -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_2.rpt +redirect -append -file dc.log {change_names -rules M2G_MODULE_LEVEL -hierarchy -verbose} + + +#-------------------------------------------------------------- +# read clock set and input output constraints +# NOTE: CHANGE FILE NAME TO YOUR OWN +# --------------------------------------------------------------- +echo $env(DEBUGSDC) +if { $env(DEBUGSDC) == "TRUE"} { + return +} + +redirect -append -file dc.log {source -echo "$env(SDCPATH)/${Design}.sdc"} +source -echo "$env(SDCPATH)/synopsys.sdc" + +#----------------------------------------------------------------- +#set dont_touch design +#----------------------------------------------------------------- +source -echo ./dc.work/syn_specific.tcl + +uniquify -dont_skip_empty_designs + +#---------------------------------------------------------------------------- +#set UPF file +#NOTE: +# +#load_upf MatrixIP_top_u2.upf +#set upf_allow_DD_primary_with_supply_sets true +#set_voltage 0.81 -object_list {VDD VDD1sw VDD2sw} +#set_voltage 0.0 -object_list {VSS} +##insert_mv_cells -isolation -verbose +#check_mv_design -verbose + +#-------------------------------------------------------------- +#check design +report_port -verbose > dc.work/${Design}_${dc_date}/report/${Design}_port.txt +report_clock > dc.work/${Design}_${dc_date}/report/${Design}_clock.txt + + +set_fix_multiple_port_nets -all -buffer_constants -feedthroughs [ get_designs "*" ] + +current_design $Design + +#set_ultra_optimization true + +set_max_dynamic_power 0.0 + +#ungroup -all -flatten + +#set ports_clock_root [filter_collection [get_attribute [get_clocks] sources] object_class==port] +#group_path -name REGOUT -to [all_outputs] +#group_path -name REGIN -from [remove_from_collection [all_inputs] $ports_clock_root] +#group_path -name FEEDTHROUGH -from [remove_from_collection [all_inputs] $ports_clock_root] -to [all_outputs] + +group_path -name in2reg -from [all_inputs] -critical_range 1000.0 +group_path -name reg2out -to [all_outputs] -critical_range 1000.0 +group_path -name in2out -from [all_inputs] -to [all_outputs] -critical_range 1000.0 +group_path -name reg2reg -from [all_registers] -to [all_registers] -critical_range 1000.0 + +#set_compile_directives -constant_propagation true [get_cells -hierarchical *] + +set_cost_priority -delay +set_critical_range 0.2 $Design +redirect -append -file dc.log {remove_unconnected_ports [get_cells -hier * ] } + +check_design > dc.work/${Design}_${dc_date}/report/${Design}_check_design_aftercom.txt +analyze_datapath_extraction > dc.work/${Design}_${dc_date}/report/${Design}_analyze_datapath_extraction.rpt + +compile_ultra -no_autoungroup -timing_high_effort -gate_clock -no_seq_output_inversion -scan +#compile_ultra -no_autoungroup -timing_high_effort -gate_clock -no_seq_output_inversion + +#foreach_in_collection desig [remove_from_collection [get_designs "*"] [get_designs {FADDSUB_top}]] { +# lappend rename_design_list $desig +#} + +#rename_design $rename_design_list -prefix FADDSUB_ +rename_design [remove_from_collection [get_designs "*"] $Design] -prefix ${Design}_ + + +#-------------------------------------------------------------- +#write_report + +if { [llength [get_cells main_gate -hier -filter "clock_gating_logic == true"]] != 0 } { + remove_clock_gating_check [get_cells main_gate -hier -filter "clock_gating_logic == true"] +} + + +report_names -rules verilog -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_3.rpt +redirect -append -file dc.log {change_names -rules verilog -hierarchy -verbose} +report_names -rules M2G_MODULE_LEVEL -hierarchy > dc.work/${Design}_${dc_date}/report/rename_info_4.rpt +redirect -append -file dc.log {change_names -rules M2G_MODULE_LEVEL -hierarchy -verbose} + +#write_report +write -format verilog -hierarchy $Design -output dc.work/${Design}_${dc_date}/result/${Design}.sv +write -format ddc -hierarchy -output dc.work/${Design}_${dc_date}/report/${Design}.ddc +report_timing -max 1000 -transition_time -capacitance > dc.work/${Design}_${dc_date}/report/${Design}_timing.txt +report_constraint -all_violators > dc.work/${Design}_${dc_date}/report/${Design}_constraint.txt +write_script > dc.work/${Design}_${dc_date}/report/${Design}.sdc +write_sdc -nosplit dc.work/${Design}_${dc_date}/report/${Design}.sdc +report_design > dc.work/${Design}_${dc_date}/report/${Design}_design.txt +report_reference -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_reference.rpt +report_net > dc.work/${Design}_${dc_date}/report/${Design}_net.rpt +report_names -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_names.rpt +report_resources -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_resource.rpt +report_multibit -hier > dc.work/${Design}_${dc_date}/report/${Design}_multibit.rpt +report_power > dc.work/${Design}_${dc_date}/report/${Design}_power.txt +report_qor > dc.work/${Design}_${dc_date}/report/${Design}_qor.txt +report_clock_tree_power > dc.work/${Design}_${dc_date}/report/${Design}_clkpower.txt +report_clock_gating > dc.work/${Design}_${dc_date}/report/${Design}_clock_gating.txt +report_area -nosplit -hierarchy > dc.work/${Design}_${dc_date}/report/${Design}_area.txt +report_timing -max 100 -transition_time -capacitance -group in2reg > dc.work/${Design}_${dc_date}/report/${Design}_in2reg +report_timing -max 100 -transition_time -capacitance -group reg2out > dc.work/${Design}_${dc_date}/report/${Design}_reg2out +report_timing -max 100 -transition_time -capacitance -group in2out > dc.work/${Design}_${dc_date}/report/${Design}_in2out +report_timing -max 100 -transition_time -capacitance -group reg2reg > dc.work/${Design}_${dc_date}/report/${Design}_reg2reg +check_timing -include {gated_clock clock_crossing} > dc.work/${Design}_${dc_date}/report/${Design}_check_timing.rpt +#report_timing \ +# -path full_clock \ +# -transition_time \ +# -crosstalk_delta \ +# -capacitance \ +# -input_pins \ +# -nets \ +# -delay max \ +# -derate \ +# -max_paths 100 > ${dc_date}/timing/${DESIGN}_${dc_date}_timing_dc.txt +# + +set_svf -off + +check_mv_design -verbose > dc.work/${Design}_${dc_date}/report/${Design}_check_upf.log + +#remove_design -hierarchy MatrixIP_Core_Scalar_PG +#remove_design -hierarchy MatrixIP_Core_Vector_PG + +#write -format verilog -hierarchy $Design -output dc.work/${Design}_${dc_date}/result/${Design}_hier.sv +#exec rm ../Netlist_9T_125C/${Design}.v +#exec cp dc.work/${Design}_${dc_date}/result/${Design}.sv ../Netlist_9T_125C/${Design}.v +#-------------------------------------------------------------- +#quit + +set dc_date0 [exec date +%Y_%m%d_%H%M] +echo ${dc_date} ${dc_date0} + +exec $env(SCRIPTPATH)/get_DBs_info.sh +exec $env(SCRIPTPATH)/report_dc_summary.sh +exec cp dc.work/${Design}_${dc_date}/report/${Design}_check_design.txt dc.work/${Design}_${dc_date}/check_design.txt +exec cp dc.work/${Design}_${dc_date}/report/${Design}_check_timing.rpt dc.work/${Design}_${dc_date}/check_timing.txt +exec cp dc.log dc.work/${Design}_${dc_date}/dc.log +exec cp command.log dc.work/${Design}_${dc_date}/command.log +exec cp RTL_DC_info.log dc.work/${Design}_${dc_date}/RTL_DC_info.log +exec cp RTL_DC_ID.tcl dc.work/${Design}_${dc_date}/RTL_DC_ID.tcl +exec cp update_RTL_SVN.sh dc.work/${Design}_${dc_date}/update_RTL_SVN.sh + +#remove_sdc +#source -echo "${PROJECTPATH}/syn/SDC/${Design}.sdc" + +source -echo "./dc.work/syn_specific_after.tcl" + +if { [file exists dc.work/${Design}_${dc_date}/result/${Design}.sv] == 1} { +exec mkdir NetlistSubmit/${Design}_${dc_date} +exec cp dc.work/${Design}_${dc_date}/result/${Design}.sv NetlistSubmit/${Design}_${dc_date}/ +exec cp dc.work/${Design}_${dc_date}/report/${Design}_qor.txt NetlistSubmit/${Design}_${dc_date}/ +#exec cp dc.work/${Design}_${dc_date}/report/${Design}_memory_clock.rpt NetlistSubmit/${Design}_${dc_date}/ +} + +echo $env(FLOW) +if { $env(FLOW) == "TRUE"} { + exit +} diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/synth_options.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/synth_options.tcl new file mode 100644 index 0000000..bf11fa2 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/synth_options.tcl @@ -0,0 +1,12 @@ +# File added as part of PowerKit_M2017.03-SP1_v1 + +# Synthesis command to enable multi process synthesis +syn_set_global_option enable_multi_process 2 +# Synthesis command to control maximum number of parallel synth process +syn_set_global_option max_core_count_for_multi_process 4 + +# To enable new ABC engine +# Disabled by default i.e old ABC engine is used +# Enable only under product team guidance. +# Usefull in case of Syntheis crash or Higher synth Area with old ABC +##syn_set_global_option select_new_ABC 1 diff --git a/src/UWE_projectCode/tmp/tmp/Tcls/txv_goal.tcl b/src/UWE_projectCode/tmp/tmp/Tcls/txv_goal.tcl new file mode 100644 index 0000000..fe53347 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Tcls/txv_goal.tcl @@ -0,0 +1,34 @@ +proc txv_fp_add_settings {} { +set_parameter tc_domain_mode STA +set_parameter pt no +} + + +proc txv_mcp_add_settings {} { +set_parameter tc_domain_mode STA +set_parameter pt no +set_goal_option addrules {Txv_Gen_Assert} +set_goal_option ignorerules {Txv_MCP01} +} + +current_goal txv_verification/fp_verification +read_file -type awl waiver/txv.awl +txv_fp_add_settings +current_goal none + +current_goal txv_verification/mcp_verification +read_file -type awl waiver/txv.awl +txv_mcp_add_settings +current_goal none + +current_goal txv_verification/mcp_verification -scenario TBA +read_file -type awl waiver/txv.awl +txv_mcp_add_settings +set_parameter txv_mcp_time_based_sva_gen yes +current_goal none + +current_goal txv_verification/fp_mcp_verification +read_file -type awl waiver/txv.awl +txv_mcp_add_settings +txv_fp_add_settings +current_goal none diff --git a/src/UWE_projectCode/tmp/tmp/Template/command.log b/src/UWE_projectCode/tmp/tmp/Template/command.log new file mode 100644 index 0000000..5a5892d --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Template/command.log @@ -0,0 +1,6627 @@ +#@ # +#@ # Running dc_shell Version O-2018.06-SP1 for linux64 -- Jul 19, 2018 +#@ # Date: Tue Feb 28 19:57:38 2023 +#@ # Run by: UWE@Frontend +#@ + +source /EDA/Synopsys/syn/O-2018.06-SP1/admin/setup/.synopsys_dc.setup +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/admin/setup/.synopsys_dc.setup + +#@ # +#@ # ".synopsys_dc.setup" Initialization File for +#@ # +#@ # Dc_Shell and Design_Analyzer +#@ # +#@ # The variables in this file define the behavior of many parts +#@ # of the Synopsys Synthesis Tools. Upon installation, they should +#@ # be reviewed and modified to fit your site's needs. Each engineer +#@ # can have a .synopsys file in his/her home directory or current +#@ # directory to override variable settings in this file. +#@ # +#@ # Each logical grouping of variables is commented as to their +#@ # nature and effect on the Synthesis Commands. Examples of +#@ # variable groups are the Compile Variable Group, which affects +#@ # the designs produced by the COMPILE command, and the Schematic +#@ # Variable Group, which affects the output of the create_schematic +#@ # command. +#@ # +#@ # You can type "man _variables" in dc_shell or +#@ # design_analyzer to get help about a group of variables. +#@ # For instance, to get help about the "system" variable group, +#@ # type "help system_variables". You can also type +#@ # "man ", to get help on the that variable's +#@ # group. +#@ # +#@ +#@ # System variables +#@ set sh_command_abbrev_mode "Anywhere" +#@ set sh_continue_on_error "true" +#@ update_app_var -default true sh_continue_on_error +#@ set sh_enable_page_mode "true" +#@ update_app_var -default true sh_enable_page_mode +#@ set sh_source_uses_search_path "true" +#@ update_app_var -default true sh_source_uses_search_path +#@ if {$synopsys_program_name == "dc_shell" || $synopsys_program_name == "de_shell" || $synopsys_program_name == "dc_sms_shell" } { +#@ set sh_new_variable_message "false" +#@ update_app_var -default false sh_new_variable_message +#@ } else { +#@ set sh_new_variable_message "true" +#@ update_app_var -default true sh_new_variable_message +#@ } +#@ +#@ if {$synopsys_program_name == "dc_shell"} { +#@ set html_log_enable "false" +#@ set html_log_filename "default.html" +#@ } +#@ +#@ if {$synopsys_program_name == "de_shell"} { +#@ set de_log_html_filename "default.html" +#@ } +#@ +#@ if {$synopsys_program_name == "dc_shell" || $synopsys_program_name == "de_shell"} { +#@ lappend auto_path [file join ${synopsys_root} auxx syn lib] +#@ package require cae +#@ } +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/tm.tcl + +#@ # -*- tcl -*- +#@ # +#@ # Searching for Tcl Modules. Defines a procedure, declares it as the primary +#@ # command for finding packages, however also uses the former 'package unknown' +#@ # command as a fallback. +#@ # +#@ # Locates all possible packages in a directory via a less restricted glob. The +#@ # targeted directory is derived from the name of the requested package, i.e. +#@ # the TM scan will look only at directories which can contain the requested +#@ # package. It will register all packages it found in the directory so that +#@ # future requests have a higher chance of being fulfilled by the ifneeded +#@ # database without having to come to us again. +#@ # +#@ # We do not remember where we have been and simply rescan targeted directories +#@ # when invoked again. The reasoning is this: +#@ # +#@ # - The only way we get back to the same directory is if someone is trying to +#@ # [package require] something that wasn't there on the first scan. +#@ # +#@ # Either +#@ # 1) It is there now: If we rescan, you get it; if not you don't. +#@ # +#@ # This covers the possibility that the application asked for a package +#@ # late, and the package was actually added to the installation after the +#@ # application was started. It shoukld still be able to find it. +#@ # +#@ # 2) It still is not there: Either way, you don't get it, but the rescan +#@ # takes time. This is however an error case and we dont't care that much +#@ # about it +#@ # +#@ # 3) It was there the first time; but for some reason a "package forget" has +#@ # been run, and "package" doesn't know about it anymore. +#@ # +#@ # This can be an indication that the application wishes to reload some +#@ # functionality. And should work as well. +#@ # +#@ # Note that this also strikes a balance between doing a glob targeting a +#@ # single package, and thus most likely requiring multiple globs of the same +#@ # directory when the application is asking for many packages, and trying to +#@ # glob for _everything_ in all subdirectories when looking for a package, +#@ # which comes with a heavy startup cost. +#@ # +#@ # We scan for regular packages only if no satisfying module was found. +#@ +#@ namespace eval ::tcl::tm { +#@ # Default paths. None yet. +#@ +#@ variable paths {} +#@ +#@ # The regex pattern a file name has to match to make it a Tcl Module. +#@ +#@ set pkgpattern {^([_[:alpha:]][:_[:alnum:]]*)-([[:digit:]].*)[.]tm$} +#@ +#@ # Export the public API +#@ +#@ namespace export path +#@ namespace ensemble create -command path -subcommands {add remove list} +#@ } +#@ +#@ # ::tcl::tm::path implementations -- +#@ # +#@ # Public API to the module path. See specification. +#@ # +#@ # Arguments +#@ # cmd - The subcommand to execute +#@ # args - The paths to add/remove. Must not appear querying the +#@ # path with 'list'. +#@ # +#@ # Results +#@ # No result for subcommands 'add' and 'remove'. A list of paths for +#@ # 'list'. +#@ # +#@ # Sideeffects +#@ # The subcommands 'add' and 'remove' manipulate the list of paths to +#@ # search for Tcl Modules. The subcommand 'list' has no sideeffects. +#@ +#@ proc ::tcl::tm::add {args} { +#@ # PART OF THE ::tcl::tm::path ENSEMBLE +#@ # +#@ # The path is added at the head to the list of module paths. +#@ # +#@ # The command enforces the restriction that no path may be an ancestor +#@ # directory of any other path on the list. If the new path violates this +#@ # restriction an error wil be raised. +#@ # +#@ # If the path is already present as is no error will be raised and no +#@ # action will be taken. +#@ +#@ variable paths +#@ +#@ # We use a copy of the path as source during validation, and extend it as +#@ # well. Because we not only have to detect if the new paths are bogus with +#@ # respect to the existing paths, but also between themselves. Otherwise we +#@ # can still add bogus paths, by specifying them in a single call. This +#@ # makes the use of the new paths simpler as well, a trivial assignment of +#@ # the collected paths to the official state var. +#@ +#@ set newpaths $paths +#@ foreach p $args { +#@ if {$p in $newpaths} { +#@ # Ignore a path already on the list. +#@ continue +#@ } +#@ +#@ # Search for paths which are subdirectories of the new one. If there +#@ # are any then the new path violates the restriction about ancestors. +#@ +#@ set pos [lsearch -glob $newpaths ${p}/*] +#@ # Cannot use "in", we need the position for the message. +#@ if {$pos >= 0} { +#@ return -code error "$p is ancestor of existing module path [lindex $newpaths $pos]." +#@ } +#@ +#@ # Now look for existing paths which are ancestors of the new one. This +#@ # reverse question forces us to loop over the existing paths, as each +#@ # element is the pattern, not the new path :( +#@ +#@ foreach ep $newpaths { +#@ if {[string match ${ep}/* $p]} { +#@ return -code error "$p is subdirectory of existing module path $ep." +#@ } +#@ } +#@ +#@ set newpaths [linsert $newpaths 0 $p] +#@ } +#@ +#@ # The validation of the input is complete and successful, and everything +#@ # in newpaths is either an old path, or added. We can now extend the +#@ # official list of paths, a simple assignment is sufficient. +#@ +#@ set paths $newpaths +#@ return +#@ } +#@ +#@ proc ::tcl::tm::remove {args} { +#@ # PART OF THE ::tcl::tm::path ENSEMBLE +#@ # +#@ # Removes the path from the list of module paths. The command is silently +#@ # ignored if the path is not on the list. +#@ +#@ variable paths +#@ +#@ foreach p $args { +#@ set pos [lsearch -exact $paths $p] +#@ if {$pos >= 0} { +#@ set paths [lreplace $paths $pos $pos] +#@ } +#@ } +#@ } +#@ +#@ proc ::tcl::tm::list {} { +#@ # PART OF THE ::tcl::tm::path ENSEMBLE +#@ +#@ variable paths +#@ return $paths +#@ } +#@ +#@ # ::tcl::tm::UnknownHandler -- +#@ # +#@ # Unknown handler for Tcl Modules, i.e. packages in module form. +#@ # +#@ # Arguments +#@ # original - Original [package unknown] procedure. +#@ # name - Name of desired package. +#@ # version - Version of desired package. Can be the +#@ # empty string. +#@ # exact - Either -exact or ommitted. +#@ # +#@ # Name, version, and exact are used to determine satisfaction. The +#@ # original is called iff no satisfaction was achieved. The name is also +#@ # used to compute the directory to target in the search. +#@ # +#@ # Results +#@ # None. +#@ # +#@ # Sideeffects +#@ # May populate the package ifneeded database with additional provide +#@ # scripts. +#@ +#@ proc ::tcl::tm::UnknownHandler {original name args} { +#@ # Import the list of paths to search for packages in module form. +#@ # Import the pattern used to check package names in detail. +#@ +#@ variable paths +#@ variable pkgpattern +#@ +#@ # Without paths to search we can do nothing. (Except falling back to the +#@ # regular search). +#@ +#@ if {[llength $paths]} { +#@ set pkgpath [string map {:: /} $name] +#@ set pkgroot [file dirname $pkgpath] +#@ if {$pkgroot eq "."} { +#@ set pkgroot "" +#@ } +#@ +#@ # We don't remember a copy of the paths while looping. Tcl Modules are +#@ # unable to change the list while we are searching for them. This also +#@ # simplifies the loop, as we cannot get additional directories while +#@ # iterating over the list. A simple foreach is sufficient. +#@ +#@ set satisfied 0 +#@ foreach path $paths { +#@ if {![interp issafe] && ![file exists $path]} { +#@ continue +#@ } +#@ set currentsearchpath [file join $path $pkgroot] +#@ if {![interp issafe] && ![file exists $currentsearchpath]} { +#@ continue +#@ } +#@ set strip [llength [file split $path]] +#@ +#@ # We can't use glob in safe interps, so enclose the following in a +#@ # catch statement, where we get the module files out of the +#@ # subdirectories. In other words, Tcl Modules are not-functional +#@ # in such an interpreter. This is the same as for the command +#@ # "tclPkgUnknown", i.e. the search for regular packages. +#@ +#@ catch { +#@ # We always look for _all_ possible modules in the current +#@ # path, to get the max result out of the glob. +#@ +#@ foreach file [glob -nocomplain -directory $currentsearchpath *.tm] { +#@ set pkgfilename [join [lrange [file split $file] $strip end] ::] +#@ +#@ if {![regexp -- $pkgpattern $pkgfilename --> pkgname pkgversion]} { +#@ # Ignore everything not matching our pattern for +#@ # package names. +#@ continue +#@ } +#@ try { +#@ package vcompare $pkgversion 0 +#@ } on error {} { +#@ # Ignore everything where the version part is not +#@ # acceptable to "package vcompare". +#@ continue +#@ } +#@ +#@ if {[package ifneeded $pkgname $pkgversion] ne {}} { +#@ # There's already a provide script registered for +#@ # this version of this package. Since all units of +#@ # code claiming to be the same version of the same +#@ # package ought to be identical, just stick with +#@ # the one we already have. +#@ continue +#@ } +#@ +#@ # We have found a candidate, generate a "provide script" +#@ # for it, and remember it. Note that we are using ::list +#@ # to do this; locally [list] means something else without +#@ # the namespace specifier. +#@ +#@ # NOTE. When making changes to the format of the provide +#@ # command generated below CHECK that the 'LOCATE' +#@ # procedure in core file 'platform/shell.tcl' still +#@ # understands it, or, if not, update its implementation +#@ # appropriately. +#@ # +#@ # Right now LOCATE's implementation assumes that the path +#@ # of the package file is the last element in the list. +#@ +#@ package ifneeded $pkgname $pkgversion "[::list package provide $pkgname $pkgversion];[::list source -encoding utf-8 $file]" +#@ +#@ # We abort in this unknown handler only if we got a +#@ # satisfying candidate for the requested package. +#@ # Otherwise we still have to fallback to the regular +#@ # package search to complete the processing. +#@ +#@ if {($pkgname eq $name) +#@ && [package vsatisfies $pkgversion {*}$args]} { +#@ set satisfied 1 +#@ +#@ # We do not abort the loop, and keep adding provide +#@ # scripts for every candidate in the directory, just +#@ # remember to not fall back to the regular search +#@ # anymore. +#@ } +#@ } +#@ } +#@ } +#@ +#@ if {$satisfied} { +#@ return +#@ } +#@ } +#@ +#@ # Fallback to previous command, if existing. See comment above about +#@ # ::list... +#@ +#@ if {[llength $original]} { +#@ uplevel 1 $original [::linsert $args 0 $name] +#@ } +#@ } +#@ +#@ # ::tcl::tm::Defaults -- +#@ # +#@ # Determines the default search paths. +#@ # +#@ # Arguments +#@ # None +#@ # +#@ # Results +#@ # None. +#@ # +#@ # Sideeffects +#@ # May add paths to the list of defaults. +#@ +#@ proc ::tcl::tm::Defaults {} { +#@ global env tcl_platform +#@ +#@ lassign [split [info tclversion] .] major minor +#@ set exe [file normalize [info nameofexecutable]] +#@ +#@ # Note that we're using [::list], not [list] because [list] means +#@ # something other than [::list] in this namespace. +#@ roots [::list [file dirname [info library]] [file join [file dirname [file dirname $exe]] lib] ] +#@ +#@ if {$tcl_platform(platform) eq "windows"} { +#@ set sep ";" +#@ } else { +#@ set sep ":" +#@ } +#@ for {set n $minor} {$n >= 0} {incr n -1} { +#@ foreach ev [::list TCL${major}.${n}_TM_PATH TCL${major}_${n}_TM_PATH ] { +#@ if {![info exists env($ev)]} continue +#@ foreach p [split $env($ev) $sep] { +#@ path add $p +#@ } +#@ } +#@ } +#@ return +#@ } +#@ +#@ # ::tcl::tm::roots -- +#@ # +#@ # Public API to the module path. See specification. +#@ # +#@ # Arguments +#@ # paths - List of 'root' paths to derive search paths from. +#@ # +#@ # Results +#@ # No result. +#@ # +#@ # Sideeffects +#@ # Calls 'path add' to paths to the list of module search paths. +#@ +#@ proc ::tcl::tm::roots {paths} { +#@ lassign [split [package present Tcl] .] major minor +#@ foreach pa $paths { +#@ set p [file join $pa tcl$major] +#@ for {set n $minor} {$n >= 0} {incr n -1} { +#@ set px [file join $p ${major}.${n}] +#@ if {![interp issafe]} {set px [file normalize $px]} +#@ path add $px +#@ } +#@ set px [file join $p site-tcl] +#@ if {![interp issafe]} {set px [file normalize $px]} +#@ path add $px +#@ } +#@ return +#@ } +#@ +#@ # Initialization. Set up the default paths, then insert the new handler into +#@ # the chain. +#@ +#@ if {![interp issafe]} {::tcl::tm::Defaults} +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/tm.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/package.tcl + +#@ # package.tcl -- +#@ # +#@ # utility procs formerly in init.tcl which can be loaded on demand +#@ # for package management. +#@ # +#@ # Copyright (c) 1991-1993 The Regents of the University of California. +#@ # Copyright (c) 1994-1998 Sun Microsystems, Inc. +#@ # +#@ # See the file "license.terms" for information on usage and redistribution +#@ # of this file, and for a DISCLAIMER OF ALL WARRANTIES. +#@ # +#@ +#@ namespace eval tcl::Pkg {} +#@ +#@ # ::tcl::Pkg::CompareExtension -- +#@ # +#@ # Used internally by pkg_mkIndex to compare the extension of a file to a given +#@ # extension. On Windows, it uses a case-insensitive comparison because the +#@ # file system can be file insensitive. +#@ # +#@ # Arguments: +#@ # fileName name of a file whose extension is compared +#@ # ext (optional) The extension to compare against; you must +#@ # provide the starting dot. +#@ # Defaults to [info sharedlibextension] +#@ # +#@ # Results: +#@ # Returns 1 if the extension matches, 0 otherwise +#@ +#@ proc tcl::Pkg::CompareExtension {fileName {ext {}}} { +#@ global tcl_platform +#@ if {$ext eq ""} {set ext [info sharedlibextension]} +#@ if {$tcl_platform(platform) eq "windows"} { +#@ return [string equal -nocase [file extension $fileName] $ext] +#@ } else { +#@ # Some unices add trailing numbers after the .so, so +#@ # we could have something like '.so.1.2'. +#@ set root $fileName +#@ while {1} { +#@ set currExt [file extension $root] +#@ if {$currExt eq $ext} { +#@ return 1 +#@ } +#@ +#@ # The current extension does not match; if it is not a numeric +#@ # value, quit, as we are only looking to ignore version number +#@ # extensions. Otherwise we might return 1 in this case: +#@ # tcl::Pkg::CompareExtension foo.so.bar .so +#@ # which should not match. +#@ +#@ if {![string is integer -strict [string range $currExt 1 end]]} { +#@ return 0 +#@ } +#@ set root [file rootname $root] +#@ } +#@ } +#@ } +#@ +#@ # pkg_mkIndex -- +#@ # This procedure creates a package index in a given directory. The package +#@ # index consists of a "pkgIndex.tcl" file whose contents are a Tcl script that +#@ # sets up package information with "package require" commands. The commands +#@ # describe all of the packages defined by the files given as arguments. +#@ # +#@ # Arguments: +#@ # -direct (optional) If this flag is present, the generated +#@ # code in pkgMkIndex.tcl will cause the package to be +#@ # loaded when "package require" is executed, rather +#@ # than lazily when the first reference to an exported +#@ # procedure in the package is made. +#@ # -verbose (optional) Verbose output; the name of each file that +#@ # was successfully rocessed is printed out. Additionally, +#@ # if processing of a file failed a message is printed. +#@ # -load pat (optional) Preload any packages whose names match +#@ # the pattern. Used to handle DLLs that depend on +#@ # other packages during their Init procedure. +#@ # dir - Name of the directory in which to create the index. +#@ # args - Any number of additional arguments, each giving +#@ # a glob pattern that matches the names of one or +#@ # more shared libraries or Tcl script files in +#@ # dir. +#@ +#@ proc pkg_mkIndex {args} { +#@ set usage {"pkg_mkIndex ?-direct? ?-lazy? ?-load pattern? ?-verbose? ?--? dir ?pattern ...?"} +#@ +#@ set argCount [llength $args] +#@ if {$argCount < 1} { +#@ return -code error "wrong # args: should be\n$usage" +#@ } +#@ +#@ set more "" +#@ set direct 1 +#@ set doVerbose 0 +#@ set loadPat "" +#@ for {set idx 0} {$idx < $argCount} {incr idx} { +#@ set flag [lindex $args $idx] +#@ switch -glob -- $flag { +#@ -- { +#@ # done with the flags +#@ incr idx +#@ break +#@ } +#@ -verbose { +#@ set doVerbose 1 +#@ } +#@ -lazy { +#@ set direct 0 +#@ append more " -lazy" +#@ } +#@ -direct { +#@ append more " -direct" +#@ } +#@ -load { +#@ incr idx +#@ set loadPat [lindex $args $idx] +#@ append more " -load $loadPat" +#@ } +#@ -* { +#@ return -code error "unknown flag $flag: should be\n$usage" +#@ } +#@ default { +#@ # done with the flags +#@ break +#@ } +#@ } +#@ } +#@ +#@ set dir [lindex $args $idx] +#@ set patternList [lrange $args [expr {$idx + 1}] end] +#@ if {![llength $patternList]} { +#@ set patternList [list "*.tcl" "*[info sharedlibextension]"] +#@ } +#@ +#@ try { +#@ set fileList [glob -directory $dir -tails -types {r f} -- {*}$patternList] +#@ } on error {msg opt} { +#@ return -options $opt $msg +#@ } +#@ foreach file $fileList { +#@ # For each file, figure out what commands and packages it provides. +#@ # To do this, create a child interpreter, load the file into the +#@ # interpreter, and get a list of the new commands and packages that +#@ # are defined. +#@ +#@ if {$file eq "pkgIndex.tcl"} { +#@ continue +#@ } +#@ +#@ set c [interp create] +#@ +#@ # Load into the child any packages currently loaded in the parent +#@ # interpreter that match the -load pattern. +#@ +#@ if {$loadPat ne ""} { +#@ if {$doVerbose} { +#@ tclLog "currently loaded packages: '[info loaded]'" +#@ tclLog "trying to load all packages matching $loadPat" +#@ } +#@ if {![llength [info loaded]]} { +#@ tclLog "warning: no packages are currently loaded, nothing" +#@ tclLog "can possibly match '$loadPat'" +#@ } +#@ } +#@ foreach pkg [info loaded] { +#@ if {![string match -nocase $loadPat [lindex $pkg 1]]} { +#@ continue +#@ } +#@ if {$doVerbose} { +#@ tclLog "package [lindex $pkg 1] matches '$loadPat'" +#@ } +#@ try { +#@ load [lindex $pkg 0] [lindex $pkg 1] $c +#@ } on error err { +#@ if {$doVerbose} { +#@ tclLog "warning: load [lindex $pkg 0] [lindex $pkg 1]\nfailed with: $err" +#@ } +#@ } on ok {} { +#@ if {$doVerbose} { +#@ tclLog "loaded [lindex $pkg 0] [lindex $pkg 1]" +#@ } +#@ } +#@ if {[lindex $pkg 1] eq "Tk"} { +#@ # Withdraw . if Tk was loaded, to avoid showing a window. +#@ $c eval [list wm withdraw .] +#@ } +#@ } +#@ +#@ $c eval { +#@ # Stub out the package command so packages can require other +#@ # packages. +#@ +#@ rename package __package_orig +#@ proc package {what args} { +#@ switch -- $what { +#@ require { +#@ return; # Ignore transitive requires +#@ } +#@ default { +#@ __package_orig $what {*}$args +#@ } +#@ } +#@ } +#@ proc tclPkgUnknown args {} +#@ package unknown tclPkgUnknown +#@ +#@ # Stub out the unknown command so package can call into each other +#@ # during their initialilzation. +#@ +#@ proc unknown {args} {} +#@ +#@ # Stub out the auto_import mechanism +#@ +#@ proc auto_import {args} {} +#@ +#@ # reserve the ::tcl namespace for support procs and temporary +#@ # variables. This might make it awkward to generate a +#@ # pkgIndex.tcl file for the ::tcl namespace. +#@ +#@ namespace eval ::tcl { +#@ variable dir ;# Current directory being processed +#@ variable file ;# Current file being processed +#@ variable direct ;# -direct flag value +#@ variable x ;# Loop variable +#@ variable debug ;# For debugging +#@ variable type ;# "load" or "source", for -direct +#@ variable namespaces ;# Existing namespaces (e.g., ::tcl) +#@ variable packages ;# Existing packages (e.g., Tcl) +#@ variable origCmds ;# Existing commands +#@ variable newCmds ;# Newly created commands +#@ variable newPkgs {} ;# Newly created packages +#@ } +#@ } +#@ +#@ $c eval [list set ::tcl::dir $dir] +#@ $c eval [list set ::tcl::file $file] +#@ $c eval [list set ::tcl::direct $direct] +#@ +#@ # Download needed procedures into the slave because we've just deleted +#@ # the unknown procedure. This doesn't handle procedures with default +#@ # arguments. +#@ +#@ foreach p {::tcl::Pkg::CompareExtension} { +#@ $c eval [list namespace eval [namespace qualifiers $p] {}] +#@ $c eval [list proc $p [info args $p] [info body $p]] +#@ } +#@ +#@ try { +#@ $c eval { +#@ set ::tcl::debug "loading or sourcing" +#@ +#@ # we need to track command defined by each package even in the +#@ # -direct case, because they are needed internally by the +#@ # "partial pkgIndex.tcl" step above. +#@ +#@ proc ::tcl::GetAllNamespaces {{root ::}} { +#@ set list $root +#@ foreach ns [namespace children $root] { +#@ lappend list {*}[::tcl::GetAllNamespaces $ns] +#@ } +#@ return $list +#@ } +#@ +#@ # init the list of existing namespaces, packages, commands +#@ +#@ foreach ::tcl::x [::tcl::GetAllNamespaces] { +#@ set ::tcl::namespaces($::tcl::x) 1 +#@ } +#@ foreach ::tcl::x [package names] { +#@ if {[package provide $::tcl::x] ne ""} { +#@ set ::tcl::packages($::tcl::x) 1 +#@ } +#@ } +#@ set ::tcl::origCmds [info commands] +#@ +#@ # Try to load the file if it has the shared library extension, +#@ # otherwise source it. It's important not to try to load +#@ # files that aren't shared libraries, because on some systems +#@ # (like SunOS) the loader will abort the whole application +#@ # when it gets an error. +#@ +#@ if {[::tcl::Pkg::CompareExtension $::tcl::file [info sharedlibextension]]} { +#@ # The "file join ." command below is necessary. Without +#@ # it, if the file name has no \'s and we're on UNIX, the +#@ # load command will invoke the LD_LIBRARY_PATH search +#@ # mechanism, which could cause the wrong file to be used. +#@ +#@ set ::tcl::debug loading +#@ load [file join $::tcl::dir $::tcl::file] +#@ set ::tcl::type load +#@ } else { +#@ set ::tcl::debug sourcing +#@ source [file join $::tcl::dir $::tcl::file] +#@ set ::tcl::type source +#@ } +#@ +#@ # As a performance optimization, if we are creating direct +#@ # load packages, don't bother figuring out the set of commands +#@ # created by the new packages. We only need that list for +#@ # setting up the autoloading used in the non-direct case. +#@ if {!$::tcl::direct} { +#@ # See what new namespaces appeared, and import commands +#@ # from them. Only exported commands go into the index. +#@ +#@ foreach ::tcl::x [::tcl::GetAllNamespaces] { +#@ if {![info exists ::tcl::namespaces($::tcl::x)]} { +#@ namespace import -force ${::tcl::x}::* +#@ } +#@ +#@ # Figure out what commands appeared +#@ +#@ foreach ::tcl::x [info commands] { +#@ set ::tcl::newCmds($::tcl::x) 1 +#@ } +#@ foreach ::tcl::x $::tcl::origCmds { +#@ unset -nocomplain ::tcl::newCmds($::tcl::x) +#@ } +#@ foreach ::tcl::x [array names ::tcl::newCmds] { +#@ # determine which namespace a command comes from +#@ +#@ set ::tcl::abs [namespace origin $::tcl::x] +#@ +#@ # special case so that global names have no +#@ # leading ::, this is required by the unknown +#@ # command +#@ +#@ set ::tcl::abs [lindex [auto_qualify $::tcl::abs ::] 0] +#@ +#@ if {$::tcl::x ne $::tcl::abs} { +#@ # Name changed during qualification +#@ +#@ set ::tcl::newCmds($::tcl::abs) 1 +#@ unset ::tcl::newCmds($::tcl::x) +#@ } +#@ } +#@ } +#@ } +#@ +#@ # Look through the packages that appeared, and if there is a +#@ # version provided, then record it +#@ +#@ foreach ::tcl::x [package names] { +#@ if {[package provide $::tcl::x] ne "" +#@ && ![info exists ::tcl::packages($::tcl::x)]} { +#@ lappend ::tcl::newPkgs [list $::tcl::x [package provide $::tcl::x]] +#@ } +#@ } +#@ } +#@ } on error msg { +#@ set what [$c eval set ::tcl::debug] +#@ if {$doVerbose} { +#@ tclLog "warning: error while $what $file: $msg" +#@ } +#@ } on ok {} { +#@ set what [$c eval set ::tcl::debug] +#@ if {$doVerbose} { +#@ tclLog "successful $what of $file" +#@ } +#@ set type [$c eval set ::tcl::type] +#@ set cmds [lsort [$c eval array names ::tcl::newCmds]] +#@ set pkgs [$c eval set ::tcl::newPkgs] +#@ if {$doVerbose} { +#@ if {!$direct} { +#@ tclLog "commands provided were $cmds" +#@ } +#@ tclLog "packages provided were $pkgs" +#@ } +#@ if {[llength $pkgs] > 1} { +#@ tclLog "warning: \"$file\" provides more than one package ($pkgs)" +#@ } +#@ foreach pkg $pkgs { +#@ # cmds is empty/not used in the direct case +#@ lappend files($pkg) [list $file $type $cmds] +#@ } +#@ +#@ if {$doVerbose} { +#@ tclLog "processed $file" +#@ } +#@ } +#@ interp delete $c +#@ } +#@ +#@ append index "# Tcl package index file, version 1.1\n" +#@ append index "# This file is generated by the \"pkg_mkIndex$more\" command\n" +#@ append index "# and sourced either when an application starts up or\n" +#@ append index "# by a \"package unknown\" script. It invokes the\n" +#@ append index "# \"package ifneeded\" command to set up package-related\n" +#@ append index "# information so that packages will be loaded automatically\n" +#@ append index "# in response to \"package require\" commands. When this\n" +#@ append index "# script is sourced, the variable \$dir must contain the\n" +#@ append index "# full path name of this file's directory.\n" +#@ +#@ foreach pkg [lsort [array names files]] { +#@ set cmd {} +#@ lassign $pkg name version +#@ lappend cmd ::tcl::Pkg::Create -name $name -version $version +#@ foreach spec [lsort -index 0 $files($pkg)] { +#@ foreach {file type procs} $spec { +#@ if {$direct} { +#@ set procs {} +#@ } +#@ lappend cmd "-$type" [list $file $procs] +#@ } +#@ } +#@ append index "\n[eval $cmd]" +#@ } +#@ +#@ set f [open [file join $dir pkgIndex.tcl] w] +#@ puts $f $index +#@ close $f +#@ } +#@ +#@ # tclPkgSetup -- +#@ # This is a utility procedure use by pkgIndex.tcl files. It is invoked as +#@ # part of a "package ifneeded" script. It calls "package provide" to indicate +#@ # that a package is available, then sets entries in the auto_index array so +#@ # that the package's files will be auto-loaded when the commands are used. +#@ # +#@ # Arguments: +#@ # dir - Directory containing all the files for this package. +#@ # pkg - Name of the package (no version number). +#@ # version - Version number for the package, such as 2.1.3. +#@ # files - List of files that constitute the package. Each +#@ # element is a sub-list with three elements. The first +#@ # is the name of a file relative to $dir, the second is +#@ # "load" or "source", indicating whether the file is a +#@ # loadable binary or a script to source, and the third +#@ # is a list of commands defined by this file. +#@ +#@ proc tclPkgSetup {dir pkg version files} { +#@ global auto_index +#@ +#@ package provide $pkg $version +#@ foreach fileInfo $files { +#@ set f [lindex $fileInfo 0] +#@ set type [lindex $fileInfo 1] +#@ foreach cmd [lindex $fileInfo 2] { +#@ if {$type eq "load"} { +#@ set auto_index($cmd) [list load [file join $dir $f] $pkg] +#@ } else { +#@ set auto_index($cmd) [list source [file join $dir $f]] +#@ } +#@ } +#@ } +#@ } +#@ +#@ # tclPkgUnknown -- +#@ # This procedure provides the default for the "package unknown" function. It +#@ # is invoked when a package that's needed can't be found. It scans the +#@ # auto_path directories and their immediate children looking for pkgIndex.tcl +#@ # files and sources any such files that are found to setup the package +#@ # database. As it searches, it will recognize changes to the auto_path and +#@ # scan any new directories. +#@ # +#@ # Arguments: +#@ # name - Name of desired package. Not used. +#@ # version - Version of desired package. Not used. +#@ # exact - Either "-exact" or omitted. Not used. +#@ +#@ proc tclPkgUnknown {name args} { +#@ global auto_path env +#@ +#@ if {![info exists auto_path]} { +#@ return +#@ } +#@ # Cache the auto_path, because it may change while we run through the +#@ # first set of pkgIndex.tcl files +#@ set old_path [set use_path $auto_path] +#@ while {[llength $use_path]} { +#@ set dir [lindex $use_path end] +#@ +#@ # Make sure we only scan each directory one time. +#@ if {[info exists tclSeenPath($dir)]} { +#@ set use_path [lrange $use_path 0 end-1] +#@ continue +#@ } +#@ set tclSeenPath($dir) 1 +#@ +#@ # we can't use glob in safe interps, so enclose the following in a +#@ # catch statement, where we get the pkgIndex files out of the +#@ # subdirectories +#@ catch { +#@ foreach file [glob -directory $dir -join -nocomplain * pkgIndex.tcl] { +#@ set dir [file dirname $file] +#@ if {![info exists procdDirs($dir)]} { +#@ try { +#@ source $file +#@ } trap {POSIX EACCES} {} { +#@ # $file was not readable; silently ignore +#@ continue +#@ } on error msg { +#@ tclLog "error reading package index file $file: $msg" +#@ } on ok {} { +#@ set procdDirs($dir) 1 +#@ } +#@ } +#@ } +#@ } +#@ set dir [lindex $use_path end] +#@ if {![info exists procdDirs($dir)]} { +#@ set file [file join $dir pkgIndex.tcl] +#@ # safe interps usually don't have "file exists", +#@ if {([interp issafe] || [file exists $file])} { +#@ try { +#@ source $file +#@ } trap {POSIX EACCES} {} { +#@ # $file was not readable; silently ignore +#@ continue +#@ } on error msg { +#@ tclLog "error reading package index file $file: $msg" +#@ } on ok {} { +#@ set procdDirs($dir) 1 +#@ } +#@ } +#@ } +#@ +#@ set use_path [lrange $use_path 0 end-1] +#@ +#@ # Check whether any of the index scripts we [source]d above set a new +#@ # value for $::auto_path. If so, then find any new directories on the +#@ # $::auto_path, and lappend them to the $use_path we are working from. +#@ # This gives index scripts the (arguably unwise) power to expand the +#@ # index script search path while the search is in progress. +#@ set index 0 +#@ if {[llength $old_path] == [llength $auto_path]} { +#@ foreach dir $auto_path old $old_path { +#@ if {$dir ne $old} { +#@ # This entry in $::auto_path has changed. +#@ break +#@ } +#@ incr index +#@ } +#@ } +#@ +#@ # $index now points to the first element of $auto_path that has +#@ # changed, or the beginning if $auto_path has changed length Scan the +#@ # new elements of $auto_path for directories to add to $use_path. +#@ # Don't add directories we've already seen, or ones already on the +#@ # $use_path. +#@ foreach dir [lrange $auto_path $index end] { +#@ if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { +#@ lappend use_path $dir +#@ } +#@ } +#@ set old_path $auto_path +#@ } +#@ } +#@ +#@ # tcl::MacOSXPkgUnknown -- +#@ # This procedure extends the "package unknown" function for MacOSX. It scans +#@ # the Resources/Scripts directories of the immediate children of the auto_path +#@ # directories for pkgIndex files. +#@ # +#@ # Arguments: +#@ # original - original [package unknown] procedure +#@ # name - Name of desired package. Not used. +#@ # version - Version of desired package. Not used. +#@ # exact - Either "-exact" or omitted. Not used. +#@ +#@ proc tcl::MacOSXPkgUnknown {original name args} { +#@ # First do the cross-platform default search +#@ uplevel 1 $original [linsert $args 0 $name] +#@ +#@ # Now do MacOSX specific searching +#@ global auto_path +#@ +#@ if {![info exists auto_path]} { +#@ return +#@ } +#@ # Cache the auto_path, because it may change while we run through the +#@ # first set of pkgIndex.tcl files +#@ set old_path [set use_path $auto_path] +#@ while {[llength $use_path]} { +#@ set dir [lindex $use_path end] +#@ +#@ # Make sure we only scan each directory one time. +#@ if {[info exists tclSeenPath($dir)]} { +#@ set use_path [lrange $use_path 0 end-1] +#@ continue +#@ } +#@ set tclSeenPath($dir) 1 +#@ +#@ # get the pkgIndex files out of the subdirectories +#@ foreach file [glob -directory $dir -join -nocomplain * Resources Scripts pkgIndex.tcl] { +#@ set dir [file dirname $file] +#@ if {![info exists procdDirs($dir)]} { +#@ try { +#@ source $file +#@ } trap {POSIX EACCES} {} { +#@ # $file was not readable; silently ignore +#@ continue +#@ } on error msg { +#@ tclLog "error reading package index file $file: $msg" +#@ } on ok {} { +#@ set procdDirs($dir) 1 +#@ } +#@ } +#@ } +#@ set use_path [lrange $use_path 0 end-1] +#@ +#@ # Check whether any of the index scripts we [source]d above set a new +#@ # value for $::auto_path. If so, then find any new directories on the +#@ # $::auto_path, and lappend them to the $use_path we are working from. +#@ # This gives index scripts the (arguably unwise) power to expand the +#@ # index script search path while the search is in progress. +#@ set index 0 +#@ if {[llength $old_path] == [llength $auto_path]} { +#@ foreach dir $auto_path old $old_path { +#@ if {$dir ne $old} { +#@ # This entry in $::auto_path has changed. +#@ break +#@ } +#@ incr index +#@ } +#@ } +#@ +#@ # $index now points to the first element of $auto_path that has +#@ # changed, or the beginning if $auto_path has changed length Scan the +#@ # new elements of $auto_path for directories to add to $use_path. +#@ # Don't add directories we've already seen, or ones already on the +#@ # $use_path. +#@ foreach dir [lrange $auto_path $index end] { +#@ if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { +#@ lappend use_path $dir +#@ } +#@ } +#@ set old_path $auto_path +#@ } +#@ } +#@ +#@ # ::tcl::Pkg::Create -- +#@ # +#@ # Given a package specification generate a "package ifneeded" statement +#@ # for the package, suitable for inclusion in a pkgIndex.tcl file. +#@ # +#@ # Arguments: +#@ # args arguments used by the Create function: +#@ # -name packageName +#@ # -version packageVersion +#@ # -load {filename ?{procs}?} +#@ # ... +#@ # -source {filename ?{procs}?} +#@ # ... +#@ # +#@ # Any number of -load and -source parameters may be +#@ # specified, so long as there is at least one -load or +#@ # -source parameter. If the procs component of a module +#@ # specifier is left off, that module will be set up for +#@ # direct loading; otherwise, it will be set up for lazy +#@ # loading. If both -source and -load are specified, the +#@ # -load'ed files will be loaded first, followed by the +#@ # -source'd files. +#@ # +#@ # Results: +#@ # An appropriate "package ifneeded" statement for the package. +#@ +#@ proc ::tcl::Pkg::Create {args} { +#@ append err(usage) "[lindex [info level 0] 0] " +#@ append err(usage) "-name packageName -version packageVersion" +#@ append err(usage) "?-load {filename ?{procs}?}? ... " +#@ append err(usage) "?-source {filename ?{procs}?}? ..." +#@ +#@ set err(wrongNumArgs) "wrong # args: should be \"$err(usage)\"" +#@ set err(valueMissing) "value for \"%s\" missing: should be \"$err(usage)\"" +#@ set err(unknownOpt) "unknown option \"%s\": should be \"$err(usage)\"" +#@ set err(noLoadOrSource) "at least one of -load and -source must be given" +#@ +#@ # process arguments +#@ set len [llength $args] +#@ if {$len < 6} { +#@ error $err(wrongNumArgs) +#@ } +#@ +#@ # Initialize parameters +#@ array set opts {-name {} -version {} -source {} -load {}} +#@ +#@ # process parameters +#@ for {set i 0} {$i < $len} {incr i} { +#@ set flag [lindex $args $i] +#@ incr i +#@ switch -glob -- $flag { +#@ "-name" - +#@ "-version" { +#@ if {$i >= $len} { +#@ error [format $err(valueMissing) $flag] +#@ } +#@ set opts($flag) [lindex $args $i] +#@ } +#@ "-source" - +#@ "-load" { +#@ if {$i >= $len} { +#@ error [format $err(valueMissing) $flag] +#@ } +#@ lappend opts($flag) [lindex $args $i] +#@ } +#@ default { +#@ error [format $err(unknownOpt) [lindex $args $i]] +#@ } +#@ } +#@ } +#@ +#@ # Validate the parameters +#@ if {![llength $opts(-name)]} { +#@ error [format $err(valueMissing) "-name"] +#@ } +#@ if {![llength $opts(-version)]} { +#@ error [format $err(valueMissing) "-version"] +#@ } +#@ +#@ if {!([llength $opts(-source)] || [llength $opts(-load)])} { +#@ error $err(noLoadOrSource) +#@ } +#@ +#@ # OK, now everything is good. Generate the package ifneeded statment. +#@ set cmdline "package ifneeded $opts(-name) $opts(-version) " +#@ +#@ set cmdList {} +#@ set lazyFileList {} +#@ +#@ # Handle -load and -source specs +#@ foreach key {load source} { +#@ foreach filespec $opts(-$key) { +#@ lassign $filespec filename proclist +#@ +#@ if { [llength $proclist] == 0 } { +#@ set cmd "\[list $key \[file join \$dir [list $filename]\]\]" +#@ lappend cmdList $cmd +#@ } else { +#@ lappend lazyFileList [list $filename $key $proclist] +#@ } +#@ } +#@ } +#@ +#@ if {[llength $lazyFileList]} { +#@ lappend cmdList "\[list tclPkgSetup \$dir $opts(-name) $opts(-version) [list $lazyFileList]\]" +#@ } +#@ append cmdline [join $cmdList "\\n"] +#@ return $cmdline +#@ } +#@ +#@ interp alias {} ::pkg::create {} ::tcl::Pkg::Create +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/package.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/pkgIndex.tcl + +#@ # Copyright (c) 2016 Synopsys, Inc. This Synopsys software and all +#@ # associated documentation are proprietary to Synopsys, Inc. and may +#@ # only be used pursuant to the terms and conditions of a written +#@ # license agreement with Synopsys, Inc. All other use, reproduction, +#@ # modification, or distribution of the Synopsys software or the +#@ # associated documentation is strictly prohibited. +#@ +#@ package ifneeded cae 1.0 [list source [file join $dir syn.tcl]] +#@ package ifneeded cae::utils 1.0 [list source [file join $dir utils utils.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/iwidgets4.1/pkgIndex.tcl + +#@ # Tcl package index file +#@ package ifneeded iwidgets 4.1 " +#@ package require itk 4 +#@ namespace eval ::iwidgets { +#@ namespace export * +#@ variable library [file dirname [info script]] +#@ variable version 4.1 +#@ } +#@ source [file join $dir colors.itcl] +#@ source [file join $dir roman.itcl] +#@ source [file join $dir buttonbox.itk] +#@ source [file join $dir calendar.itk] +#@ source [file join $dir canvasprintbox.itk] +#@ source [file join $dir shell.itk] +#@ source [file join $dir dialogshell.itk] +#@ source [file join $dir dialog.itk] +#@ source [file join $dir canvasprintdialog.itk] +#@ source [file join $dir labeledframe.itk] +#@ source [file join $dir checkbox.itk] +#@ source [file join $dir labeledwidget.itk] +#@ source [file join $dir entryfield.itk] +#@ source [file join $dir combobox.itk] +#@ source [file join $dir datefield.itk] +#@ source [file join $dir dateentry.itk] +#@ source [file join $dir disjointlistbox.itk] +#@ source [file join $dir extbutton.itk] +#@ source [file join $dir extfileselectionbox.itk] +#@ source [file join $dir extfileselectiondialog.itk] +#@ source [file join $dir feedback.itk] +#@ source [file join $dir fileselectionbox.itk] +#@ source [file join $dir fileselectiondialog.itk] +#@ source [file join $dir finddialog.itk] +#@ source [file join $dir scrolledwidget.itk] +#@ source [file join $dir hierarchy.itk] +#@ source [file join $dir hyperhelp.itk] +#@ source [file join $dir mainwindow.itk] +#@ source [file join $dir menubar.itk] +#@ source [file join $dir messagebox.itk] +#@ source [file join $dir messagedialog.itk] +#@ source [file join $dir notebook.itk] +#@ source [file join $dir optionmenu.itk] +#@ source [file join $dir panedwindow.itk] +#@ source [file join $dir pane.itk] +#@ source [file join $dir promptdialog.itk] +#@ source [file join $dir pushbutton.itk] +#@ source [file join $dir radiobox.itk] +#@ source [file join $dir regexpfield.itk] +#@ source [file join $dir scrolledcanvas.itk] +#@ source [file join $dir scrolledframe.itk] +#@ source [file join $dir scrolledtext.itk] +#@ source [file join $dir scrolledhtml.itk] +#@ source [file join $dir scrolledlistbox.itk] +#@ source [file join $dir selectionbox.itk] +#@ source [file join $dir selectiondialog.itk] +#@ source [file join $dir spindate.itk] +#@ source [file join $dir spinner.itk] +#@ source [file join $dir spinint.itk] +#@ source [file join $dir spintime.itk] +#@ source [file join $dir tabnotebook.itk] +#@ source [file join $dir tabset.itk] +#@ source [file join $dir timefield.itk] +#@ source [file join $dir timeentry.itk] +#@ source [file join $dir toolbar.itk] +#@ source [file join $dir watch.itk] +#@ package provide iwidgets 4.1 +#@ " +#@ +#@ package ifneeded Iwidgets 4.1 " +#@ package require iwidgets 4.1 +#@ package provide Iwidgets 4.1 +#@ " +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/iwidgets4.1/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsTclPro/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ package ifneeded snpsTclPro 1.0 [list source [file join $dir snpsTclPro.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsTclPro/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsTest/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ package ifneeded snpsTest 1.0 [list source [file join $dir snpsTest.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsTest/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsUtils/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ package ifneeded snpsUtils 1.0 [list source [file join $dir snpsUtils.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsUtils/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/pkgIndex.tcl + +#@ package ifneeded Itcl 3.4 {load {} Itcl} +#@ package ifneeded tbcload 1.7 {load {} tbcload} +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/reg/pkgIndex.tcl + +#@ if {([info commands ::tcl::pkgconfig] eq "") +#@ || ([info sharedlibextension] ne ".dll")} return +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/reg/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/dde/pkgIndex.tcl + +#@ if {([info commands ::tcl::pkgconfig] eq "") +#@ || ([info sharedlibextension] ne ".dll")} return +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/dde/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/platform/pkgIndex.tcl + +#@ package ifneeded platform 1.0.13 [list source [file join $dir platform.tcl]] +#@ package ifneeded platform::shell 1.1.4 [list source [file join $dir shell.tcl]] +#@ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/platform/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/tcltest/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ if {![package vsatisfies [package provide Tcl] 8.5]} {return} +#@ package ifneeded tcltest 2.3.8 [list source [file join $dir tcltest.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/tcltest/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/http/pkgIndex.tcl + +#@ if {![package vsatisfies [package provide Tcl] 8.6]} {return} +#@ package ifneeded http 2.8.8 [list tclPkgSetup $dir http 2.8.8 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister ::http::mapReply}}}] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/http/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/msgcat/pkgIndex.tcl + +#@ if {![package vsatisfies [package provide Tcl] 8.5]} {return} +#@ package ifneeded msgcat 1.5.2 [list source [file join $dir msgcat.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/msgcat/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/http1.0/pkgIndex.tcl + +#@ # Tcl package index file, version 1.0 +#@ # This file is generated by the "pkg_mkIndex" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ package ifneeded http 1.0 [list tclPkgSetup $dir http 1.0 {{http.tcl source {httpCopyDone httpCopyStart httpEof httpEvent httpFinish httpMapReply httpProxyRequired http_code http_config http_data http_formatQuery http_get http_reset http_size http_status http_wait}}}] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/http1.0/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/opt/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ if {![package vsatisfies [package provide Tcl] 8.2]} {return} +#@ package ifneeded opt 0.4.6 [list source [file join $dir optparse.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/opt/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/syn.tcl + +#@ # Copyright (c) 2016 Synopsys, Inc. This Synopsys software and all +#@ # associated documentation are proprietary to Synopsys, Inc. and may +#@ # only be used pursuant to the terms and conditions of a written +#@ # license agreement with Synopsys, Inc. All other use, reproduction, +#@ # modification, or distribution of the Synopsys software or the +#@ # associated documentation is strictly prohibited. +#@ +#@ # primary file of syn package +#@ +#@ # require all the sub-packages (if any) +#@ +#@ # name of the provided package +#@ +#@ package provide cae 1.0 +#@ +#@ # create command group after loading sub packages +#@ # because last group is listed first by "help" +#@ +#@ create_command_group "syn" -info "synthesis utilities" +#@ +#@ namespace eval ::cae { +#@ variable selfdir [file dirname [info script]] +#@ variable scripts [list auto_path_groups.tcl ] +#@ variable script +#@ } +#@ +#@ # source encrypted version if available +#@ # encrypted commands must use "define_proc_attributes -hide_body" +#@ +#@ foreach ::cae::script ${::cae::scripts} { +#@ if { [file exists ${::cae::selfdir}/${::cae::script}.e] } { +#@ source ${::cae::selfdir}/${::cae::script}.e +#@ } else { +#@ source ${::cae::selfdir}/${::cae::script} +#@ } +#@ } +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/auto_path_groups.tcl + +#@ # Copyright (c) 2016-2017 Synopsys, Inc. This Synopsys software and all +#@ # associated documentation are proprietary to Synopsys, Inc. and may +#@ # only be used pursuant to the terms and conditions of a written +#@ # license agreement with Synopsys, Inc. All other use, reproduction, +#@ # modification, or distribution of the Synopsys software or the +#@ # associated documentation is strictly prohibited. +#@ +#@ package require cae::utils +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/utils/utils.tcl + +#@ # Copyright (c) 2016 Synopsys, Inc. This Synopsys software and all +#@ # associated documentation are proprietary to Synopsys, Inc. and may +#@ # only be used pursuant to the terms and conditions of a written +#@ # license agreement with Synopsys, Inc. All other use, reproduction, +#@ # modification, or distribution of the Synopsys software or the +#@ # associated documentation is strictly prohibited. +#@ +#@ # primary file of cae::utils package +#@ +#@ # name of the provided package +#@ +#@ package provide cae::utils 1.0 +#@ +#@ namespace eval ::cae::utils { +#@ } +#@ +#@ proc ::cae::utils::msg { type s } { +#@ switch -glob -- ${type} { +#@ i* { return "INFO: ${s}" } +#@ w* { return "WARNING: ${s}" } +#@ e* { return "ERROR: ${s}" } +#@ } +#@ return +#@ } +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/utils/utils.tcl + +#@ +#@ namespace eval ::cae { +#@ +#@ # note: check if these are all necessary +#@ variable auto_path_groups_messages {ATTR-3 OPT-806 OPT-774 UID-101 TIM-134 TIM-99 OPT-806 MWUI-203 MW-212 TIM-112} +#@ +#@ # default prefix for path groups +#@ variable auto_path_groups_prefix synopsys_pg_ +#@ # default slack for path groups +#@ variable auto_path_groups_slack 0.0 +#@ # default max for path groups +#@ variable auto_path_groups_max 0 +#@ # default verbosity +#@ variable auto_path_groups_verbose false +#@ # default priority +#@ variable auto_path_groups_priority 1 +#@ # default min_regs_per_hierarchy +#@ variable auto_path_groups_min_regs_per_hierarchy 10 +#@ # registers path group suffix +#@ variable auto_path_groups_reg_suffix to_regs_ +#@ # macro path group suffix +#@ variable auto_path_groups_to_macro_suffix to_macros_ +#@ # macro path group suffix +#@ variable auto_path_groups_from_macro_suffix from_macros_ +#@ # ICG path group suffix +#@ variable auto_path_groups_icg_suffix to_ICGs +#@ # input path group suffix +#@ variable auto_path_groups_input_suffix inputs +#@ # output path group suffix +#@ variable auto_path_groups_output_suffix outputs +#@ # feedthrough path group suffix +#@ variable auto_path_groups_feedthrough_suffix feedthrough +#@ # user path groups +#@ variable auto_path_groups_user_path_groups_file auto_path_groups.user_path_groups.tcl +#@ } +#@ +#@ proc create_auto_path_groups { args } { +#@ variable ::cae::auto_path_groups_messages +#@ variable ::cae::auto_path_groups_prefix +#@ variable ::cae::auto_path_groups_slack +#@ variable ::cae::auto_path_groups_max +#@ variable ::cae::auto_path_groups_verbose +#@ variable ::cae::auto_path_groups_priority +#@ variable ::cae::auto_path_groups_min_regs_per_hierarchy +#@ variable ::cae::auto_path_groups_reg_suffix +#@ variable ::cae::auto_path_groups_to_macro_suffix +#@ variable ::cae::auto_path_groups_from_macro_suffix +#@ variable ::cae::auto_path_groups_icg_suffix +#@ variable ::cae::auto_path_groups_input_suffix +#@ variable ::cae::auto_path_groups_output_suffix +#@ variable ::cae::auto_path_groups_feedthrough_suffix +#@ variable ::cae::auto_path_groups_user_path_groups_file +#@ +#@ set options(-slack) ${auto_path_groups_slack} +#@ set options(-max) ${auto_path_groups_max} +#@ set options(-prefix) ${auto_path_groups_prefix} +#@ set options(-verbose) ${auto_path_groups_verbose} +#@ set options(-priority) ${auto_path_groups_priority} +#@ set options(-min_regs_per_hierarchy) ${auto_path_groups_min_regs_per_hierarchy} +#@ set options(-exclude) [list] +#@ set options(-user_path_groups_file) ${auto_path_groups_user_path_groups_file} +#@ +#@ parse_proc_arguments -args ${args} options +#@ +#@ if { [info exists options(-file)] } { +#@ if { [catch {open $options(-file) w} fileId] } { +#@ return -code error [::cae::utils::msg e ${fileId}] +#@ } +#@ } +#@ +#@ # save user path groups +#@ if { ![info exists options(-skip)] } { +#@ echo [::cae::utils::msg i "Saving user path groups to $options(-user_path_groups_file)..."] +#@ if { [file exist $options(-user_path_groups_file)] } { +#@ echo [::cae::utils::msg w "File $options(-user_path_groups_file) already exists and will be overwritten..."] +#@ } +#@ if { [catch {open "| grep \"^group_path\" > $options(-user_path_groups_file)" w} channelId] } { +#@ return -code error [::cae::utils::msg e ${channelId}] +#@ } +#@ redirect -channel ${channelId} { write_script -nosplit } +#@ set r [catch {close ${channelId}} msg] +#@ switch ${r} { +#@ 0 { echo [::cae::utils::msg i "User path groups saved"] } +#@ 1 { echo [::cae::utils::msg i "No user path groups to save"] } +#@ default { return -code error [::cae::utils::msg e ${msg}] } +#@ } +#@ } +#@ +#@ set total 0 +#@ +#@ suppress_message ${auto_path_groups_messages} +#@ switch -- $options(-mode) { +#@ "rtl" { +#@ # create one path group per hierarchy +#@ +#@ echo [::cae::utils::msg i "Collecting hierarchies without optimize_registers..."] +#@ set optimize_registers_cells [get_cells -hier -filter {is_hierarchical==true && optimize_registers==true}] +#@ if { $options(-verbose) } { +#@ set optimize_registers_cells_names [lsort [get_object_name ${optimize_registers_cells}]] +#@ echo [::cae::utils::msg i "cells with optimize_registers: ${optimize_registers_cells_names}"] +#@ } +#@ set optimize_registers_sub_cells {} +#@ foreach_in_collection cell ${optimize_registers_cells} { +#@ redirect -file /dev/null {current_instance ${cell}} +#@ append_to_collection optimize_registers_sub_cells [get_cells -hier -filter {is_hierarchical==true && (optimize_registers==false || undefined(optimize_registers))}] +#@ } +#@ redirect -file /dev/null {current_instance} +#@ if { $options(-verbose) } { +#@ set optimize_registers_sub_cells_names [lsort [get_object_name ${optimize_registers_sub_cells}]] +#@ echo [::cae::utils::msg i "sub-cells of cells with optimize_registers: ${optimize_registers_sub_cells_names}"] +#@ } +#@ set path_group_cells [get_cells -hier -filter {is_hierarchical==true && is_sequential==true && (optimize_registers==false || undefined(optimize_registers))}] +#@ set path_group_cells [remove_from_collection ${path_group_cells} ${optimize_registers_sub_cells}] +#@ +#@ echo [::cae::utils::msg i "Collected [sizeof_collection ${path_group_cells}] hierarchies without optimize_registers"] +#@ +#@ set path_group_names [lsort [get_object_name ${path_group_cells}]] +#@ +#@ if { $options(-verbose) } { +#@ echo [::cae::utils::msg i "cells for which path groups will be created:"] +#@ foreach path_group_name ${path_group_names} { +#@ echo [::cae::utils::msg i " ${path_group_name}"] +#@ } +#@ } +#@ +#@ echo [::cae::utils::msg i "Creating path groups for hierarchies without optimize_registers..."] +#@ set counter 0 +#@ foreach path_group_name ${path_group_names} { +#@ set number_of_registers [sizeof_collection [get_cells ${path_group_name}/* -filter "is_hierarchical==false && is_sequential==true"]] +#@ if { ${number_of_registers} > $options(-min_regs_per_hierarchy) } { +#@ echo [::cae::utils::msg i "Number of sequential cells found in ${path_group_name} hierarchy: ${number_of_registers}"] +#@ set command "group_path -name $options(-prefix)${auto_path_groups_reg_suffix}${counter} -to \[get_cells ${path_group_name}/* -filter \"is_hierarchical==false && is_sequential==true\"\] -priority $options(-priority)" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ } else { +#@ echo [::cae::utils::msg i "Not enough sequential cells found in ${path_group_name} hierarchy (${number_of_registers}), skipping..."] +#@ } +#@ } +#@ echo [::cae::utils::msg i "Number of reg path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ } +#@ "mapped" { +#@ # create one path group per hierarchy not meeting timing +#@ +#@ array unset fail +#@ echo [::cae::utils::msg i "Collecting hierarchies with timing violations..."] +#@ foreach_in_collection pin [all_registers -data_pins] { +#@ set slack [get_attribute ${pin} max_slack] +#@ if { ${slack} < $options(-slack) && ${slack} != "" } { +#@ set cell [get_cells -of_objects ${pin}] +#@ set full_name [get_attribute ${cell} full_name] +#@ set name [get_attribute ${cell} name] +#@ if {[string length ${full_name}] > [string length ${name}]} { +#@ set length [expr [string length ${full_name}] - [string length ${name}] - 1] +#@ set hierarchy [string range ${full_name} 0 [expr ${length} - 1]] +#@ } else { +#@ set hierarchy "" +#@ } +#@ if { ![info exists fail(${hierarchy})] || +#@ ([info exists fail(${hierarchy})] && ${slack} < $fail(${hierarchy})) } { +#@ set fail(${hierarchy}) ${slack} +#@ } +#@ } +#@ } +#@ echo [::cae::utils::msg i "Collected [array size fail] hierarchies with timing violations"] +#@ +#@ if { $options(-max) > 0 } { +#@ echo [::cae::utils::msg i "Keeping only $options(-max) hierarchies with worst timing violations"] +#@ set hierarchy_slack_list [lsort -stride 2 -index 1 -real -increasing [array get fail]] +#@ set hierarchy_slack_list [lrange ${hierarchy_slack_list} 0 [expr {2 * $options(-max) - 1}]] +#@ array unset fail +#@ array set fail ${hierarchy_slack_list} +#@ } +#@ +#@ set path_group_names [lsort [array names fail]] +#@ +#@ if { $options(-verbose) } { +#@ echo [::cae::utils::msg i "hierarchies for which path groups will be created:"] +#@ foreach path_group_name ${path_group_names} { +#@ echo [::cae::utils::msg i " ${path_group_name} $fail(${path_group_name})"] +#@ } +#@ } +#@ +#@ echo [::cae::utils::msg i "Creating path groups for hierarchies with timing violations..."] +#@ set counter 0 +#@ foreach path_group_name ${path_group_names} { +#@ if { ${path_group_name} == "" } { +#@ set command "group_path -name $options(-prefix)${auto_path_groups_reg_suffix}${counter} -to \[get_cells * -filter {is_hierarchical==false && is_sequential==true}\] -priority $options(-priority)" +#@ } else { +#@ set command "group_path -name $options(-prefix)${auto_path_groups_reg_suffix}${counter} -to \[get_cells ${path_group_name}/* -filter {is_hierarchical==false && is_sequential==true}\] -priority $options(-priority)" +#@ } +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ } +#@ echo [::cae::utils::msg i "Number of reg path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ +#@ } +#@ +#@ } +#@ +#@ # macro path groups +#@ if { [lsearch $options(-exclude) macro] == -1} { +#@ echo [::cae::utils::msg i "Creating macro path groups..."] +#@ if { [shell_is_in_topographical_mode] } { +#@ #set macro_cells [all_macro_cells] +#@ set macro_cells [remove_from_collection [all_macro_cells] [get_cells -quiet -hier -all -filter "is_physical_only==true"]] +#@ } else { +#@ set macro_cells [get_cells -hier * -filter "is_macro_cell == true"] +#@ } +#@ if { [sizeof_collection ${macro_cells}] != 0 } { +#@ set path_group_names [get_object_name ${macro_cells}] +#@ set counter 0 +#@ foreach path_group_name ${path_group_names} { +#@ set command "group_path -name $options(-prefix)${auto_path_groups_to_macro_suffix}${counter} -to \[get_cells ${path_group_name}\] -priority $options(-priority)" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ set command "group_path -name $options(-prefix)${auto_path_groups_from_macro_suffix}${counter} -from \[get_cells ${path_group_name}\] -priority $options(-priority)" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ } +#@ echo [::cae::utils::msg i "Number of macro path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ } else { +#@ echo [::cae::utils::msg i "No macro found, skipping..."] +#@ } +#@ } +#@ +#@ # ICG path groups +#@ if { [lsearch $options(-exclude) ICG] == -1} { +#@ echo [::cae::utils::msg i "Creating ICG path groups..."] +#@ set all_icg_cells [get_cells -hier -filter "full_name=~*latch || full_name=~*u_clkgate && defined(clock_gating_integrated_cell)"] +#@ if { [sizeof_collection ${all_icg_cells}] } { +#@ set counter 0 +#@ set command "group_path -name $options(-prefix)${auto_path_groups_icg_suffix} -to \[get_cells -hier -filter \"full_name=~*latch || full_name=~*u_clkgate && defined(clock_gating_integrated_cell)\"\] -priority $options(-priority)" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ echo [::cae::utils::msg i "Number of ICG path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ } else { +#@ echo [::cae::utils::msg i "No ICG found, skipping..."] +#@ } +#@ } +#@ +#@ # IO path groups +#@ if { [lsearch $options(-exclude) IO] == -1} { +#@ echo [::cae::utils::msg i "Creating IO path groups..."] +#@ set counter 0 +#@ set command "group_path -name $options(-prefix)${auto_path_groups_input_suffix} -from \[ remove_from_collection \[all_inputs\] \[get_ports \[get_attribute \[get_clocks -filter defined(sources)\] sources\]\] \]" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ set command "group_path -name $options(-prefix)${auto_path_groups_output_suffix} -to \[all_outputs\]" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ set command "group_path -name $options(-prefix)${auto_path_groups_feedthrough_suffix} -from \[ remove_from_collection \[all_inputs\] \[get_ports \[get_attribute \[get_clocks -filter defined(sources)\] sources\]\] \] -to \[all_outputs\]" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ echo [::cae::utils::msg i "Number of IO path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ } +#@ +#@ unsuppress_message ${auto_path_groups_messages} +#@ +#@ echo [::cae::utils::msg i "Total number of path groups created: ${total}"] +#@ +#@ if { [info exists options(-file)] } { +#@ close ${fileId} +#@ } +#@ +#@ return +#@ } +#@ +#@ define_proc_attributes create_auto_path_groups -command_group syn -dont_abbrev -hide_body -info "Creates path groups for current design" -define_args { +#@ { -mode "creates path groups for unmapped/mapped netlist" mode one_of_string {required value_help {values {rtl mapped}}} } +#@ { -exclude "excludes specific path groups (IO ICG macro) (default: empty list)" list list {optional} } +#@ { -slack "slack value used to select hierarchy violating timing (default: 0.0) - mapped mode only" slack float optional } +#@ { -max "maximum number of paths groups (default: 0=unlimited) - mapped mode only" max int optional } +#@ { -min_regs_per_hierarchy "minimum number of registers per hierarchy (default: 10) - rtl mode only" min_regs int optional } +#@ { -prefix "path group name prefix (default: synopsys_pg_)" prefix string optional } +#@ { -file "file name to dump group_path commands" file_name string optional } +#@ { -verbose "verbose mode" "" boolean optional } +#@ { -user_path_groups_file "save user path groups to this file" file_name string optional } +#@ { -skip "do not save user path groups" "" boolean optional } +#@ } +#@ +#@ proc remove_auto_path_groups { args } { +#@ variable ::cae::auto_path_groups_messages +#@ variable ::cae::auto_path_groups_prefix +#@ variable ::cae::auto_path_groups_verbose +#@ variable ::cae::auto_path_groups_user_path_groups_file +#@ +#@ set options(-prefix) ${auto_path_groups_prefix} +#@ set options(-verbose) ${auto_path_groups_verbose} +#@ set options(-user_path_groups_file) ${auto_path_groups_user_path_groups_file} +#@ +#@ parse_proc_arguments -args ${args} options +#@ +#@ if { [info exists options(-file)] } { +#@ if {[catch {open $options(-file) w } fileId] } { +#@ return -code error [::cae::utils::msg e ${fileId}] +#@ } +#@ } +#@ +#@ suppress_message ${auto_path_groups_messages} +#@ set path_group_names [get_object_name [get_path_group -filter "full_name =~ $options(-prefix)*"]] +#@ foreach path_group_name ${path_group_names} { +#@ set command "remove_path_group ${path_group_name}" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ } +#@ echo [::cae::utils::msg i "Number of path groups removed: [llength ${path_group_names}]"] +#@ unsuppress_message ${auto_path_groups_messages} +#@ +#@ if { [info exists options(-file)] } { +#@ close ${fileId} +#@ } +#@ +#@ # restore user path groups +#@ if { ![info exists options(-skip)] } { +#@ echo [::cae::utils::msg i "Restoring user path groups from $options(-user_path_groups_file)..."] +#@ if { [file exist $options(-user_path_groups_file)] } { +#@ if { [file size $options(-user_path_groups_file)] != 0} { +#@ source -continue_on_error $options(-user_path_groups_file) +#@ } else { +#@ echo [::cae::utils::msg i "No user path groups to restore"] +#@ } +#@ file delete -force $options(-user_path_groups_file) +#@ } else { +#@ echo [::cae::utils::msg w "File $options(-user_path_groups_file) doesn't exist"] +#@ } +#@ } +#@ +#@ return +#@ } +#@ +#@ define_proc_attributes remove_auto_path_groups -command_group syn -dont_abbrev -hide_body -info "Removes path groups for current design" -define_args { +#@ { -prefix "path group name prefix (default: synopsys_pg)" prefix string optional } +#@ { -file "file name to dump group_path commands" file_name string optional } +#@ { -verbose "verbose mode" "" boolean optional } +#@ { -user_path_groups_file "restore user path groups from this file" file_name string optional } +#@ { -skip "do not restore user path groups" "" boolean optional } +#@ } +#@ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/auto_path_groups.tcl + +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/syn.tcl + +#@ +#@ if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ set sh_enable_line_editing "true" +#@ set sh_line_editing_mode "emacs" +#@ } +#@ +#@ if {$synopsys_program_name == "icc_shell"} { +#@ if {"$sh_output_log_file" == ""} { +#@ set sh_output_log_file "icc_output.txt" +#@ } +#@ +#@ ## the variable sh_redirect_progress_messages only makes it possible +#@ ## for some commands to redirect progress messages to the log file,thereby +#@ ## bypassing the console and reducing the volume of messages on the console. +#@ set sh_redirect_progress_messages true +#@ } +#@ +#@ +#@ # Suppress new variable messages for the following variables +#@ array set auto_index {} +#@ set auto_oldpath "" +#@ +#@ # Enable customer support banner on fatal +#@ if { $sh_arch == "linux" || $sh_arch == "amd64" || $sh_arch == "linux64" || $sh_arch == "suse32" || $sh_arch == "suse64" || $sh_arch == "sparcOS5" || $sh_arch == "sparc64" || $sh_arch == "x86sol32" || $sh_arch == "x86sol64" || $sh_arch == "rs6000" || $sh_arch == "aix64" } { +#@ setenv SYNOPSYS_TRACE "" +#@ } +#@ +#@ # +#@ # Load the procedures which make up part of the user interface. +#@ # +#@ if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ source $synopsys_root/auxx/syn/.dc_common_procs.tcl +#@ if {$synopsys_program_name != "dc_sms_shell"} { +#@ source $synopsys_root/auxx/syn/.dc_procs.tcl +#@ } +#@ alias list_commands help +#@ } +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/.dc_common_procs.tcl + +#@ ############################################################################## +#@ # +#@ # +#@ # FILE: auxx/syn/.dc_common_procs.tcl +#@ # +#@ # ABSTRACT: These procedures are part of the PrimeTime and DC +#@ # user interface. +#@ # They are loaded by .synopsys_pt.setup and .synopsys_dc.setup. +#@ # +#@ ############################################################################## +#@ # +#@ # +#@ +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: group_variable +#@ # +#@ # ABSTRACT: Add a variable to the specified variable group. +#@ # This command is typically used by the system +#@ # administrator only. +#@ # +#@ # Below the proc is the command which creates the command +#@ # help information and semantic data for the argument. +#@ # +#@ # RETURNS: 1 if it is successful. +#@ # error code if the variable does not exist. +#@ # error code of the variable is already in the group. +#@ # +#@ # SYNTAX: group_variable group_name variable_name +#@ # +#@ ############################################################################## +#@ # +#@ +#@ +#@ proc group_variable { args } { +#@ global _Variable_Groups +#@ +#@ parse_proc_arguments -args $args resarr +#@ set group $resarr(group) +#@ set var $resarr(variable_name) +#@ +#@ if { ![info exists _Variable_Groups($group)] } { +#@ set _Variable_Groups($group) "" +#@ } +#@ +#@ # Verify that var exists as a global variable +#@ +#@ set cmd "uplevel #0 \{info exists $var\}" +#@ if { ![eval $cmd] } { +#@ return -code error "Variable '$var' is not defined." +#@ } +#@ +#@ # Only add it if it's not already there +#@ +#@ if { [lsearch $_Variable_Groups($group) $var] == -1 } { +#@ lappend _Variable_Groups($group) $var +#@ } +#@ +#@ return 1 +#@ } +#@ +#@ define_proc_attributes group_variable -info "Add a variable to a variable group" -command_group "Builtins" -permanent -dont_abbrev -define_args { +#@ {group "Variable group name" group} +#@ {variable_name "Variable name" variable_name}} +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: print_variable_group +#@ # +#@ # ABSTRACT: Shows variables and their values defined in the given group. +#@ +#@ # +#@ # Below the proc is the command which creates the command +#@ # help information and semantic data for the argument. +#@ # +#@ # RETURNS: 1 if it is successful. +#@ # error code of the variable group does not exist. +#@ # +#@ # SYNTAX: print_variable_group group_name +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc print_variable_group { args } { +#@ global _Variable_Groups +#@ +#@ parse_proc_arguments -args $args resarr +#@ set group $resarr(group) +#@ +#@ if { [string compare $group "all"] == 0 } { +#@ set cmd "uplevel #0 \{printvar\}" +#@ return [eval $cmd] +#@ } +#@ +#@ if { ![info exists _Variable_Groups($group)] } { +#@ return -code error "Variable group '$group' does not exist." +#@ } +#@ +#@ # Print out each global variable in the list. To be totally bulletproof, +#@ # test that each variable in the group is still defined. If not, remove +#@ # it from the list. +#@ +#@ foreach var [lsort $_Variable_Groups($group)] { +#@ set cmd "uplevel #0 \{info exists $var\}" +#@ if { ![eval $cmd] } { +#@ # Remove it +#@ set n [lsearch $_Variable_Groups($group) $var] +#@ set $_Variable_Groups($group) [lreplace $_Variable_Groups($group) $n $n] +#@ } else { +#@ # Print it. +#@ set cmd "uplevel #0 \{set $var\}" +#@ set val [eval $cmd] +#@ echo [format "%-25s = \"%s\"" $var $val] +#@ } +#@ } +#@ +#@ return 1 +#@ } +#@ +#@ define_proc_attributes print_variable_group -info "Print the contents of a variable group" -command_group "Builtins" -permanent -define_args {{group "Variable group name" group}} +#@ +#@ +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: _Variable_Groups_Get_Groups +#@ # +#@ # ABSTRACT: Return a list of all variable groups. This command is hidden +#@ # and is used by Design Vision. +#@ # +#@ # RETURNS: Tcl list of all variable groups including group all +#@ # +#@ # SYNTAX: _Variable_Groups_Get_Groups +#@ ############################################################################## +#@ # +#@ +#@ proc _Variable_Groups_Get_Groups { } { +#@ global _Variable_Groups +#@ +#@ set groups [array names _Variable_Groups] +#@ append groups " all" +#@ return $groups +#@ } +#@ define_proc_attributes _Variable_Groups_Get_Groups -hidden +#@ +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: _Variable_Groups_Get_Variables_Of_Group +#@ # +#@ # ABSTRACT: Return a list of all variables of a variable group. +#@ # It also works for pseudo group all. +#@ # +#@ # RETURNS: Tcl list of all variables of a variable group including +#@ # pseudo group all +#@ # +#@ # SYNTAX: _Variable_Groups_Get_Groups +#@ ############################################################################## +#@ # +#@ +#@ proc _Variable_Groups_Get_Variables_Of_Group { group } { +#@ global _Variable_Groups +#@ +#@ if { [string compare $group "all"] == 0 } { +#@ set itr [array startsearch _Variable_Groups] +#@ for { } { [array anymore _Variable_Groups $itr]} { } { +#@ set index [array nextelement _Variable_Groups $itr] +#@ append vars $_Variable_Groups($index) +#@ } +#@ array donesearch _Variable_Groups $itr +#@ return $vars +#@ } +#@ +#@ if { ![info exists _Variable_Groups($group)] } { +#@ return -code error "Variable group '$group' does not exist." +#@ } +#@ +#@ # Test if all variables in the list of variables are still defined. +#@ # Remove not existing variables. +#@ foreach var [lsort $_Variable_Groups($group)] { +#@ set cmd "uplevel #0 \{info exists $var\}" +#@ if { ![eval $cmd] } { +#@ # Remove it +#@ set n [lsearch $_Variable_Groups($group) $var] +#@ set $_Variable_Groups($group) [lreplace $_Variable_Groups($group) $n $n] +#@ } +#@ } +#@ return $_Variable_Groups($group) +#@ } +#@ define_proc_attributes _Variable_Groups_Get_Variables_Of_Group -hidden +#@ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/.dc_common_procs.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/.dc_procs.tcl + +#@ ############################################################################## +#@ # +#@ # +#@ # FILE: auxx/syn/.dc_procs.tcl +#@ # +#@ # ABSTRACT: These procedures are part of the Design Compiler Tcl +#@ # user interface. +#@ # They are loaded by .synopsys_dc.setup. +#@ # +#@ ############################################################################## +#@ # +#@ # +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_verilog +#@ # +#@ # ABSTRACT: Emulate PT's read_verilog command in DC: +#@ # +#@ # Usage: read_verilog # Read one or more verilog files +#@ # *[-hdl_compiler] (Use HDL Compiler (ignored)) +#@ # file_names (Files to read) +#@ # +#@ # Modified: Bharat 11/17/99. Use uplevel to ensure that the command +#@ # sees user/hidden variables from the top level. Star 92970. +#@ # +#@ # Modified: Evan Rosser, 12/5/01. Support -netlist and -rtl flags. +#@ # +#@ ############################################################################## +#@ # +#@ +#@ if { $synopsys_program_name != "icc_shell" } { +#@ proc read_verilog { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format verilog %s %s [list %s]} [array names ra -rtl] [array names ra -netlist] $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_verilog -info " Read one or more verilog files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-netlist "Use structural Verilog netlist reader" "" boolean optional} +#@ {-rtl "Use RTL Verilog compiler (Presto or HDLC)" "" boolean optional} +#@ {-hdl_compiler "Use HDL Compiler (ignored)" "" boolean {hidden optional}} +#@ } +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_sverilog +#@ # +#@ # ABSTRACT: Emulate PT's read_sverilog command in DC: +#@ # +#@ # Usage: read_sverilog # Read one or more systemverilog files +#@ # *[-hdl_compiler] (Use HDL Compiler (ignored)) +#@ # file_names (Files to read) +#@ # +#@ # Modified: Yong Xiao, 01/31/2003: Copied from read_verilog to support +#@ # systemverilog input. +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc read_sverilog { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format sverilog %s %s [list %s]} [array names ra -rtl] [array names ra -netlist] $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_sverilog -info " Read one or more systemverilog files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-netlist "Use structural Verilog netlist reader" "" boolean optional} +#@ {-rtl "Use RTL Systemverilog compiler (Presto or HDLC)" "" boolean optional} +#@ {-hdl_compiler "Use HDL Compiler (ignored)" "" boolean {hidden optional}} +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_vhdl +#@ # +#@ # ABSTRACT: Emulate PT's read_vhdl command in DC: +#@ # +#@ # Usage: read_vhdl # Read one or more vhdl files +#@ # file_names (Files to read) +#@ # +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc read_vhdl { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format vhdl %s [list %s]} [array names ra -netlist] $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_vhdl -info " Read one or more vhdl files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-netlist "Use structural VHDL netlist reader" "" boolean optional} +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_db +#@ # +#@ # ABSTRACT: Emulate PT's read_db command in DC: +#@ # +#@ # Usage: +#@ # read_db # Read one or more db files +#@ # *[-netlist_only] (Do not read any attributes from db (ignored)) +#@ # *[-library] (File is a library DB (ignored)) +#@ # file_names (Files to read) +#@ # +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc read_db { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format db [list %s]} $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_db -info " Read one or more db files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-netlist_only "Do not read any attributes from db (ignored)" "" boolean {hidden optional}} +#@ {-library "File is a library DB (ignored)" "" boolean {hidden optional}} +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_edif +#@ # +#@ # ABSTRACT: Emulate PT's read_edif command in DC: +#@ # +#@ # Usage: +#@ # read_edif # Read one or more edif files +#@ # *[-complete_language] (Use ptxr to read the file (ignored)) +#@ # file_names (Files to read) +#@ # +#@ # +#@ ############################################################################## +#@ # +#@ proc read_edif { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format edif [list %s]} $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_edif -info " Read one or more edif files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-complete_language "Use ptxr to read the file (ignored)" "" boolean {hidden optional}} +#@ } +#@ +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_ddc +#@ # +#@ # ABSTRACT: Shorthand for "read_file -format ddc": +#@ # +#@ # Usage: +#@ # read_ddc # Read one or more ddc files +#@ # *[-scenarios] only read constraints for specified scenarios +#@ # *[-active_scenarios] only activate the specified scenarios +#@ # file_names (Files to read) +#@ # +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc read_ddc { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "read_file -format ddc" +#@ if { [ info exists ra(-scenarios) ] } { +#@ set cmd "$cmd -scenarios { $ra(-scenarios) }" +#@ } +#@ if { [ info exists ra(-active_scenarios) ] } { +#@ set cmd "$cmd -active_scenarios { $ra(-active_scenarios) }" +#@ } +#@ set cmd "$cmd { $ra(file_names) }" +#@ return [uplevel \#0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_ddc -info "Read one or more ddc files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-scenarios "list of scenarios to be read from ddc file" +#@ scenario_list list optional} +#@ {-active_scenarios "list of scenarios to be made active" +#@ active_scenario_list list optional}} +#@ +#@ +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: source_tcl_file +#@ # +#@ # ABSTRACT: generic procedure to source another tcl file +#@ # +#@ # Arguments: +#@ # filename tcl filename +#@ # dir directory to check for file +#@ # msg verbose message +#@ # verbose verbose mode +#@ # +#@ # Usage: +#@ # +#@ ############################################################################## +#@ # +#@ proc source_tcl_file { filename dir msg {verbose 1} } { +#@ set __qual_pref_file [file join $dir $filename] +#@ if {[file exists $__qual_pref_file]} { +#@ if { $verbose } { +#@ echo $msg $__qual_pref_file +#@ } +#@ # use catch to recover from errors in the pref file +#@ echo_trace "Sourcing " $__qual_pref_file +#@ # to speed up sourcing use read and eval +#@ set f [open $__qual_pref_file] +#@ if {[catch {namespace eval :: [read -nonewline $f]} __msg]} { +#@ echo Error: Error during sourcing of $__qual_pref_file +#@ if {$__msg != ""} { echo $__msg } +#@ # actually, it looks like $__msg is always null after +#@ # source fails +#@ } +#@ close $f +#@ } else { +#@ echo_trace "Info: File '" $__qual_pref_file "' does not exist!" +#@ } +#@ } +#@ define_proc_attributes source_tcl_file -hidden +#@ +#@ +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: echo_trace +#@ # +#@ # ABSTRACT: echo only in trace modus +#@ # +#@ ############################################################################## +#@ # +#@ proc echo_trace { args } { +#@ if { [info exists ::env(TCL_TRACE)] } { +#@ echo TRACE\> [join $args "" ] +#@ } +#@ } +#@ define_proc_attributes echo_trace -hidden +#@ +#@ ############################################################################# +#@ # +#@ # Following procedures added for PC write_script +#@ # +#@ # +#@ # +#@ ############################################################################ +#@ +#@ proc set_cell_restriction { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {set_attribute %s -type integer restrictions %s } $ra(cell) $ra(value)] +#@ return [uplevel #0 $cmd] +#@ +#@ } +#@ define_proc_attributes set_cell_restriction -hidden -define_args { {cell "cell_name" cell string required} {value "value" value string required} } +#@ +#@ +#@ proc set_cell_soft_keepout {args} { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {set_keepout_margin -type soft -outer {%d %d %d %d} [list %s] } $ra(llx) $ra(lly) $ra(urx) $ra(ury) $ra(objects)] +#@ return [uplevel #0 $cmd] +#@ +#@ +#@ } +#@ +#@ define_proc_attributes set_cell_soft_keepout -hidden -define_args { {llx "llx" llx float required} {lly "lly" lly float required} {urx "urx" urx float required} {ury "ury" ury float required} {objects "objects" objects list required} } +#@ +#@ proc set_cell_hard_keepout {args} { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {set_keepout_margin -type soft -outer {%d %d %d %d} [list %s] } $ra(llx) $ra(lly) $ra(urx) $ra(ury) $ra(objects)] +#@ return [uplevel #0 $cmd] +#@ +#@ +#@ } +#@ +#@ define_proc_attributes set_cell_hard_keepout -hidden -define_args { {llx "llx" llx float required} {lly "lly" lly float required} {urx "urx" urx float required} {ury "ury" ury float required} {objects "objects" objects list required} } +#@ +#@ set mw_use_pdb_lib_format false +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: write_milkyway +#@ # +#@ # ABSTRACT: wrapper around save_mw_cel to support original write_milkyway +#@ # interface +#@ # if { [info commands open_mw_cel] == "open_mw_cel" } {} +#@ # +#@ ############################################################################## +#@ +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ +#@ proc write_milkyway args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {save_mw_cel -as %s %s %s %s %s} $ra(-output) [array names ra -overwrite] [array names ra -create] [array names ra -all] [array names ra -dps]] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes write_milkyway -hidden -info " Saves the design as milkyway CEL" -define_args {{-output fileName "Name" string {optional}} {-overwrite "Overwrite the current version" "" boolean {optional}} {-create "Create from scratch" "" boolean {hidden optional}} {-all "Save all modified cells" "" boolean {hidden optional}} {-dps "Save internal DPS design" "" boolean {hidden optional}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: read_milkyway +#@ # +#@ # ABSTRACT: wrapper around open_mw_cel to support original read_milkyway +#@ # interface +#@ # MODIFIED: To support DPS in Galileo we need to pass the filtering +#@ # parameters to the DPS command. (Pankaj Goswami, Mar09 2005) +#@ # +#@ ############################################################################## +#@ +#@ proc read_milkyway args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {open_mw_cel %s} $ra() ] +#@ +#@ if {[info exists ra(-library)]} { +#@ set cmd [concat [concat $cmd " -library " ] " $ra(-library) "] +#@ } +#@ +#@ if {[info exists ra(-read_only)]} { +#@ lappend cmd {-readonly} +#@ } +#@ +#@ # DPS specific stuff +#@ set dps_cmd "vh_set_current_partition " +#@ set read_mw_with_dps_filter false +#@ +#@ if {[info exists ra(-vh_module_only)]} { +#@ append dps_cmd "-vh_module_only " +#@ set read_mw_with_dps_filter true +#@ } +#@ +#@ if {[info exists ra(-vh_include)]} { +#@ append dps_cmd [concat " -vh_include " " \{ $ra(-vh_include) \}"] +#@ append dps_cmd " " +#@ set read_mw_with_dps_filter true +#@ } +#@ +#@ if {[info exists ra(-vh_exclude)]} { +#@ append dps_cmd [concat " -vh_exclude" " \{ $ra(-vh_exclude) \}"] +#@ set read_mw_with_dps_filter true +#@ } +#@ +#@ if { $read_mw_with_dps_filter == true } { +#@ # Call the DPS command to store the DPS filtering params. +#@ uplevel #0 $dps_cmd +#@ } else { +#@ # If there is no DPS filtering params, then we need to reset the +#@ # params which might have been stored from the provious command. +#@ append dps_cmd " -vh_reset_partition" +#@ uplevel #0 $dps_cmd +#@ } +#@ # End of DPS stuff +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_milkyway -hidden -info " Read milkyway CEL from disk" -define_args {{-library "library name" "lib_name" string {optional}} {-read_only "open design in read only mode" "" boolean {optional}} {-version "version number of the CEL" "number" string {optional}} {-vh_module_only "open design for DPS module only partition" "" boolean {hidden optional}} {-vh_include "list of designs to be included in the DPS partition" "include_designs" list {hidden optional}} {-vh_exclude "list of designs to be excluded in the DPS partition" "exclude_designs" list {hidden optional}} {"" fileName "CEL name" string {required}}} +#@ +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: set_mw_technology_file +#@ # +#@ # ABSTRACT: wrapper around update_mw_lib +#@ # +#@ # HISTORY : 2009/6/21, yunz, support ALF reader in ICC +#@ # +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] || +#@ ([string match -nocase {*d[ce]_shell*} $synopsys_program_name] && [shell_is_mwlib_enabled]) } { +#@ +#@ proc set_mw_technology_file args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ set lib_name "" +#@ set pdb_file "tech.pdb" +#@ set log_file "log_file" +#@ set alf_file "" +#@ +#@ if {[info exists ra(-technology)] && [info exists ra(-plib)]} { +#@ echo "Error: the $ra(-technology) and $ra(-plib) options are mutually exclusive." +#@ return [uplevel #0 $cmd] +#@ } elseif {[info exists ra(-technology)] && [info exists ra(-alf)]} { +#@ echo "Error: the $ra(-technology) and $ra(-alf) options are mutually exclusive." +#@ return [uplevel #0 $cmd] +#@ } elseif {[info exists ra(-plib)] && [info exists ra(-alf)]} { +#@ echo "Error: the $ra(-plib) and $ra(-alf) options are mutually exclusive." +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ if {[info exists ra(-technology)]} { +#@ +#@ set cmd [format {update_mw_lib -technology %s %s} $ra(-technology) $ra() ] +#@ } +#@ +#@ if {[info exists ra(-alf)]} { +#@ +#@ set cmd [format {update_mw_lib %s} $ra() ] +#@ +#@ set cmd [concat [concat $cmd " -alf " ] " $ra(-alf) "] +#@ } +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes set_mw_technology_file -hide_body -info " Set technology file for the library " -define_args {{-technology "Technology file name" "tech_file" string {optional}} {-alf "alf file name" "file_name" string {optional}} {"" "Library name" "libName" string {required}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: rebuild_mw_lib +#@ # +#@ # ABSTRACT: wrapper around update_mw_lib +#@ # +#@ ############################################################################## +#@ +#@ proc rebuild_mw_lib args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {update_mw_lib -rebuild %s} $ra() ] +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes rebuild_mw_lib -hide_body -info " Rebuild the library " -define_args {{"" "Library name" "libName" string {required}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: set_mw_lib_reference +#@ # +#@ # ABSTRACT: Procedure to set ref lib list or ref ctrl file +#@ # +#@ ############################################################################## +#@ +#@ proc set_mw_lib_reference args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ +#@ if {[info exists ra(-mw_reference_library)]} { +#@ set cmd [format {set_reference_control_file -reference_libraries {%s} %s} $ra(-mw_reference_library) $ra() ] +#@ } +#@ +#@ if {[info exists ra(-reference_control_file)]} { +#@ set cmd [format {set_reference_control_file -file %s %s} $ra(-reference_control_file) $ra() ] +#@ } +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes set_mw_lib_reference -hide_body -info " Set reference for the library " -define_args {{-mw_reference_library "List of reference libraries" "lib_list" list {optional}} {-reference_control_file "Reference control file" "file_name" string {optional}} {"" "Library name" "libName" string {required}}} +#@ +#@ # +#@ ############################################################################## +#@ # +#@ # PROCEDURE: create_mw_lib +#@ # +#@ # ABSTRACT: wrapper around MWUI create_mw_lib +#@ # +#@ ############################################################################## +#@ +#@ proc create_mw_lib args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ set lib_name "" +#@ set pdb_file "tech.pdb" +#@ set log_file "log_file" +#@ +#@ if {[info exists ra(-ignore_case)]} { +#@ set cmd [format {org_create_mw_lib %s} $ra() ] +#@ } else { +#@ set cmd [format {org_create_mw_lib -case_sensitive %s} $ra() ] +#@ } +#@ +#@ if {[info exists ra(-technology)]} { +#@ set cmd [concat [concat $cmd " -technology " ] " $ra(-technology) "] +#@ } +#@ +#@ if {[info exists ra(-ignore_tf_error)]} { +#@ set cmd [concat $cmd " -ignore_tf_error " ] +#@ } +#@ +#@ if {[info exists ra(-hier_separator)]} { +#@ set cmd [concat [concat $cmd " -hier_seperator " ] " $ra(-hier_separator) "] +#@ } +#@ +#@ if {[info exists ra(-bus_naming_style)]} { +#@ set cmd [concat [concat $cmd " -bus_naming_style " ] " {$ra(-bus_naming_style)} "] +#@ } +#@ +#@ +#@ if {[info exists ra(-reference_control_file)]} { +#@ set cmd [concat [concat $cmd " -reference_control_file " ] " $ra(-reference_control_file) "] +#@ } +#@ +#@ if {[info exists ra(-mw_reference_library)]} { +#@ set cmd [concat [concat [concat $cmd " -mw_reference_library {" ] " $ra(-mw_reference_library) "] "}"] +#@ } +#@ +#@ if { ![uplevel #0 $cmd] } { +#@ return 0 +#@ } +#@ +#@ set cmd "" +#@ +#@ if {[info exists ra(-open)]} { +#@ uplevel #0 $cmd +#@ set cmd [format {open_mw_lib %s} $ra() ] +#@ } +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes create_mw_lib -hide_body -info " Create a milkyway library " -define_args {{-technology "Technology file name" "file_name" string {optional}} {-ignore_tf_error "Ignore the error in technology file" "" boolean {hidden optional}} {-hier_separator "Hierarchical separator, default is backslash / " "separator" string {hidden optional}} {-bus_naming_style "Bus naming style" "bus_naming_style" string {optional}} {-ignore_case "Make case insensitive" "" boolean {hidden optional}} {-case_sensitive "Make case sensitive" "" boolean {hidden optional}} {-mw_reference_library "List of reference libraries" "lib_list" list {optional}} {-reference_control_file "Reference control file" "file_name" string {optional}} {-open "Open the library after creation" "" boolean {optional}} {"" "Library name to create" "libName" string {required}}} +#@ +#@ # +#@ ############################################################################## +#@ # +#@ # PROCEDURE: report_mw_lib +#@ # +#@ # ABSTRACT: wrapper around MWUI report_mw_lib +#@ # +#@ ############################################################################## +#@ +#@ proc report_mw_lib args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ +#@ if {[info exists ra(-mw_reference_library)]} { +#@ if {[info exists ra()]} { +#@ set cmd [format {org_report_mw_lib -mw_reference_library %s} $ra() ] +#@ } else { +#@ set cmd [format {org_report_mw_lib -mw_reference_library} ] +#@ } +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ if {[info exists ra(-unit_range)]} { +#@ if {[info exists ra()]} { +#@ set cmd [format {org_report_mw_lib -unit_range %s} $ra() ] +#@ } else { +#@ echo "Error : Library name must be specified when using this option" +#@ return 0; +#@ } +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ } +#@ +#@ define_proc_attributes report_mw_lib -hide_body -info " Report information about the library " -define_args {{-unit_range "Report unit range of library" "" boolean {optional}} {-mw_reference_library "Report list of reference libraries" "" boolean {optional}} {"" "Library to be reported" "libName" string {optional}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: close_mw_lib +#@ # +#@ # ABSTRACT: Wrapper around close_mw_lib to handle -save option properly +#@ # - save_mw_cel to save current cel with dc_netlist +#@ # - close_mw_cel to close current cel +#@ # - save_open_cels to save other open cels before closing library +#@ # +#@ ############################################################################## +#@ +#@ proc close_mw_lib args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ if {$args == ""} { +#@ set cmd [format {icc_is_dc_up} ] +#@ if {[uplevel #0 $cmd]} { +#@ set cmd [format {remove_design -quiet -designs} ] +#@ if {[uplevel #0 $cmd]} { +#@ set cmd [format {org_close_mw_lib } ] +#@ return [uplevel #0 $cmd] +#@ } else { +#@ return 0 +#@ } +#@ } else { +#@ set cmd [format {org_close_mw_lib } ] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ +#@ if {[info exists ra(-save)]} { +#@ +#@ set cmd [format {save_mw_cel} ] +#@ if {![uplevel #0 $cmd]} { +#@ return +#@ } +#@ +#@ set cmd [format {close_mw_cel} ] +#@ if {![uplevel #0 $cmd]} { +#@ return +#@ } +#@ +#@ set cmd [format {save_open_cels} ] +#@ if {![uplevel #0 $cmd]} { +#@ return +#@ } +#@ } +#@ +#@ set cmd [format {org_close_mw_lib} ] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ define_proc_attributes close_mw_lib -hide_body -info " Closes the milkyway library " -define_args {{-save "Save open cels" "" boolean {optional}} {"" "libraries to be closed" "lib list" list {hidden optional}}} +#@ } else { +#@ define_proc_attributes close_mw_lib -hide_body -info " Closes the milkyway library " -define_args {{-no_save "Don't save open cels" "" boolean {hidden optional}} {"" "libraries to be closed" "lib list" list {hidden optional}}} +#@ } +#@ ############################################################################## +#@ # +#@ # PROCEDURE: write_mw_lib_files +#@ # +#@ # ABSTRACT: Write technology or reference control file +#@ # History: Yun Zhang 2012/12/11, public option -stream_layer_map_file +#@ # History: Yun Zhang 2012/9/5. support new hidden option -vt_cell_placement_properties +#@ # History: Yun Zhang 2011/12/5. add new hidden option -stream_layer_map_file +#@ # +#@ ############################################################################## +#@ proc write_mw_lib_files args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ +#@ if {[info exists ra(-reference_control_file)]} { +#@ #Option -reference_contrl_file, -plib and -technology are exclusive. +#@ # If both of them are set at the same time, error reported. +#@ # 9000273455, by xqsun, 2009/2/4 +#@ if {[info exists ra(-technology)]} { +#@ echo "Error: Cannot specify '-reference_control_file' with '-technology'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-plib)]} { +#@ echo "Error: Cannot specify '-reference_control_file' with '-plib'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-vt_cell_placement_properties)]} { +#@ echo "Error: Cannot specify '-reference_control_file' with '-vt_cell_placement_properties'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-stream_layer_map_file)]} { +#@ echo "Error: Cannot specify '-reference_control_file' with '-stream_layer_map_file'.(CMD-001)" +#@ return 0 +#@ } else { +#@ set cmd [format {report_mw_lib_ref_ctrl_file -output %s %s} $ra(-output) $ra() ] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ +#@ if {[info exists ra(-technology)]} { +#@ if {[info exists ra(-plib)]} { +#@ echo "Error: Cannot specify '-technology' with '-plib'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-vt_cell_placement_properties)]} { +#@ echo "Error: Cannot specify '-technology' with '-vt_cell_placement_properties'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-stream_layer_map_file)]} { +#@ echo "Error: Cannot specify '-technology' with '-stream_layer_map_file'.(CMD-001)" +#@ return 0 +#@ } else { +#@ set cmd [format {org_report_mw_lib -output %s %s} $ra(-output) $ra() ] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ +#@ if {[info exists ra(-vt_cell_placement_properties)]} { +#@ if {[info exists ra(-stream_layer_map_file)]} { +#@ echo "Error: Cannot specify '-vt_cell_placement_properties' with '-stream_layer_map_file'.(CMD-001)" +#@ return 0 +#@ } else { +#@ set cmd [format {org_report_mw_lib -vt_cell_placement_properties -output %s %s} $ra(-output) $ra() ] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ +#@ if {[info exists ra(-stream_layer_map_file)]} { +#@ set cmd [format {org_report_mw_lib -stream_layer_map_file %s -output %s %s} $ra(-stream_layer_map_file) $ra(-output) $ra() ] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ } +#@ +#@ define_proc_attributes write_mw_lib_files -hide_body -info " Write technology or reference control file " -define_args {{-technology "Dump technology file" "" boolean {optional}} {-vt_cell_placement_properties "Dump multi-VT cells' implant layer information of library" "" boolean {optional hidden}} {-reference_control_file "Dump reference control file" "" boolean {optional}} {-stream_layer_map_file "Dump layer map file during stream in/out" "" string {optional}} {-output "Output file" "file_name" string {required}} {"" "Library to be reported" "libName" string {required}}} +#@ } +#@ ############################################################################## +#@ # +#@ # PROCEDURE: close_mw_cel +#@ # +#@ # ABSTRACT: Wrapper around close_mw_cel to add -save option +#@ # remove_timing_design is the command to shutdown dc netlist +#@ # +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ +#@ proc close_mw_cel args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ global mw_is_all_views +#@ set cmd [format {icc_is_dc_up} ] +#@ set dc_is_up [uplevel #0 $cmd] +#@ +#@ set cmd_close [format {org_close_mw_cel} ] +#@ +#@ if {[info exists ra(-all_views)]} { +#@ set cmd_close [format {%s -all_views} $cmd_close] +#@ set mw_is_all_views 1 +#@ } +#@ if {[info exists ra(-all_versions)]} { +#@ set cmd_close [format {%s -all_versions} $cmd_close] +#@ } +#@ if {[info exists ra(-save)]} { +#@ set cmd_close [format {%s -save} $cmd_close] +#@ } +#@ if {[info exists ra(-verbose)]} { +#@ set cmd_close [format {%s -verbose} $cmd_close] +#@ } +#@ if {[info exists ra(-hierarchy)]} { +#@ set cmd_close [format {%s -hierarchy} $cmd_close] +#@ } +#@ +#@ ui_util_clean_saved_lib_attr $args +#@ +#@ set cmd "" +#@ set lcels "" +#@ set is_current_closed 1 +#@ +#@ if {[info exists ra()]} { +#@ set lcels $ra() +#@ } +#@ set len [string length $lcels] +#@ if {$len > 0} { +#@ set is_current_closed [is_current_mw_cel $lcels] +#@ set cmd_close [format {%s {%s}} $cmd_close $lcels] +#@ } +#@ if {[uplevel #0 $cmd_close]} { +#@ set mw_is_all_views 0 +#@ if {$dc_is_up == 1} { +#@ if {$is_current_closed == 1} { +#@ set cmd [format {remove_design -quiet -designs} ] +#@ return [uplevel #0 $cmd] +#@ } +#@ return 1 +#@ } else { +#@ return 1 +#@ } +#@ } else { +#@ set mw_is_all_views 0 +#@ return 0 +#@ } +#@ } +#@ +#@ define_proc_attributes close_mw_cel -hide_body -info " Closes the design " -define_args {{-save "Save the design" "" boolean {optional}} {-discard "Discard any changes" "" boolean {optional hidden}} {-verbose "Print out debugging messages" "" boolean {optional hidden}} {-hierarchy "Close top design and its child designs" "" boolean {optional}} {-all_views "Close all views of the design" "" boolean {optional}} {-all_versions "Close all versions of the design" "" boolean {optional}} {"" "designs to be closed" "design list" list {optional}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: save_all_mw_cel +#@ # +#@ # ABSTRACT: Wrapper around save_mw_cel to save all the open cels. Needed for Black box flow. +#@ # +#@ ############################################################################## +#@ +#@ proc save_all_mw_cels { } { +#@ set top_cel [get_attribute [current_mw_cel] name] +#@ +#@ set cels [fp_get_open_cells] +#@ +#@ foreach cel $cels { +#@ if {$cel != $top_cel} { +#@ current_mw_cel $cel +#@ +#@ save_mw_cel +#@ } +#@ } +#@ +#@ current_mw_cel $top_cel +#@ +#@ save_mw_cel +#@ } +#@ +#@ icc_hide_cmd save_all_mw_cels +#@ +#@ ############################################################################## +#@ # PROCEDURE: execute_command_and_create_cel_from_scratch +#@ # ABSTRACT: This procedure executes the given command and creates the CEL +#@ # from scratch after executing this command. +#@ ############################################################################## +#@ proc execute_command_and_create_cel_from_scratch {org_cmd_name args} { +#@ global mw_create_cel_force +#@ global mw_enable_auto_cel +#@ global mw_force_auto_cel +#@ +#@ set lib [current_mw_lib] +#@ +#@ # If no MW lib, design is not from MW. Execute the original command +#@ # and return. +#@ if {$lib == ""} { +#@ return [eval $org_cmd_name $args] +#@ } +#@ +#@ # Get values of few variables. +#@ set incr_mode $mw_create_cel_force +#@ set mw_create_cel_force TRUE +#@ +#@ # Get auto cel mode, disable it temporarily if enabled. +#@ set auto_cel_mode $mw_enable_auto_cel +#@ set mw_enable_auto_cel FALSE +#@ +#@ # Check if the already existing CEL is auto-CEL. +#@ set auto_cel 0 +#@ if {[is_cel_auto_cel]} { +#@ set auto_cel 1 +#@ } elseif {![get_top_cel_mwid]} { +#@ set auto_cel 1 +#@ } +#@ +#@ +#@ # Run the original command, if not successful restore the incr_mode +#@ # variable and return. No CEL is created. +#@ if {![eval $org_cmd_name $args]} { +#@ set mw_create_cel_force $incr_mode +#@ set mw_enable_auto_cel $auto_cel_mode +#@ return 0 +#@ } +#@ +#@ # Restore auto_cel mode +#@ set mw_enable_auto_cel $auto_cel_mode +#@ +#@ # Now create auto or real CEL depending on what the original CEL was. +#@ if {$auto_cel == "1"} { +#@ # Force creation of auto-CEL, since commands other than read_def/pdef +#@ # do not decouple CEL from DC. +#@ +#@ set mw_force_auto_cel TRUE +#@ set cmd [format {save_mw_cel -auto}] +#@ } else { +#@ if [get_top_cel_mwid] { +#@ set cmd [format {save_mw_cel -create}] +#@ echo "Information: Command not supported by incr. update or write-thru." +#@ echo " Creating new CEL from scratch, old CEL will be closed." +#@ } +#@ } +#@ +#@ # Create the Auto CEL or normal CEL from scratch. +#@ if {![uplevel #0 $cmd]} { +#@ set mw_create_cel_force $incr_mode +#@ set mw_force_auto_cel FALSE +#@ return 0 +#@ } +#@ +#@ set mw_create_cel_force $incr_mode +#@ set mw_force_auto_cel FALSE +#@ return 1 +#@ } +#@ +#@ define_proc_attributes execute_command_and_create_cel_from_scratch -hidden -hide_body +#@ +#@ ############################################################################## +#@ # PROCEDURE: read_def +#@ # ABSTRACT: Wrapper around read_def to handle incremental update properly +#@ # if MW based read_def is used, bypass the wrapper +#@ # enable_milkyway_def_reader_writer must be TRUE and use_pdb_lib_format must +#@ # be false for MW read_Def to be run, use wrapper if either condition fails +#@ ############################################################################## +#@ rename -force dc_read_def org_read_def +#@ icc_hide_cmd org_read_def +#@ proc dc_read_def args { +#@ parse_proc_arguments -args $args ra +#@ +#@ return [eval execute_command_and_create_cel_from_scratch "org_read_def" $args] +#@ } +#@ +#@ define_proc_attributes dc_read_def -hide_body -info " Read a def file " -define_args {{-design "name of design for which clusters are to be read" "" string {optional}} {-quiet "do not print out any warnings" "" boolean {optional}} {-verbose "print out more warnings" "" boolean {optional}} {-allow_physical_cells "allow physical cells" "" boolean {optional}} {-allow_physical_ports "allow physical ports" "" boolean {optional}} {-allow_physical_nets "allow physical nets" "" boolean {optional}} {-skip_signal_nets "skip signal nets" "" boolean {optional}} {-incremental "incremental" "" boolean {optional}} {-enforce_scaling "enforce_scaling" "" boolean {optional}} {-move_bounds "move bounds" "" boolean {optional}} {"" "input def file names" "input_def_file_name" string {required}}} +#@ +#@ +#@ ############################################################################## +#@ # PROCEDURE: group +#@ # ABSTRACT: Wrapper around group to handle incremental update properly +#@ ############################################################################## +#@ rename -force group org_group +#@ icc_hide_cmd org_group +#@ proc group args { +#@ parse_proc_arguments -args $args ra +#@ return [eval execute_command_and_create_cel_from_scratch "org_group" $args] +#@ } +#@ +#@ define_proc_attributes group -hide_body -info " create new hierarchy" -define_args {{-except "cells not to be included in the group" "exclude_list" list {optional}} +#@ {-design_name "name of design created for new hierarchy" "design_name" string {optional}} +#@ {-cell_name "name of cell created for new hierarchy" "cell_name" string {optional}} +#@ {-logic "group any combinational elements" "" boolean {optional}} +#@ {-pla "group any PLA elements" "" boolean {optional}} +#@ {-fsm "group all elements part of a finite state machine" "" boolean {optional}} +#@ {-hdl_block "name of hdl_block to group" "" string {optional}} +#@ {-hdl_bussed "group all bussed gates under this block" "" boolean {optional}} +#@ {-hdl_all_blocks "group all hdl blocks under this block" "" boolean {optional}} +#@ {-soft "set the group_name attribute" "" boolean {optional}} +#@ {"" "cells to be included in the group" "cell_list" list {optional}}} +#@ +#@ ############################################################################## +#@ # PROCEDURE: copy_design +#@ # ABSTRACT: Wrapper around copy_design to handle incremental update properly +#@ ############################################################################## +#@ rename -force copy_design org_copy_design +#@ icc_hide_cmd org_copy_design +#@ proc copy_design args { +#@ parse_proc_arguments -args $args ra +#@ return [eval execute_command_and_create_cel_from_scratch "org_copy_design" $args] +#@ } +#@ +#@ define_proc_attributes copy_design -hide_body -info " copy_design" -define_args {{"" "List of designs to be copied" "design_list" list {required}} +#@ {"" "Name of new design or target file" "target_name" string {required}}} +#@ +#@ ############################################################################## +#@ # PROCEDURE: create_design +#@ # ABSTRACT: Wrapper around create_design to handle incremental update properly +#@ ############################################################################## +#@ rename -force create_design org_create_design +#@ icc_hide_cmd org_create_design +#@ proc create_design args { +#@ parse_proc_arguments -args $args ra +#@ return [eval execute_command_and_create_cel_from_scratch "org_create_design" $args] +#@ } +#@ +#@ define_proc_attributes create_design -hide_body -info " Creates a design in dc_shell memory" -define_args {{"" "name of the design to create" "" string {required}} +#@ {"" "name of file for design; optional" "" string {optional}}} +#@ +#@ ############################################################################## +#@ # PROCEDURE: reset_design +#@ # ABSTRACT: Wrapper around reset_design to handle incremental update properly +#@ ############################################################################## +#@ #rename -force reset_design org_reset_design +#@ #icc_hide_cmd org_reset_design +#@ #proc reset_design args { +#@ # parse_proc_arguments -args $args ra +#@ # return [eval execute_command_and_create_cel_from_scratch "org_reset_design" $args] +#@ #} +#@ +#@ ############################################################################## +#@ # PROCEDURE: rename_design +#@ # ABSTRACT: Wrapper around rename_design to handle incremental update properly +#@ ############################################################################## +#@ rename -force rename_design org_rename_design +#@ icc_hide_cmd org_rename_design +#@ proc rename_design args { +#@ parse_proc_arguments -args $args ra +#@ return [eval execute_command_and_create_cel_from_scratch "org_rename_design" $args] +#@ } +#@ +#@ define_proc_attributes rename_design -hide_body -info " rename_design" -define_args {{"" "List of designs to be renamed" "design_list" list {required}} +#@ {"" "Name of new design or target file" "target_name" string {required}}} +#@ +#@ } +#@ +#@ ############################################################################## +#@ # If we are in icc_shell (i.e. Galileo) then +#@ # load the procedures to switch between DC and Milkyway collections. +#@ # Set the default to MW collection unless otherwise specified. +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ # load the procedures that switch between DC and MW collections +#@ source $synopsys_root/auxx/syn/collection_procs.tcl +#@ +#@ set CS mw +#@ +#@ # see if the user wants DC +#@ if {! [catch {getenv USE_DC_COLLECTIONS_ONLY}] && +#@ [getenv USE_DC_COLLECTIONS_ONLY] } { +#@ set CS dc +#@ } +#@ +#@ # set the collection source now +#@ redirect /dev/null { +#@ if {[catch {set_collection_mode -handle $CS}]} { +#@ catch {set_collection_option -handle $CS} +#@ } +#@ } +#@ +#@ unset CS +#@ } +#@ +#@ ############################################################################## +#@ # procedure for route command +#@ # echo the command to a temp tcl file for seperate process to pick up +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ rename -force route org_route +#@ icc_hide_cmd org_route +#@ proc route args { +#@ set route_cmd_file_name ".route_cmd.tcl" +#@ set route_cmd_temp_file_name ".route_cmd.tcl.temp" +#@ set fp [open $route_cmd_file_name "w"] +#@ set route_cmd [concat "sep_proc_route " $args " -child"] +#@ puts $fp $route_cmd +#@ close $fp +#@ +#@ uplevel #0 rename -force route route_temp_proc +#@ uplevel #0 rename -force org_route route +#@ set status [ uplevel #0 route $args ] +#@ uplevel #0 rename -force route org_route +#@ uplevel #0 rename -force route_temp_proc route +#@ +#@ if { [info exist status ] == 1 } { +#@ return $status +#@ } +#@ return +#@ } +#@ } +#@ +#@ ############################################################################## +#@ # Tcl Command: set_ignore_cell +#@ # Description: Load the command only in IC Compiler (icc_shell) +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ source $synopsys_root/auxx/syn/psyn/ideal_cell.tcl.e +#@ } +#@ +#@ ############################################################################## +#@ # Tcl Command: check_physical_design +#@ # Description: Load the command only in IC Compiler (icc_shell) +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ # Load the compiled Tcl byte-code: +#@ # 9000784997: Do not log to command.log when sourcing .tbc files +#@ set prev_sh_source_logging [get_app_var sh_source_logging] +#@ set_app_var sh_source_logging 0 +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_core.tbc +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_utils.tbc +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_flows.tbc +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_reports.tbc +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_ui.tbc +#@ source $synopsys_root/auxx/syn/psyn/sanity_setup_opt.tbc +#@ source $synopsys_root/auxx/syn/psyn/sanity_setup_cmd.tbc +#@ source $synopsys_root/auxx/syn/psyn/sanity_setup_rpt.tbc +#@ source $synopsys_root/auxx/syn/psyn/create_qor_snapshot.tbc +#@ source $synopsys_root/auxx/syn/psyn/report_qor_snapshot.tbc +#@ source $synopsys_root/auxx/syn/psyn/msgParser.tbc +#@ source $synopsys_root/auxx/syn/psyn/displacement_gui.tbc +#@ source $synopsys_root/auxx/syn/psyn/categorize_timing_gui.tbc +#@ set_app_var sh_source_logging $prev_sh_source_logging +#@ +#@ source $synopsys_root/auxx/syn/psyn/mcmm_utils.tcl.e +#@ source $synopsys_root/auxx/syn/psyn/propagate_all_clocks.tcl.e +#@ } +#@ +#@ if { [string match -nocase {*dc_shell*} $synopsys_program_name] && [shell_is_in_topographical_mode] } { +#@ # 9000784997: Do not log to command.log when sourcing .tbc files +#@ set prev_sh_source_logging [get_app_var sh_source_logging] +#@ set_app_var sh_source_logging 0 +#@ source $synopsys_root/auxx/syn/psyn/create_qor_snapshot.tbc +#@ source $synopsys_root/auxx/syn/psyn/report_qor_snapshot.tbc +#@ set_app_var sh_source_logging $prev_sh_source_logging +#@ +#@ source $synopsys_root/auxx/syn/psyn/mcmm_utils.tcl.e +#@ } +#@ +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] || [string match -nocase {*dc_shell*} $synopsys_program_name] || [string match -nocase {*de_shell*} $synopsys_program_name] } { +#@ source $synopsys_root/auxx/syn/psyn/write_timing_context.tcl.e; +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ source $synopsys_root/auxx/syn/psyn/write_scenarios.tbc; +#@ } +#@ } +#@ +#@ if { $synopsys_program_name == "de_shell" } { +#@ # 9000784997: Do not log to command.log when sourcing .tbc files +#@ set prev_sh_source_logging [get_app_var sh_source_logging] +#@ set_app_var sh_source_logging 0 +#@ source $synopsys_root/auxx/syn/psyn/create_qor_snapshot.tbc +#@ source $synopsys_root/auxx/syn/psyn/report_qor_snapshot.tbc +#@ set_app_var sh_source_logging $prev_sh_source_logging +#@ +#@ source $synopsys_root/auxx/syn/psyn/mcmm_utils.tcl.e +#@ } +#@ +#@ ############################################################################## +#@ # ICC setup and hiding commands/procs etc +#@ ############################################################################## +#@ +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ #set save_mw_cel_lib_setup TRUE +#@ #set auto_restore_mw_cel_lib_setup FALSE +#@ +#@ alias create_wiring_keepout create_wiring_keepouts +#@ alias get_wiring_keepout get_wiring_keepouts +#@ alias get_placement_keepout get_placement_keepouts +#@ alias create_placement_keepout create_placement_keepouts +#@ +#@ icc_hide_cmd execute_command_and_create_cel_from_scratch +#@ icc_hide_cmd dc_read_def +#@ icc_hide_cmd read_edif +#@ icc_hide_cmd read_sverilog +#@ icc_hide_cmd read_vhdl +#@ icc_hide_cmd set_collection_mode +#@ icc_hide_cmd return_dc_collection +#@ icc_hide_cmd return_mw_collection +#@ set mw_use_pdb_lib_format true +#@ } +#@ +#@ +#@ ############################################################################## +#@ # Tcl Command: get_dont_touch_nets +#@ # Description: wrapper of "get_nets -filter dont_touch_reason==mv" +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ +#@ proc get_dont_touch_nets args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {get_nets}] +#@ +#@ if {[info exists ra()]} { +#@ set cmd [format {%s {%s}} $cmd $ra()] +#@ } +#@ if {[info exists ra(-type)]} { +#@ set cmd [format {%s -filter dont_touch_reasons=~*%s*} $cmd $ra(-type)] +#@ } +#@ if {[info exists ra(-hierarchical)]} { +#@ set cmd [format {%s -hierarchical} $cmd] +#@ } +#@ if {[info exists ra(-quiet)]} { +#@ set cmd [format {%s -quiet} $cmd] +#@ } +#@ if {[info exists ra(-regexp)]} { +#@ set cmd [format {%s -regexp} $cmd] +#@ } +#@ if {[info exists ra(-nocase)]} { +#@ set cmd [format {%s -nocase} $cmd] +#@ } +#@ if {[info exists ra(-exact)]} { +#@ set cmd [format {%s -exact} $cmd] +#@ } +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes get_dont_touch_nets -info " Get dont_touch nets " -permanent -define_args { {"" "Match net names against patterns" "patterns" list {optional}} {-type "Match net dont_touch reasons" "reasons" list {required}} {-hierarchical "Search level-by-level in current instance" "" boolean {optional}} {-quiet "Suppress all messages" "" boolean {optional hidden}} {-regexp "Patterns are full regular expressions" "" boolean {optional hidden}} {-nocase "With -regexp, matches are case-insensitive" "" boolean {optional hidden}} {-exact "Wildcards are considered as plain characters" "" boolean {optional hidden}} } +#@ +#@ alias get_dont_touch_net get_dont_touch_nets +#@ } +#@ +#@ +#@ ############################################################################## +#@ # return the first {index value} pair in Tcl array ary. +#@ ############################################################################## +#@ proc _snps_array_peek { level ary } { +#@ upvar #$level $ary loc_ary +#@ set ret [list] +#@ if {[catch {set token [array startsearch loc_ary]}]} { +#@ return $ret +#@ } +#@ while {[array anymore loc_ary $token]} { +#@ set k [array nextelement loc_ary $token] +#@ set v $loc_ary($k) +#@ set ret [list $k $v] +#@ break +#@ } +#@ array donesearch loc_ary $token +#@ return $ret; +#@ } +#@ define_proc_attributes _snps_array_peek -hidden +#@ +#@ +#@ ############################################################################## +#@ # Tcl Command: filter_collection +#@ # Description: DC wrapper for filter_collection with fixes of direction filter +#@ # +#@ # This is a fix for DC's filter using "direction" attribute. This +#@ # attribute is of integer type, but user wants a string format +#@ ############################################################################## +#@ if {[string match -nocase {*icc_shell*} $synopsys_program_name] == 0} { +#@ rename -force -hidden filter_collection _real_filter_collection +#@ proc filter_collection {args} { +#@ parse_proc_arguments -args $args ra +#@ +#@ set regexp "" +#@ set nocase "" +#@ if {[info exist ra(-regexp)]} { +#@ set regexp "-regexp" +#@ } +#@ if {[info exist ra(-nocase)]} { +#@ set nocase "-nocase" +#@ } +#@ set coll $ra(collection1) +#@ +#@ # _real_filter_collection silently returns in this error condition +#@ if {[catch {set coll_size [sizeof_collection $coll]}] || $coll_size <= 0} { +#@ return [list] +#@ } +#@ +#@ if {$::sh_translate_direction_attribute == true} { +#@ set filter_expr [replace_direction $coll $ra(expression)] +#@ } else { +#@ set filter_expr $ra(expression) +#@ } +#@ +#@ # if $ra(expression) is not empty but filter_expr is, collection is heterogrnous +#@ # and expression has "direction" as substring. We have to walk through all objects +#@ if {[string length $filter_expr] == 0 && [string length $ra(expression)] != 0} { +#@ set part1 [format {_real_filter_collection %s %s } $regexp $nocase] +#@ set results "" +#@ set subclxn "" +#@ set subsize [expr [sizeof_collection $coll]/80 + 10] +#@ set counter 0 +#@ foreach_in_collection obj $coll { +#@ incr counter +#@ set cmd [format {%s %s {%s}} $part1 $obj [replace_direction $obj $ra(expression)]] +#@ append_to_collection subclxn [uplevel #0 $cmd] +#@ if {[expr $counter % $subsize] == 0} { +#@ append_to_collection results $subclxn +#@ set subclxn "" +#@ } +#@ } +#@ if {[sizeof_collection $subclxn] != 0} { +#@ append_to_collection results $subclxn +#@ } +#@ return $results +#@ } else { +#@ set cmd [format {_real_filter_collection %s %s %s {%s}} $regexp $nocase $coll $filter_expr] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ define_proc_attributes filter_collection -info " Filter a collection, resulting in new collection " -permanent -define_args { {-regexp "Operators =~ and !~ use regular expressions" "" boolean {optional}} {-nocase "Case insensitive string match" "" boolean {optional}} {collection1 "Collection to filter" "collection1" string {required}} {expression "Filter expression" "expression" string {required}} } +#@ +#@ } +#@ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/.dc_procs.tcl + +#@ +#@ # Temporary fix for the LMC_HOME variable- set it to an empty string +#@ +#@ if { [catch {getenv LMC_HOME } __err ] != 0 } { +#@ setenv LMC_HOME "" +#@ } +#@ +#@ +#@ # +#@ # +#@ # Site-Specific Variables +#@ # +#@ # These are the variables that are most commonly changed at a +#@ # specific site, either upon installation of the Synopsys software, +#@ # or by specific engineers in their local .synopsys files. +#@ # +#@ # +#@ +#@ # from the System Variable Group +#@ set link_library { * your_library.db } +#@ +#@ set search_path [list . ${synopsys_root}/libraries/syn ${synopsys_root}/minpower/syn ${synopsys_root}/dw/syn_ver ${synopsys_root}/dw/sim_ver] +#@ set target_library your_library.db +#@ set synthetic_library "" +#@ set command_log_file "./command.log" +#@ set designer "" +#@ set company "" +#@ set find_converts_name_lists "false" +#@ +#@ set symbol_library your_library.sdb +#@ +#@ # Turn on Formality SVF recording +#@ if { $synopsys_program_name == "dc_shell" || $synopsys_program_name == "de_shell" || $synopsys_program_name == "design_vision" } { +#@ set_svf -default default.svf +#@ } +#@ +#@ # from the Schematic Variable Group +#@ +#@ # from the Plot Variable Group +#@ # [froi] 07/06/2012: Remove old Design Analyzer plot_command variable +#@ #if { $sh_arch == "hp700" } { +#@ # set plot_command "lp -d" +#@ #} else { +#@ # set plot_command "lpr -Plw" +#@ #} +#@ +#@ set view_command_log_file "./view_command.log" +#@ +#@ # from the View Variable group +#@ if { $sh_arch == "hp700" } { +#@ set text_print_command "lp -d" +#@ } else { +#@ set text_print_command "lpr -Plw" +#@ } +#@ # +#@ # System Variable Group: +#@ # +#@ # These variables are system-wide variables. +#@ # +#@ set arch_init_path ${synopsys_root}/${sh_arch}/motif/syn/uid +#@ set auto_link_disable "false" +#@ set auto_link_options "-all" +#@ set uniquify_naming_style "%s_%d" +#@ set verbose_messages "true" +#@ set echo_include_commands "true" +#@ set svf_file_records_change_names_changes "true" +#@ set change_names_update_inst_tree "true" +#@ set change_names_dont_change_bus_members false +#@ set default_name_rules "" +#@ #set tdrc_enable_clock_table_creation "true" +#@ +#@ # +#@ # Compile Variable Group: +#@ # +#@ # These variables affect the designs created by the COMPILE command. +#@ # +#@ set compile_assume_fully_decoded_three_state_busses "false" +#@ set compile_no_new_cells_at_top_level "false" +#@ set compile_dont_touch_annotated_cell_during_inplace_opt "false" +#@ set compile_update_annotated_delays_during_inplace_opt "true" +#@ set compile_instance_name_prefix "U" +#@ set compile_instance_name_suffix "" +#@ set compile_negative_logic_methodology "false" +#@ set compile_disable_hierarchical_inverter_opt "false" +#@ set compile_use_low_timing_effort "false" +#@ set compile_fix_cell_degradation "false" +#@ set compile_preserve_subdesign_interfaces "false" +#@ set compile_enable_constant_propagation_with_no_boundary_opt "true" +#@ set port_complement_naming_style "%s_BAR" +#@ set compile_implementation_selection "true" +#@ set compile_delete_unloaded_sequential_cells "true" +#@ set reoptimize_design_changed_list_file_name "" +#@ set compile_checkpoint_phases "false" +#@ set compile_cpu_limit 0.0 +#@ set compile_log_format " %elap_time %area %wns %tns %drc %endpoint"; +#@ set compile_top_all_paths "false" +#@ set compile_top_acs_partition "false" +#@ set default_port_connection_class "universal" +#@ set compile_hold_reduce_cell_count "false" +#@ set compile_retime_license_behavior "wait" +#@ set dont_touch_nets_with_size_only_cells "false" +#@ if { $synopsys_program_name == "dc_shell" && [shell_is_in_topographical_mode] } { +#@ set dct_prioritize_area_correlation "false" +#@ set compile_error_on_missing_physical_cells "false" +#@ } +#@ +#@ set ldd_return_val 0 +#@ if { [string compare $dc_shell_mode "default"] == 0 } { +#@ set ldd_script ${synopsys_root}/auxx/syn/scripts/list_duplicate_designs.dcsh +#@ alias list_duplicate_designs "include -quiet ldd_script; dc_shell_status = ldd_return_val " +#@ +#@ } +#@ if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ if {$synopsys_program_name != "dc_sms_shell"} { +#@ source ${synopsys_root}/auxx/syn/scripts/list_duplicate_designs.tcl +#@ # 9000784997: Do not log to command.log when sourcing .tbc files +#@ set prev_sh_source_logging [get_app_var sh_source_logging] +#@ set_app_var sh_source_logging 0 +#@ source ${synopsys_root}/auxx/syn/scripts/analyze_datapath.tbc +#@ set_app_var sh_source_logging $prev_sh_source_logging +#@ } +#@ } +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/scripts/list_duplicate_designs.tcl + +#@ ####################################################################### +#@ # +#@ # list_duplicate_designs.tcl 21 Sept. 2006 +#@ # +#@ # List designs in dc_shell memory that have the same design name +#@ # +#@ # COPYRIGHT (C) 2006, SYNOPSYS INC., ALL RIGHTS RESERVED. +#@ # +#@ ####################################################################### +#@ +#@ proc list_duplicate_designs { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ # Get the list of duplicate designs +#@ set the_pid [pid] +#@ set rand_1 [expr int(rand() * 100000)] +#@ set temp_file_1 [format "/tmp/ldd_design_%s_%s" $the_pid $rand_1] +#@ +#@ redirect $temp_file_1 { foreach_in_collection ldd_design [find design "*"] { +#@ echo [get_object_name $ldd_design] +#@ } } +#@ +#@ set rand_2 [expr int(rand() * 100000)] +#@ set temp_file_2 [format "/tmp/ldd_design_%s_%s" $the_pid $rand_2] +#@ +#@ sh sort $temp_file_1 | uniq -d | tee $temp_file_2 +#@ file delete $temp_file_1 +#@ +#@ # Report duplicates +#@ if { ! [file size $temp_file_2] } { +#@ echo [concat {No duplicate designs found.}] +#@ set ldd_return_val 0 +#@ } else { +#@ set rand_3 [expr int(rand() * 100000)] +#@ set temp_file_3 [format "/tmp/ldd_design_%s_%s" $the_pid $rand_3] +#@ echo {Warning: Multiple designs in memory with the same design name.} +#@ echo {} +#@ echo { Design File Path} +#@ echo { ------ ---- ----} +#@ list_designs -table > $temp_file_3 +#@ echo [sh fgrep -f $temp_file_2 $temp_file_3 | sort | grep -v 'Design.*File.*Path'] +#@ file delete $temp_file_3 +#@ set ldd_return_val 1 +#@ } +#@ +#@ # Clean up +#@ file delete $temp_file_2 +#@ +#@ set list_duplicate_designs1 $ldd_return_val +#@ } +#@ +#@ define_proc_attributes list_duplicate_designs -info " List designs of same names" -permanent -define_args { +#@ } +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/scripts/list_duplicate_designs.tcl + +#@ +#@ +#@ set compile_log_format " %elap_time %area %wns %tns %drc %endpoint"; +#@ +#@ set compile_top_all_paths "false" +#@ alias compile_inplace_changed_list_file_name reoptimize_design_changed_list_file_name +#@ +#@ # +#@ # These variables affects compile, report_timing and report_constraints +#@ # commands. +#@ # +#@ set enable_recovery_removal_arcs "false" +#@ set timing_report_attributes {dont_touch dont_use map_only size_only ideal_net infeasible_paths} +#@ +#@ # +#@ # Multibit Variable Group: +#@ # +#@ # These variables affect the multibit mapping functionality +#@ # +#@ +#@ set bus_multiple_separator_style "," +#@ set bus_multiple_name_separator_style ",," +#@ +#@ # +#@ # ILM Variable Group: +#@ # +#@ # These variables affect Interface Logic Model functionality +#@ # +#@ +#@ set ilm_ignore_percentage 25 +#@ +#@ # +#@ # Estimator Variable Group: +#@ # +#@ # These variables affect the designs created by the ESTIMATE command. +#@ # +#@ set estimate_resource_preference "fast" +#@ alias est_resource_preference estimate_resource_preference +#@ set lbo_lfo_enable_at_pin_count 3 +#@ set lbo_cells_in_regions "false" +#@ +#@ # Synthetic Library Group: +#@ # +#@ # These variable affect synthetic library processing. +#@ # +#@ set cache_dir_chmod_octal "777" +#@ set cache_file_chmod_octal "666" +#@ set cache_read "~" +#@ set cache_read_info "false" +#@ set cache_write "~" +#@ set cache_write_info "false" +#@ set synlib_dont_get_license {} +#@ set synlib_library_list {DW01 DW02 DW03 DW04 DW05 DW06 DW07} +#@ set synlib_wait_for_design_license {} +#@ set synlib_dwhomeip {} +#@ +#@ # +#@ # Insert_DFT Variable Group: +#@ # +#@ #set test_default_client_order [list] +#@ set insert_dft_clean_up "true" +#@ set insert_test_design_naming_style "%s_test_%d" +#@ # /*insert_test_scan_chain_only_one_clock = "false" +#@ # Replace by command line option (star 17215) -- Denis Martin 28-Jan-93*/ +#@ set test_clock_port_naming_style "test_c%s" +#@ set test_scan_clock_a_port_naming_style "test_sca%s" +#@ set test_scan_clock_b_port_naming_style "test_scb%s" +#@ set test_scan_clock_port_naming_style "test_sc%s" +#@ set test_scan_enable_inverted_port_naming_style "test_sei%s" +#@ set test_scan_enable_port_naming_style "test_se%s" +#@ set test_scan_in_port_naming_style "test_si%s%s" +#@ set test_scan_out_port_naming_style "test_so%s%s" +#@ set test_non_scan_clock_port_naming_style "test_nsc_%s" +#@ set test_default_min_fault_coverage 95 +#@ set test_dedicated_subdesign_scan_outs "false" +#@ set test_disable_find_best_scan_out "false" +#@ set test_dont_fix_constraint_violations "false" +#@ set test_isolate_hier_scan_out 0 +#@ set test_mode_port_naming_style "test_mode%s" +#@ set test_mode_port_inverted_naming_style "test_mode_i%s" +#@ set compile_dont_use_dedicated_scanout 1 +#@ set test_mux_constant_si "false" +#@ +#@ # +#@ # Analyze_Scan Variable Group: +#@ # +#@ # These variables affect the designs created by the PREVIEW_SCAN command. +#@ # +#@ set test_preview_scan_shows_cell_types "false" +#@ set test_scan_link_so_lockup_key "l" +#@ set test_scan_link_wire_key "w" +#@ set test_scan_segment_key "s" +#@ set test_scan_true_key "t" +#@ +#@ # +#@ # bsd Variable Group: +#@ +#@ # These variables affect the report generated by the check_bsd command +#@ # and the BSDLout generated by the write_bsdl command. +#@ # +#@ set test_user_test_data_register_naming_style "UTDR%d" +#@ +#@ set test_user_defined_instruction_naming_style "USER%d" +#@ +#@ set test_bsdl_default_suffix_name "bsdl" +#@ +#@ set test_bsdl_max_line_length 80 +#@ +#@ set test_cc_ir_masked_bits 0 +#@ +#@ set test_cc_ir_value_of_masked_bits 0 +#@ +#@ set test_bsd_allow_tolerable_violations "false" +#@ set test_bsd_optimize_control_cell "false" +#@ set test_bsd_control_cell_drive_limit 0 +#@ set test_bsd_manufacturer_id 0 +#@ set test_bsd_part_number 0 +#@ set test_bsd_version_number 0 +#@ set bsd_max_in_switching_limit 60000 +#@ set bsd_max_out_switching_limit 60000 +#@ +#@ # +#@ # TestManager Variable Group: +#@ # +#@ # These variables affect the TestManager methodology. +#@ # +#@ set multi_pass_test_generation "false" +#@ +#@ # +#@ # TestSim Variable Group: +#@ # +#@ # These variables affect the TestSim behavior. +#@ # +#@ # set testsim_print_stats_file "true" +#@ +#@ # Test DRC Variable Group: +#@ # +#@ # These variables affect the check_test command. +#@ # +#@ set test_capture_clock_skew "small_skew" +#@ set test_allow_clock_reconvergence "true" +#@ set test_check_port_changes_in_capture "true" +#@ set test_infer_slave_clock_pulse_after_capture "infer" +#@ +#@ # +#@ # Test Variable Group: +#@ # +#@ # These variables affect the rtldrc, check_test, write_test_protocol +#@ # and write_test command. +#@ # +#@ set test_default_delay 0.0 +#@ set test_default_bidir_delay 0.0 +#@ set test_default_strobe 40.0 +#@ set test_default_strobe_width 0.0 +#@ set test_default_period 100.0 +#@ set test_stil_max_line_length 72 +#@ +#@ #added for B-2008.09-place_opt-004 to disable this option in ICC +#@ +#@ if { $synopsys_program_name != "icc_shell"} { +#@ set test_write_four_cycle_stil_protocol "false" +#@ set test_protocol_add_cycle "true" +#@ set test_stil_multiclock_capture_procedures "false" +#@ set write_test_new_translation_engine "false" +#@ set test_default_scan_style "multiplexed_flip_flop" +#@ set test_jump_over_bufs_invs "true" +#@ set test_point_keep_hierarchy "false" +#@ set test_mux_constant_so "false" +#@ set test_use_test_models "false" +#@ set test_stil_netlist_format "db" +#@ group_variable test "test_protocol_add_cycle" +#@ group_variable test "test_write_four_cycle_stil_protocol" +#@ group_variable test "test_stil_multiclock_capture_procedures" +#@ group_variable test "test_default_scan_style" +#@ group_variable preview_scan "test_jump_over_bufs_invs" +#@ group_variable insert_dft "test_point_keep_hierarchy" +#@ group_variable insert_dft "test_mux_constant_so" +#@ group_variable test "test_stil_netlist_format" +#@ } +#@ set test_rtldrc_latch_check_style "default" +#@ set test_enable_capture_checks "true" +#@ set ctldb_use_old_prot_flow "false" +#@ set test_bsd_default_delay 0.0 +#@ set test_bsd_default_bidir_delay 0.0 +#@ set test_bsd_default_strobe 95.0 +#@ set test_bsd_default_strobe_width 0.0 +#@ +#@ # +#@ # Test Variable Group: +#@ # +#@ # These variables affects the set_scan_state command. +#@ # +#@ +#@ set compile_seqmap_identify_shift_registers_with_synchronous_logic_ascii false +#@ +#@ # +#@ # Write_Test Variable Group: +#@ # +#@ # These variables affect output of the WRITE_TEST command. +#@ # +#@ set write_test_input_dont_care_value "X" +#@ set write_test_vector_file_naming_style "%s_%d.%s" +#@ set write_test_scan_check_file_naming_style "%s_schk.%s" +#@ set write_test_pattern_set_naming_style "TC_Syn_%d" +#@ set write_test_max_cycles 0 +#@ set write_test_max_scan_patterns 0 +#@ # /*retain "tssi_ascii" (equivalent to "tds") for backward compatability */ +#@ set write_test_formats {synopsys tssi_ascii tds verilog vhdl wgl} +#@ set write_test_include_scan_cell_info "true" +#@ set write_test_round_timing_values "true" +#@ +#@ +#@ # +#@ # Schematic and EDIF and Hdl Variable Groups: +#@ # +#@ # These variables affect the schematics created by the +#@ # create_schematic command, define the behavior of the +#@ # DC system EDIF interface, and are for controlling hdl +#@ # reading. +#@ # +#@ set bus_dimension_separator_style {][} +#@ set bus_naming_style {%s[%d]} +#@ +#@ +#@ # +#@ # Schematic and EDIF Variable Groups: +#@ # +#@ # These variables affect the schematics created by the +#@ # create_schematic command and define the behavior of +#@ # the DC system EDIF interface. +#@ # +#@ set bus_range_separator_style ":" +#@ +#@ +#@ # +#@ # EDIF and Io Variable Groups: +#@ # +#@ # These variables define the behavior of the DC system EDIF interface and +#@ # define the behavior of the DC system interfaces, i.e. LSI, Mentor, TDL, SGE,# etc. +#@ +#@ set bus_inference_descending_sort "true" +#@ set bus_inference_style "" +#@ set write_name_nets_same_as_ports "false" +#@ # +#@ # Schematic Variable Group: +#@ # +#@ # These variables affect the schematics created by the +#@ # create_schematic command. +#@ # +#@ set font_library "1_25.font" +#@ set generic_symbol_library "generic.sdb" +#@ +#@ # +#@ # Io Variable Group: +#@ # +#@ # These variables define the behavior of the DC system +#@ # interfaces, i.e. LSI, Mentor, TDL, SGE, etc. +#@ # +#@ #set db2sge_output_directory "" +#@ #set db2sge_scale "2" +#@ #set db2sge_overwrite "true" +#@ #set db2sge_display_symbol_names "false" +#@ +#@ +#@ #set db2sge_display_pin_names "false" +#@ #set db2sge_display_instance_names "false" +#@ #set db2sge_use_bustaps "false" +#@ #set db2sge_use_compound_names "true" +#@ #set db2sge_bit_type "std_logic" +#@ #set db2sge_bit_vector_type "std_logic_vector" +#@ #set db2sge_one_name "'1'" +#@ #set db2sge_zero_name "'0'" +#@ #set db2sge_unknown_name "'X'" +#@ #set db2sge_target_xp "false" +#@ #set db2sge_tcf_package_file "synopsys_tcf.vhd" +#@ #set db2sge_use_lib_section "" +#@ #set db2sge_script "" +#@ #set db2sge_command "" +#@ +#@ # set equationout_and_sign "*" +#@ # set equationout_or_sign "+" +#@ # set equationout_postfix_negation "true" +#@ +#@ # # [wjchen] 2006/08/14: The following variables are obsoleted for DC simpilification. +#@ #set lsiin_net_name_prefix "NET_" +#@ #set lsiout_inverter_cell "" +#@ #set lsiout_upcase "true" +#@ +#@ #set mentor_bidirect_value "INOUT" +#@ #set mentor_do_path "" +#@ #set mentor_input_output_property_name "PINTYPE" +#@ #set mentor_input_value "IN" +#@ #set mentor_logic_one_value "1SF" +#@ #set mentor_logic_zero_one_property_name "INIT" +#@ #set mentor_logic_zero_value "0SF" +#@ #set mentor_output_value "OUT" +#@ #set mentor_primitive_property_name "PRIMITIVE" +#@ #set mentor_primitive_property_value "MODULE" +#@ #set mentor_reference_property_name "COMP" +#@ #set mentor_search_path "" +#@ #set mentor_write_symbols "true" +#@ +#@ ## [wjchen] 0606_simp +#@ #set pla_read_create_flip_flop "false" +#@ #set tdlout_upcase "true" +#@ +#@ # # [wjchen] 2006/08/14: The following4 variables are obsoleted for DC simpilification. +#@ # set xnfout_constraints_per_endpoint "50" +#@ # set xnfout_default_time_constraints true +#@ # set xnfout_clock_attribute_style "CLK_ONLY" +#@ # set xnfout_library_version "" +#@ +#@ # # [wjchen] 2006/08/11: The following 8 variables are obsoleted for DC simpilification. +#@ # set xnfin_family "4000" +#@ # set xnfin_ignore_pins "GTS GSR GR" +#@ # set xnfin_dff_reset_pin_name "RD" +#@ # set xnfin_dff_set_pin_name "SD" +#@ # set xnfin_dff_clock_enable_pin_name "CE" +#@ # set xnfin_dff_data_pin_name "D" +#@ # set xnfin_dff_clock_pin_name "C" +#@ # set xnfin_dff_q_pin_name "Q" +#@ # +#@ +#@ # +#@ # EDIF Variable Group: +#@ # +#@ # These variables define the behavior of the DC system +#@ # EDIF interface. +#@ # +#@ +#@ ##[wjchen] 2006/08/24 +#@ +#@ # set bus_extraction_style {%s[%d:%d]} +#@ +#@ ##[wjchen] 2006/08/24 +#@ #set edifin_autoconnect_offpageconnectors "false" +#@ #set edifin_autoconnect_ports "false" +#@ #set edifin_dc_script_flag "" +#@ #set edifin_delete_empty_cells "true" +#@ #set edifin_delete_ripper_cells "true" +#@ #set edifin_ground_net_name "" +#@ #set edifin_ground_net_property_name "" +#@ #set edifin_ground_net_property_value "" +#@ #set edifin_ground_port_name "" +#@ #set edifin_instance_property_name "" +#@ #set edifin_portinstance_disabled_property_name "" +#@ #set edifin_portinstance_disabled_property_value "" +#@ #set edifin_portinstance_property_name "" +#@ #set edifin_power_net_name "" +#@ #set edifin_power_net_property_name "" +#@ #set edifin_power_net_property_value "" +#@ #set edifin_power_port_name "" +#@ #set edifin_use_identifier_in_rename "false" +#@ #set edifin_view_identifier_property_name "" +#@ #set edifin_lib_logic_1_symbol "" +#@ #set edifin_lib_logic_0_symbol "" +#@ #set edifin_lib_in_port_symbol "" +#@ #set edifin_lib_out_port_symbol "" +#@ #set edifin_lib_inout_port_symbol "" +#@ #set edifin_lib_in_osc_symbol "" +#@ #set edifin_lib_out_osc_symbol "" +#@ #set edifin_lib_inout_osc_symbol "" +#@ #set edifin_lib_mentor_netcon_symbol "" +#@ #set edifin_lib_ripper_bits_property "" +#@ #set edifin_lib_ripper_bus_end "" +#@ #set edifin_lib_ripper_cell_name "" +#@ #set edifin_lib_ripper_view_name "" +#@ #set edifin_lib_route_grid 1024 +#@ #set edifin_lib_templates {} +#@ #set edifout_dc_script_flag "" +#@ #set edifout_design_name "Synopsys_edif" +#@ #set edifout_designs_library_name "DESIGNS" +#@ #set edifout_display_instance_names "false" +#@ #set edifout_display_net_names "false" +#@ #set edifout_external "true" +#@ #set edifout_external_graphic_view_name "Graphic_representation" +#@ #set edifout_external_netlist_view_name "Netlist_representation" +#@ #set edifout_external_schematic_view_name "Schematic_representation" +#@ #set edifout_ground_name "logic_0" +#@ #set edifout_ground_net_name "" +#@ #set edifout_ground_net_property_name "" +#@ #set edifout_ground_net_property_value "" +#@ #set edifout_ground_pin_name "logic_0_pin" +#@ #set edifout_ground_port_name "GND" +#@ #set edifout_instance_property_name "" +#@ #set edifout_instantiate_ports "false" +#@ #set edifout_library_graphic_view_name "Graphic_representation" +#@ #set edifout_library_netlist_view_name "Netlist_representation" +#@ #set edifout_library_schematic_view_name "Schematic_representation" +#@ #set edifout_merge_libraries "false" +#@ #set edifout_multidimension_arrays "false" +#@ #set edifout_name_oscs_different_from_ports "false" +#@ #set edifout_name_rippers_same_as_wires "false" +#@ #set edifout_netlist_only "false" +#@ #set edifout_no_array "false" +#@ #set edifout_numerical_array_members "false" +#@ #set edifout_pin_direction_in_value "" +#@ #set edifout_pin_direction_inout_value "" +#@ #set edifout_pin_direction_out_value "" +#@ #set edifout_pin_direction_property_name "" +#@ #set edifout_pin_name_property_name "" +#@ #set edifout_portinstance_disabled_property_name "" +#@ #set edifout_portinstance_disabled_property_value "" +#@ #set edifout_portinstance_property_name "" +#@ #set edifout_power_and_ground_representation "cell" +#@ #set edifout_power_name "logic_1" +#@ #set edifout_power_net_name "" +#@ #set edifout_power_net_property_name "" +#@ #set edifout_power_net_property_value "" +#@ #set edifout_power_pin_name "logic_1_pin" +#@ #set edifout_power_port_name "VDD" +#@ #set edifout_skip_port_implementations "false" +#@ #set edifout_target_system "" +#@ #set edifout_top_level_symbol "true" +#@ #set edifout_translate_origin "" +#@ #set edifout_unused_property_value "" +#@ #set edifout_write_attributes "false" +#@ #set edifout_write_constraints "false" +#@ #set edifout_write_properties_list {} +#@ #set read_name_mapping_nowarn_libraries {} +#@ #set write_name_mapping_nowarn_libraries {} +#@ +#@ # +#@ # Hdl and Vhdlio Variable Groups: +#@ # +#@ # These variables are for controlling hdl reading, writing, +#@ # and optimizing. +#@ # +#@ set hdlin_enable_upf_compatible_naming "FALSE" +#@ set hdlin_auto_save_templates "FALSE" +#@ set hdlin_generate_naming_style "%s_%d" +#@ set hdlin_enable_relative_placement "rb" +#@ set hdlin_mux_rp_limit "128x4" +#@ set hdlin_generate_separator_style "_" +#@ set hdlin_ignore_textio_constructs "TRUE" +#@ set hdlin_infer_function_local_latches "FALSE" +#@ set hdlin_keep_signal_name "all_driving" +#@ set hdlin_module_arch_name_splitting "FALSE" +#@ set hdlin_preserve_sequential "none" +#@ set hdlin_presto_net_name_prefix "N" +#@ set hdlin_presto_cell_name_prefix "C" +#@ set hdlin_strict_verilog_reader "FALSE" +#@ set hdlin_prohibit_nontri_multiple_drivers "TRUE" +#@ if { $synopsys_program_name == "de_shell" } { +#@ set hdlin_elab_errors_deep "TRUE" +#@ } else { +#@ set hdlin_elab_errors_deep "FALSE" +#@ } +#@ set hdlin_mux_size_min 2 +#@ set hdlin_subprogram_default_values "FALSE" +#@ set hdlin_field_naming_style "" +#@ set hdlin_upcase_names "FALSE" +#@ set hdlin_sv_union_member_naming "FALSE" +#@ set hdlin_enable_hier_map "FALSE" +#@ set hdlin_sv_interface_only_modules "" +#@ set hdlin_sv_enable_rtl_attributes "FALSE" +#@ set hdlin_vhdl_std 2008 +#@ set hdlin_vhdl93_concat "TRUE" +#@ set hdlin_vhdl_syntax_extensions "FALSE" +#@ set hdlin_analyze_verbose_mode 0 +#@ set hdlin_report_sequential_pruning "FALSE" +#@ set hdlin_vrlg_std 2005 +#@ set hdlin_sverilog_std 2012 +#@ set hdlin_while_loop_iterations 4096 +#@ set hdlin_reporting_level "basic" +#@ set hdlin_autoread_verilog_extensions ".v" +#@ set hdlin_autoread_sverilog_extensions ".sv .sverilog" +#@ set hdlin_autoread_vhdl_extensions ".vhd .vhdl" +#@ set hdlin_autoread_exclude_extensions "" +#@ +#@ set bus_minus_style "-%d" +#@ set hdlin_latch_always_async_set_reset FALSE +#@ set hdlin_ff_always_sync_set_reset FALSE +#@ set hdlin_ff_always_async_set_reset TRUE +#@ set hdlin_check_input_netlist FALSE +#@ set hdlin_check_no_latch FALSE +#@ set hdlin_mux_for_array_read_sparseness_limit 90 +#@ set hdlin_infer_mux "default" +#@ set hdlin_mux_oversize_ratio 100 +#@ set hdlin_mux_size_limit 32 +#@ set hdlin_mux_size_only 1 +#@ set hdlin_infer_multibit "default_none" +#@ set hdlin_enable_rtldrc_info "false" +#@ set hdlin_interface_port_ABI 3 +#@ set hdlin_shorten_long_module_name "false" +#@ set hdlin_module_name_limit 256 +#@ set hdlin_enable_assertions "FALSE" +#@ set hdlin_enable_configurations "FALSE" +#@ set hdlin_sv_blackbox_modules "" +#@ set hdlin_sv_tokens "FALSE" +#@ set hdlin_sv_packages "enable" +#@ set hdlin_verification_priority "FALSE" +#@ set hdlin_enable_elaborate_ref_linking "FALSE" +#@ set hdlin_enable_hier_naming "FALSE" +#@ set hdlin_enable_elaborate_update "true" +#@ set hdlin_vhdl_mixed_language_instantiation "FALSE" +#@ set hdl_preferred_license "" +#@ set hdl_keep_licenses "true" +#@ set hlo_resource_allocation "constraint_driven" +#@ set sdfout_top_instance_name "" +#@ set sdfout_time_scale 1.0 +#@ set sdfout_min_rise_net_delay 0. +#@ set sdfout_min_fall_net_delay 0. +#@ set sdfout_min_rise_cell_delay 0. +#@ set sdfout_min_fall_cell_delay 0. +#@ set sdfout_write_to_output "false" +#@ set sdfout_allow_non_positive_constraints "false" +#@ set sdfin_top_instance_name "" +#@ set sdfin_min_rise_net_delay 0. +#@ set sdfin_min_fall_net_delay 0. +#@ set sdfin_min_rise_cell_delay 0. +#@ set sdfin_min_fall_cell_delay 0. +#@ set sdfin_rise_net_delay_type "maximum" +#@ set sdfin_fall_net_delay_type "maximum" +#@ set sdfin_rise_cell_delay_type "maximum" +#@ set sdfin_fall_cell_delay_type "maximum" +#@ set site_info_file ${synopsys_root}/admin/license/site_info +#@ if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ alias site_info sh cat $site_info_file +#@ } else { +#@ alias site_info "sh cat site_info_file" +#@ } +#@ set template_naming_style "%s_%p" +#@ set template_parameter_style "%s%d" +#@ set template_separator_style "_" +#@ set verilogout_equation "false" +#@ set verilogout_ignore_case "false" +#@ set verilogout_no_tri "false" +#@ set verilogout_inout_is_in "false" +#@ set verilogout_single_bit "false" +#@ set verilogout_higher_designs_first "FALSE" +#@ # set verilogout_levelize "FALSE" +#@ set verilogout_include_files {} +#@ set verilogout_unconnected_prefix "SYNOPSYS_UNCONNECTED_" +#@ set verilogout_show_unconnected_pins "FALSE" +#@ set verilogout_no_negative_index "FALSE" +#@ #set enable_2003.03_verilog_reader TRUE +#@ # to have a net instead of 1'b0 and 1'b1 in inouts: +#@ set verilogout_indirect_inout_connection "FALSE" +#@ +#@ # set vhdlout_architecture_name "SYN_%a_%u" +#@ set vhdlout_bit_type "std_logic" +#@ # set vhdlout_bit_type_resolved "TRUE" +#@ set vhdlout_bit_vector_type "std_logic_vector" +#@ # set vhdlout_conversion_functions {} +#@ # set vhdlout_dont_write_types "FALSE" +#@ set vhdlout_equations "FALSE" +#@ set vhdlout_one_name "'1'" +#@ set vhdlout_package_naming_style "CONV_PACK_%d" +#@ set vhdlout_preserve_hierarchical_types "VECTOR" +#@ set vhdlout_separate_scan_in "FALSE" +#@ set vhdlout_single_bit "USER" +#@ set vhdlout_target_simulator "" +#@ set vhdlout_three_state_name "'Z'" +#@ set vhdlout_three_state_res_func "" +#@ # set vhdlout_time_scale 1.0 +#@ set vhdlout_top_configuration_arch_name "A" +#@ set vhdlout_top_configuration_entity_name "E" +#@ set vhdlout_top_configuration_name "CFG_TB_E" +#@ set vhdlout_unknown_name "'X'" +#@ set vhdlout_upcase "FALSE" +#@ set vhdlout_use_packages {IEEE.std_logic_1164} +#@ set vhdlout_wired_and_res_func "" +#@ set vhdlout_wired_or_res_func "" +#@ set vhdlout_write_architecture "TRUE" +#@ set vhdlout_write_components "TRUE" +#@ set vhdlout_write_entity "TRUE" +#@ set vhdlout_write_top_configuration "FALSE" +#@ # set vhdlout_synthesis_off "TRUE" +#@ set vhdlout_zero_name "'0'" +#@ #set vhdlout_levelize "FALSE" +#@ set vhdlout_dont_create_dummy_nets "FALSE" +#@ set vhdlout_follow_vector_direction "TRUE" +#@ +#@ +#@ # vhdl netlist reader variables +#@ set enable_vhdl_netlist_reader "FALSE" +#@ +#@ # variables pertaining to VHDL library generation +#@ set vhdllib_timing_mesg "true" +#@ set vhdllib_timing_xgen "false" +#@ set vhdllib_timing_checks "true" +#@ set vhdllib_negative_constraint "false" +#@ set vhdllib_glitch_handle "true" +#@ set vhdllib_pulse_handle "use_vhdllib_glitch_handle" +#@ # /*vhdllib_architecture = {FTBM, UDSM, FTSM, FTGS, VITAL}; */ +#@ set vhdllib_architecture {VITAL} +#@ set vhdllib_tb_compare 0 +#@ set vhdllib_tb_x_eq_dontcare FALSE +#@ set vhdllib_logic_system "ieee-1164" +#@ set vhdllib_logical_name "" +#@ +#@ # variables pertaining to technology library processing +#@ set read_db_lib_warnings FALSE +#@ set read_translate_msff TRUE +#@ set libgen_max_differences -1 +#@ +#@ # +#@ # Gui Variable Group +#@ # used for design_vision and psyn_gui +#@ # +#@ set gui_auto_start 0 +#@ set gui_start_option_no_windows 0 +#@ group_variable gui_variables "gui_auto_start" +#@ group_variable gui_variables "gui_start_option_no_windows" +#@ +#@ # +#@ # If you like emacs, uncomment the next line +#@ # set text_editor_command "emacs -fn 8x13 %s &" ; +#@ +#@ # You can delete pairs from this list, but you can't add new ones +#@ # unless you also update the UIL files. So, customers can not add +#@ # dialogs to this list, only Synopsys can do that. +#@ # +#@ set view_independent_dialogs { "test_report" " Test Reports " "report_print" " Report " "report_options" " Report Options " "report_win" " Report Output " "manual_page" " Manual Page " } +#@ +#@ # if color Silicon Graphics workstation +#@ if { [info exists x11_vendor_string] && [info exists x11_is_color]} { +#@ if { $x11_vendor_string == "Silicon" && $x11_is_color == "true" } { +#@ set x11_set_cursor_foreground "magenta" +#@ set view_use_small_cursor "true" +#@ set view_set_selecting_color "white" +#@ } +#@ } +#@ +#@ # if running on an Apollo machine +#@ set found_x11_vendor_string_apollo 0 +#@ set found_arch_apollo 0 +#@ if { [info exists x11_vendor_string]} { +#@ if { $x11_vendor_string == "Apollo "} { +#@ set found_x11_vendor_string_apollo 1 +#@ } +#@ } +#@ if { [info exists arch]} { +#@ if { $arch == "apollo"} { +#@ set found_arch_apollo 1 +#@ } +#@ } +#@ if { $found_x11_vendor_string_apollo == 1 || $found_arch_apollo == 1} { +#@ set enable_page_mode "false" +#@ } else { +#@ set enable_page_mode "true" +#@ } +#@ +#@ # don't work around this bug on the Apollo +#@ if { $found_x11_vendor_string_apollo == 1} { +#@ set view_extend_thick_lines "false" +#@ } else { +#@ set view_extend_thick_lines "true" +#@ } +#@ +#@ # +#@ # Suffix Variable Group: +#@ # +#@ # Suffixes recognized by the Design Analyzer menu in file choices +#@ # +#@ if { $synopsys_program_name == "design_vision" || $synopsys_program_name == "psyn_gui" } { +#@ # For star 93040 do NOT include NET in list, 108991 : pdb suffix added +#@ set view_read_file_suffix {db gdb sdb pdb edif eqn fnc lsi mif pla st tdl v vhd vhdl xnf} +#@ } else { +#@ set view_read_file_suffix {db gdb sdb edif eqn fnc lsi mif NET pla st tdl v vhd vhdl xnf} +#@ } +#@ +#@ set view_analyze_file_suffix {v vhd vhdl} +#@ set view_write_file_suffix {gdb db sdb do edif eqn fnc lsi NET neted pla st tdl v vhd vhdl xnf} +#@ set view_execute_script_suffix {.script .scr .dcs .dcv .dc .con} +#@ set view_arch_types {sparcOS5 hpux10 rs6000 sgimips} +#@ +#@ # +#@ # links_to_layout Variable Group: +#@ # +#@ # These variables affect the read_timing, write_timing +#@ # set_annotated_delay, compile, create_wire_load and reoptimize_design +#@ # commands. +#@ # +#@ if {$synopsys_program_name != "dc_sms_shell"} { +#@ set auto_wire_load_selection "true" +#@ set compile_create_wire_load_table "false" +#@ } +#@ set rtl_load_resistance_factor 0.0 +#@ +#@ # power Variable Group: +#@ # +#@ # These variables affect the behavior of power optimization and analysis. +#@ # +#@ +#@ set power_keep_license_after_power_commands "false" +#@ set power_rtl_saif_file "power_rtl.saif" +#@ set power_sdpd_saif_file "power_sdpd.saif" +#@ set power_preserve_rtl_hier_names "false" +#@ set power_do_not_size_icg_cells "true" +#@ set power_hdlc_do_not_split_cg_cells "false" +#@ set power_cg_flatten "false" +#@ set power_opto_extra_high_dynamic_power_effort "false" +#@ set power_default_static_probability 0.5 +#@ set power_default_toggle_rate 0.1 +#@ set power_default_toggle_rate_type "fastest_clock" +#@ set power_model_preference "nlpm" +#@ set power_sa_propagation_effort "low" +#@ set power_sa_propagation_verbose "false" +#@ set power_fix_sdpd_annotation "true" +#@ set power_fix_sdpd_annotation_verbose "false" +#@ set power_sdpd_message_tolerance 0.00001 +#@ set do_operand_isolation "false" +#@ set power_cg_module_naming_style "" +#@ set power_cg_cell_naming_style "" +#@ set power_cg_gated_clock_net_naming_style "" +#@ set power_rclock_use_asynch_inputs "false" +#@ set power_rclock_inputs_use_clocks_fanout "true" +#@ set power_rclock_unrelated_use_fastest "true" +#@ set power_lib2saif_rise_fall_pd "false" +#@ set power_min_internal_power_threshold "" +#@ +#@ +#@ # SystemC related variables +#@ set systemcout_levelize "true" +#@ set systemcout_debug_mode "false" +#@ +#@ # ACS Variables +#@ if { [info exists acs_work_dir] } { +#@ set acs_area_report_suffix "area" +#@ set acs_autopart_max_area "0.0" +#@ set acs_autopart_max_percent "0.0" +#@ set acs_budgeted_cstr_suffix "con" +#@ set acs_compile_script_suffix "autoscr" +#@ set acs_constraint_file_suffix "con" +#@ set acs_cstr_report_suffix "cstr" +#@ set acs_db_suffix "db" +#@ set acs_dc_exec "" +#@ set acs_default_pass_name "pass" +#@ set acs_exclude_extensions {} +#@ set acs_exclude_list [list $synopsys_root] +#@ set acs_global_user_compile_strategy_script "default" +#@ set acs_hdl_verilog_define_list {} +#@ set acs_hdl_source {} +#@ set acs_lic_wait 0 +#@ set acs_log_file_suffix "log" +#@ set acs_make_args "set acs_make_args" +#@ set acs_make_exec "gmake" +#@ set acs_makefile_name "Makefile" +#@ set acs_num_parallel_jobs 1 +#@ set acs_override_report_suffix "report" +#@ set acs_override_script_suffix "scr" +#@ set acs_qor_report_suffix "qor" +#@ set acs_timing_report_suffix "tim" +#@ set acs_use_autopartition "false" +#@ set acs_use_default_delays "false" +#@ set acs_user_budgeting_script "budget.scr" +#@ set acs_user_compile_strategy_script_suffix "compile" +#@ set acs_verilog_extensions {.v} +#@ set acs_vhdl_extensions {.vhd} +#@ set acs_work_dir [pwd] +#@ set check_error_list [list CMD-004 CMD-006 CMD-007 CMD-008 CMD-009 CMD-010 CMD-011 CMD-012 CMD-014 CMD-015 CMD-016 CMD-019 CMD-026 CMD-031 CMD-037 DB-1 DCSH-11 DES-001 ACS-193 FILE-1 FILE-2 FILE-3 FILE-4 LINK-7 LINT-7 LINT-20 LNK-023 OPT-100 OPT-101 OPT-102 OPT-114 OPT-124 OPT-127 OPT-128 OPT-155 OPT-157 OPT-181 OPT-462 UI-11 UI-14 UI-15 UI-16 UI-17 UI-19 UI-20 UI-21 UI-22 UI-23 UI-40 UI-41 UID-4 UID-6 UID-7 UID-8 UID-9 UID-13 UID-14 UID-15 UID-19 UID-20 UID-25 UID-27 UID-28 UID-29 UID-30 UID-32 UID-58 UID-87 UID-103 UID-109 UID-270 UID-272 UID-403 UID-440 UID-444 UIO-2 UIO-3 UIO-4 UIO-25 UIO-65 UIO-66 UIO-75 UIO-94 UIO-95 EQN-6 EQN-11 EQN-15 EQN-16 EQN-18 EQN-20 ] +#@ set ilm_preserve_core_constraints "false" +#@ } +#@ +#@ # +#@ # +#@ # DesignTime Variable Group +#@ # +#@ # The variables which affect the DesignTime timing engine +#@ # +#@ +#@ set case_analysis_log_file "" +#@ set case_analysis_sequential_propagate "false" +#@ set create_clock_no_input_delay "false" +#@ set disable_auto_time_borrow "false" +#@ set disable_case_analysis "false" +#@ set disable_conditional_mode_analysis "false" +#@ set disable_library_transition_degradation "false" +#@ set dont_bind_unused_pins_to_logic_constant "false" +#@ set enable_slew_degradation "true" +#@ set high_fanout_net_pin_capacitance 1.000000 +#@ set high_fanout_net_threshold 1000 +#@ set lib_thresholds_per_lib "true" +#@ set rc_adjust_rd_when_less_than_rnet "true" +#@ set rc_ceff_delay_min_diff_ps 0.250000 +#@ set rc_degrade_min_slew_when_rd_less_than_rnet "false" +#@ set rc_driver_model_max_error_pct 0.160000 +#@ set rc_filter_rd_less_than_rnet "true" +#@ set rc_input_threshold_pct_fall 50.000000 +#@ set rc_input_threshold_pct_rise 50.000000 +#@ set rc_output_threshold_pct_fall 50.000000 +#@ set rc_output_threshold_pct_rise 50.000000 +#@ set rc_rd_less_than_rnet_threshold 0.450000 +#@ set rc_slew_derate_from_library 1.000000 +#@ set rc_slew_lower_threshold_pct_fall 20.000000 +#@ set rc_slew_lower_threshold_pct_rise 20.000000 +#@ set rc_slew_upper_threshold_pct_fall 80.000000 +#@ set rc_slew_upper_threshold_pct_rise 80.000000 +#@ set timing_disable_cond_default_arcs "false" +#@ #timing_enable_multiple_clocks_per_reg is on by default +#@ #set timing_enable_multiple_clocks_per_reg "false" +#@ set timing_report_attributes {dont_touch dont_use map_only size_only ideal_net infeasible_paths} +#@ set timing_self_loops_no_skew "false" +#@ set when_analysis_permitted "true" +#@ set when_analysis_without_case_analysis "false" +#@ +#@ +#@ # +#@ # Variable Group Definitions: +#@ # +#@ # The group_variable() command groups variables for display +#@ # in the "File/Defaults" dialog and defines groups of variables +#@ # for the list() command. +#@ # +#@ +#@ set enable_instances_in_report_net "true" +#@ # Set report options env variables +#@ set view_report_interactive "true" +#@ set view_report_output2file "false" +#@ set view_report_append "true" +#@ +#@ if { $synopsys_program_name != "ptxr" } { +#@ +#@ group_variable report_variables "enable_instances_in_report_net" +#@ group_variable report_variables "view_report_interactive" +#@ group_variable report_variables "view_report_output2file" +#@ group_variable report_variables "view_report_append" +#@ +#@ # "links_to_layout" variables are used by multiple commands +#@ # auto_wire_load_selection is also in the "compile" variable group. +#@ group_variable links_to_layout "auto_wire_load_selection" +#@ +#@ # variables starting with "compile" are also in the compile variable group +#@ group_variable links_to_layout "compile_dont_touch_annotated_cell_during_inplace_opt" +#@ +#@ group_variable links_to_layout "compile_update_annotated_delays_during_inplace_opt" +#@ group_variable links_to_layout "compile_create_wire_load_table" +#@ +#@ group_variable links_to_layout "reoptimize_design_changed_list_file_name" +#@ group_variable links_to_layout "sdfout_allow_non_positive_constraints" +#@ +#@ } ;# $synopsys_program_name != "ptxr" +#@ +#@ # +#@ # to find the XErrorDB and XKeySymDB for X11 file +#@ set motif_files ${synopsys_root}/admin/setup +#@ # set filename for logging input file +#@ set filename_log_file "filenames.log" +#@ # whether to delete the filename log after the normal exits +#@ set exit_delete_filename_log_file "true" +#@ +#@ # executable to fire off RTLA/BCV +#@ set xterm_executable "xterm" +#@ +#@ if { $synopsys_program_name != "ptxr" } { +#@ +#@ # "system" variables are used by multiple commands +#@ group_variable system auto_link_disable +#@ group_variable system auto_link_options +#@ group_variable system command_log_file +#@ group_variable system company +#@ group_variable system compatibility_version +#@ +#@ if { [string compare $dc_shell_mode "default"] == 0 } { +#@ group_variable system "current_design" +#@ group_variable system "current_instance" +#@ group_variable system "dc_shell_status" +#@ } else { +#@ set current_design "" +#@ set current_instance "" +#@ group_variable system "current_design" +#@ group_variable system "current_instance" +#@ } +#@ +#@ group_variable system "designer" +#@ group_variable system "echo_include_commands" +#@ group_variable system "enable_page_mode" +#@ group_variable system "change_names_update_inst_tree" +#@ group_variable system "change_names_dont_change_bus_members" +#@ group_variable system "default_name_rules" +#@ group_variable system "verbose_messages" +#@ group_variable system "link_library" +#@ group_variable system "link_force_case" +#@ group_variable system "search_path" +#@ group_variable system "synthetic_library" +#@ group_variable system "target_library" +#@ group_variable system "uniquify_naming_style" +#@ group_variable system "suppress_errors" +#@ group_variable system "find_converts_name_lists" +#@ group_variable system "filename_log_file" +#@ group_variable system "exit_delete_filename_log_file" +#@ group_variable system "syntax_check_status" +#@ group_variable system "context_check_status" +#@ +#@ #/* "compile" variables are used by the compile command */ +#@ group_variable compile "compile_assume_fully_decoded_three_state_busses" +#@ group_variable compile "compile_no_new_cells_at_top_level" +#@ group_variable compile "compile_dont_touch_annotated_cell_during_inplace_opt" +#@ group_variable compile "reoptimize_design_changed_list_file_name" +#@ group_variable compile "compile_create_wire_load_table" +#@ group_variable compile "compile_update_annotated_delays_during_inplace_opt" +#@ group_variable compile "compile_instance_name_prefix" +#@ group_variable compile "compile_instance_name_suffix" +#@ group_variable compile "compile_negative_logic_methodology" +#@ group_variable compile "compile_disable_hierarchical_inverter_opt" +#@ +#@ group_variable compile "port_complement_naming_style" +#@ group_variable compile "auto_wire_load_selection" +#@ group_variable compile "rtl_load_resistance_factor" +#@ group_variable compile "compile_implementation_selection" +#@ group_variable compile "compile_use_low_timing_effort" +#@ group_variable compile "compile_fix_cell_degradation" +#@ group_variable compile "compile_preserve_subdesign_interfaces" +#@ group_variable compile "compile_enable_constant_propagation_with_no_boundary_opt" +#@ group_variable compile "compile_delete_unloaded_sequential_cells" +#@ group_variable compile "enable_recovery_removal_arcs" +#@ group_variable compile "compile_checkpoint_phases" +#@ group_variable compile "compile_cpu_limit" +#@ group_variable compile "compile_top_all_paths" +#@ group_variable compile "compile_top_all_paths" +#@ group_variable compile "compile_top_acs_partition" +#@ group_variable compile "default_port_connection_class" +#@ group_variable compile "compile_retime_license_behavior" +#@ group_variable compile "dont_touch_nets_with_size_only_cells" +#@ group_variable compile "compile_seqmap_no_scan_cell" +#@ +#@ if { $synopsys_program_name == "dc_shell" && [shell_is_in_topographical_mode] } { +#@ group_variable compile "dct_prioritize_area_correlation" +#@ group_variable compile "compile_error_on_missing_physical_cells" +#@ } +#@ +#@ # "multibit" variables are used by the the multibit mapping functionality +#@ +#@ group_variable multibit "bus_multiple_separator_style" +#@ +#@ # "ilm" variables are used by Interface Logic Model functionality +#@ +#@ group_variable ilm "ilm_ignore_percentage" +#@ +#@ # "estimate" variables are used by the estimate command +#@ # The estimate command also recognizes the "compile" variables. +#@ group_variable estimate "estimate_resource_preference" +#@ +#@ # "synthetic_library" variables +#@ group_variable synlib "cache_dir_chmod_octal" +#@ group_variable synlib "cache_file_chmod_octal" +#@ group_variable synlib "cache_read" +#@ group_variable synlib "cache_read_info" +#@ group_variable synlib "cache_write" +#@ group_variable synlib "cache_write_info" +#@ group_variable synlib "synlib_dont_get_license" +#@ group_variable synlib "synlib_wait_for_design_license" +#@ group_variable synlib "synthetic_library" +#@ +#@ # "insert_dft" variables are used by the insert_dft and preview_dft commands +#@ #group_variable insert_dft "test_default_client_order" +#@ group_variable insert_dft "insert_dft_clean_up" +#@ group_variable insert_dft "insert_test_design_naming_style" +#@ group_variable insert_dft "test_clock_port_naming_style" +#@ group_variable insert_dft "test_default_min_fault_coverage" +#@ group_variable insert_dft "test_scan_clock_a_port_naming_style" +#@ group_variable insert_dft "test_scan_clock_b_port_naming_style" +#@ group_variable insert_dft "test_scan_clock_port_naming_style" +#@ group_variable insert_dft "test_scan_enable_inverted_port_naming_style" +#@ group_variable insert_dft "test_scan_enable_port_naming_style" +#@ group_variable insert_dft "test_scan_in_port_naming_style" +#@ group_variable insert_dft "test_scan_out_port_naming_style" +#@ group_variable insert_dft "test_non_scan_clock_port_naming_style" +#@ group_variable insert_dft "test_dedicated_subdesign_scan_outs" +#@ group_variable insert_dft "test_disable_find_best_scan_out" +#@ group_variable insert_dft "test_dont_fix_constraint_violations" +#@ group_variable insert_dft "test_isolate_hier_scan_out" +#@ group_variable insert_dft "test_mode_port_naming_style" +#@ group_variable insert_dft "test_mode_port_inverted_naming_style" +#@ group_variable insert_dft "compile_dont_use_dedicated_scanout" +#@ group_variable insert_dft "test_mux_constant_si" +#@ +#@ # "preview_scan" variables are used by the preview_scan command +#@ group_variable preview_scan "test_preview_scan_shows_cell_types" +#@ group_variable preview_scan "test_scan_link_so_lockup_key" +#@ group_variable preview_scan "test_scan_link_wire_key" +#@ group_variable preview_scan "test_scan_segment_key" +#@ group_variable preview_scan "test_scan_true_key" +#@ +#@ # "bsd" variables are used by the check_bsd and write_bsdl commands +#@ group_variable bsd "test_user_test_data_register_naming_style" +#@ group_variable bsd "test_user_defined_instruction_naming_style" +#@ group_variable bsd "test_bsdl_default_suffix_name" +#@ group_variable bsd "test_bsdl_max_line_length" +#@ group_variable bsd "test_cc_ir_masked_bits" +#@ group_variable bsd "test_cc_ir_value_of_masked_bits" +#@ +#@ group_variable bsd "test_bsd_allow_tolerable_violations" +#@ group_variable bsd "test_bsd_optimize_control_cell" +#@ group_variable bsd "test_bsd_control_cell_drive_limit" +#@ group_variable bsd "test_bsd_manufacturer_id" +#@ group_variable bsd "test_bsd_part_number" +#@ group_variable bsd "test_bsd_version_number" +#@ group_variable bsd "bsd_max_in_switching_limit" +#@ group_variable bsd "bsd_max_out_switching_limit" +#@ +#@ # testmanager variables +#@ group_variable testmanager "multi_pass_test_generation" +#@ +#@ # "testsim" variables +#@ # group_variable testsim "testsim_print_stats_file" +#@ +#@ # "test" variables +#@ group_variable test "test_default_bidir_delay" +#@ group_variable test "test_default_delay" +#@ group_variable test "test_default_period" +#@ group_variable test "test_default_strobe" +#@ group_variable test "test_default_strobe_width" +#@ group_variable test "test_capture_clock_skew" +#@ group_variable test "test_allow_clock_reconvergence" +#@ group_variable test "test_check_port_changes_in_capture" +#@ group_variable test "test_stil_max_line_length" +#@ group_variable test "test_infer_slave_clock_pulse_after_capture" +#@ group_variable test "test_rtldrc_latch_check_style" +#@ group_variable test "test_enable_capture_checks" +#@ +#@ # "write_test" variables are used by the write_test command +#@ group_variable write_test "write_test_formats" +#@ group_variable write_test "write_test_include_scan_cell_info" +#@ group_variable write_test "write_test_input_dont_care_value" +#@ group_variable write_test "write_test_max_cycles" +#@ group_variable write_test "write_test_max_scan_patterns" +#@ group_variable write_test "write_test_pattern_set_naming_style" +#@ group_variable write_test "write_test_scan_check_file_naming_style" +#@ group_variable write_test "write_test_vector_file_naming_style" +#@ group_variable write_test "write_test_round_timing_values" +#@ +#@ group_variable view "test_design_analyzer_uses_insert_scan" +#@ +#@ # "io" variables are used by the read, read_lib, db2sge and write commands +#@ group_variable io "bus_inference_descending_sort" +#@ group_variable io "bus_inference_style" +#@ #group_variable io "db2sge_output_directory" +#@ #group_variable io "db2sge_scale" +#@ #group_variable io "db2sge_overwrite" +#@ #group_variable io "db2sge_display_symbol_names" +#@ #group_variable io "db2sge_display_pin_names" +#@ #group_variable io "db2sge_display_instance_names" +#@ #group_variable io "db2sge_use_bustaps" +#@ #group_variable io "db2sge_use_compound_names" +#@ #group_variable io "db2sge_bit_type" +#@ #group_variable io "db2sge_bit_vector_type" +#@ #group_variable io "db2sge_one_name" +#@ #group_variable io "db2sge_zero_name" +#@ #group_variable io "db2sge_unknown_name" +#@ #group_variable io "db2sge_target_xp" +#@ #group_variable io "db2sge_tcf_package_file" +#@ #group_variable io "db2sge_use_lib_section" +#@ #group_variable io "db2sge_script" +#@ #group_variable io "db2sge_command" +#@ +#@ # group_variable io "equationout_and_sign" +#@ # group_variable io "equationout_or_sign" +#@ # group_variable io "equationout_postfix_negation" +#@ +#@ # group_variable io "lsiin_net_name_prefix" +#@ # group_variable io "lsiout_inverter_cell" +#@ # group_variable io "lsiout_upcase" +#@ +#@ #group_variable io "mentor_bidirect_value" +#@ #group_variable io "mentor_do_path" +#@ #group_variable io "mentor_input_output_property_name" +#@ #group_variable io "mentor_input_value" +#@ #group_variable io "mentor_logic_one_value" +#@ #group_variable io "mentor_logic_zero_one_property_name" +#@ #group_variable io "mentor_logic_zero_value" +#@ #group_variable io "mentor_output_value" +#@ #group_variable io "mentor_primitive_property_name" +#@ #group_variable io "mentor_primitive_property_value" +#@ #group_variable io "mentor_reference_property_name" +#@ #group_variable io "mentor_search_path" +#@ #group_variable io "mentor_write_symbols" +#@ # group_variable io "pla_read_create_flip_flop" +#@ # group_variable io "tdlout_upcase" +#@ group_variable io "write_name_nets_same_as_ports" +#@ +#@ # # [wjchen] 2006/08/14: The following 4 variables are obsoleted for DC simpilification. +#@ +#@ # group_variable io "xnfout_constraints_per_endpoint" +#@ # group_variable io "xnfout_default_time_constraints" +#@ # group_variable io "xnfout_clock_attribute_style" +#@ # group_variable io "xnfout_library_version" +#@ +#@ # # [wjchen] 2006/08/11: The following 8 variables are obsoleted for DC simpilification. +#@ # group_variable io "xnfin_family" +#@ # group_variable io "xnfin_ignore_pins" +#@ # group_variable io "xnfin_dff_reset_pin_name" +#@ # group_variable io "xnfin_dff_set_pin_name" +#@ # group_variable io "xnfin_dff_clock_enable_pin_name" +#@ # group_variable io "xnfin_dff_data_pin_name" +#@ # group_variable io "xnfin_dff_clock_pin_name" ; +#@ # group_variable io "xnfin_dff_q_pin_name"; +#@ +#@ group_variable io "sdfin_min_rise_net_delay" ; +#@ group_variable io "sdfin_min_fall_net_delay" ; +#@ group_variable io "sdfin_min_rise_cell_delay" ; +#@ group_variable io "sdfin_min_fall_cell_delay" ; +#@ group_variable io "sdfin_rise_net_delay_type" ; +#@ group_variable io "sdfin_fall_net_delay_type" ; +#@ group_variable io "sdfin_rise_cell_delay_type" ; +#@ group_variable io "sdfin_fall_cell_delay_type" ; +#@ group_variable io "sdfin_top_instance_name" ; +#@ group_variable io "sdfout_time_scale" ; +#@ group_variable io "sdfout_write_to_output" ; +#@ group_variable io "sdfout_top_instance_name" ; +#@ group_variable io "sdfout_min_rise_net_delay" ; +#@ group_variable io "sdfout_min_fall_net_delay" ; +#@ group_variable io "sdfout_min_rise_cell_delay" ; +#@ group_variable io "sdfout_min_fall_cell_delay" ; +#@ group_variable io "read_db_lib_warnings" ; +#@ group_variable io "read_translate_msff" ; +#@ group_variable io "libgen_max_differences" ; +#@ +#@ # #[wjchen] 2006/08/22: The following variables are hidden for XG mode for DC simpilification. +#@ # group_variable io "read_name_mapping_nowarn_libraries" ; +#@ # group_variable io "write_name_mapping_nowarn_libraries" ; +#@ +#@ +#@ # "edif" variables are used by the EDIF format read, read_lib, write, +#@ # and write_lib commands +#@ # group_variable edif "bus_dimension_separator_style" ; +#@ # group_variable edif "bus_extraction_style" ; +#@ group_variable edif "bus_inference_descending_sort" ; +#@ group_variable edif "bus_inference_style" ; +#@ group_variable edif "bus_naming_style" ; +#@ group_variable edif "bus_range_separator_style" ; +#@ # group_variable edif "edifin_autoconnect_offpageconnectors" ; +#@ # group_variable edif "edifin_autoconnect_ports" ; +#@ # group_variable edif "edifin_delete_empty_cells" ; +#@ # group_variable edif "edifin_delete_ripper_cells" ; +#@ # group_variable edif "edifin_ground_net_name" ; +#@ # group_variable edif "edifin_ground_net_property_name" ; +#@ # group_variable edif "edifin_ground_net_property_value" ; +#@ # group_variable edif "edifin_ground_port_name" ; +#@ # group_variable edif "edifin_instance_property_name" ; +#@ # group_variable edif "edifin_portinstance_disabled_property_name" ; +#@ # group_variable edif "edifin_portinstance_disabled_property_value" ; +#@ # group_variable edif "edifin_portinstance_property_name" ; +#@ # group_variable edif "edifin_power_net_name" ; +#@ # group_variable edif "edifin_power_net_property_name" ; +#@ # group_variable edif "edifin_power_net_property_value" ; +#@ # group_variable edif "edifin_power_port_name" ; +#@ # group_variable edif "edifin_use_identifier_in_rename" ; +#@ # group_variable edif "edifin_view_identifier_property_name" ; +#@ # group_variable edif "edifin_dc_script_flag" ; +#@ # group_variable edif "edifin_lib_logic_1_symbol" ; +#@ # group_variable edif "edifin_lib_logic_0_symbol" ; +#@ # group_variable edif "edifin_lib_in_port_symbol" ; +#@ # group_variable edif "edifin_lib_out_port_symbol" ; +#@ # group_variable edif "edifin_lib_inout_port_symbol" ; +#@ # group_variable edif "edifin_lib_in_osc_symbol" ; +#@ # group_variable edif "edifin_lib_out_osc_symbol" ; +#@ # group_variable edif "edifin_lib_inout_osc_symbol" ; +#@ # group_variable edif "edifin_lib_mentor_netcon_symbol" ; +#@ # group_variable edif "edifin_lib_ripper_bits_property" ; +#@ # group_variable edif "edifin_lib_ripper_bus_end" ; +#@ # group_variable edif "edifin_lib_ripper_cell_name" ; +#@ # group_variable edif "edifin_lib_ripper_view_name" ; +#@ # group_variable edif "edifin_lib_route_grid" ; +#@ # group_variable edif "edifin_lib_templates" ; +#@ # group_variable edif "edifout_dc_script_flag" ; +#@ # group_variable edif "edifout_design_name" ; +#@ # group_variable edif "edifout_designs_library_name" ; +#@ # group_variable edif "edifout_display_instance_names" ; +#@ # group_variable edif "edifout_display_net_names" ; +#@ # group_variable edif "edifout_external" ; +#@ # group_variable edif "edifout_external_graphic_view_name" ; +#@ # group_variable edif "edifout_external_netlist_view_name" ; +#@ # group_variable edif "edifout_external_schematic_view_name" ; +#@ # group_variable edif "edifout_ground_name" ; +#@ # group_variable edif "edifout_ground_net_name" ; +#@ # group_variable edif "edifout_ground_net_property_name" ; +#@ # group_variable edif "edifout_ground_net_property_value" ; +#@ # group_variable edif "edifout_ground_pin_name" ; +#@ # group_variable edif "edifout_ground_port_name" ; +#@ # group_variable edif "edifout_instance_property_name" ; +#@ # group_variable edif "edifout_instantiate_ports" ; +#@ # group_variable edif "edifout_library_graphic_view_name" ; +#@ # group_variable edif "edifout_library_netlist_view_name" ; +#@ # group_variable edif "edifout_library_schematic_view_name" ; +#@ # group_variable edif "edifout_merge_libraries" ; +#@ # group_variable edif "edifout_multidimension_arrays" ; +#@ # group_variable edif "edifout_name_oscs_different_from_ports" ; +#@ # group_variable edif "edifout_name_rippers_same_as_wires" ; +#@ # group_variable edif "edifout_netlist_only" ; +#@ # group_variable edif "edifout_no_array" ; +#@ # group_variable edif "edifout_numerical_array_members" ; +#@ # group_variable edif "edifout_pin_direction_property_name" ; +#@ # group_variable edif "edifout_pin_direction_in_value" ; +#@ # group_variable edif "edifout_pin_direction_inout_value" ; +#@ # group_variable edif "edifout_pin_direction_out_value" ; +#@ # group_variable edif "edifout_pin_name_property_name" ; +#@ # group_variable edif "edifout_portinstance_disabled_property_name" ; +#@ # group_variable edif "edifout_portinstance_disabled_property_value" ; +#@ # group_variable edif "edifout_portinstance_property_name" +#@ # group_variable edif "edifout_power_and_ground_representation" +#@ # group_variable edif "edifout_power_name" +#@ # group_variable edif "edifout_power_net_name" +#@ # group_variable edif "edifout_power_net_property_name" +#@ # group_variable edif "edifout_power_net_property_value" +#@ # group_variable edif "edifout_power_pin_name" +#@ # group_variable edif "edifout_power_port_name" +#@ # group_variable edif "edifout_skip_port_implementations" +#@ # group_variable edif "edifout_target_system" +#@ # group_variable edif "edifout_top_level_symbol" +#@ # group_variable edif "edifout_translate_origin" +#@ # group_variable edif "edifout_unused_property_value" +#@ # group_variable edif "edifout_write_attributes" +#@ # group_variable edif "edifout_write_constraints" +#@ # group_variable edif "edifout_write_properties_list" +#@ # group_variable edif "write_name_nets_same_as_ports" +#@ +#@ # "hdl" variables are variables pertaining to hdl reading and optimizing +#@ group_variable hdl "bus_dimension_separator_style" +#@ group_variable hdl "bus_minus_style" +#@ group_variable hdl "bus_naming_style" +#@ group_variable hdl "hdlin_ignore_textio_constructs" +#@ group_variable hdl "hdlin_latch_always_async_set_reset" +#@ group_variable hdl "hdlin_ff_always_sync_set_reset" +#@ group_variable hdl "hdlin_ff_always_async_set_reset" +#@ group_variable hdl "hdlin_check_input_netlist" +#@ group_variable hdl "hdlin_check_no_latch" +#@ group_variable hdl "hdlin_reporting_level" +#@ group_variable hdl "hdlin_infer_mux" +#@ group_variable hdl "hdlin_mux_oversize_ratio" +#@ group_variable hdl "hdlin_mux_size_limit" +#@ group_variable hdl "hdlin_infer_multibit" +#@ group_variable hdl "hdl_preferred_license" +#@ group_variable hdl "hdl_keep_licenses" +#@ group_variable hdl "hlo_resource_allocation" +#@ group_variable hdl "template_naming_style" +#@ group_variable hdl "template_parameter_style" +#@ group_variable hdl "template_separator_style" +#@ group_variable hdl "verilogout_equation" +#@ group_variable hdl "verilogout_ignore_case" +#@ group_variable hdl "verilogout_no_tri" +#@ group_variable hdl "verilogout_inout_is_in" +#@ group_variable hdl "verilogout_single_bit" +#@ group_variable hdl "verilogout_higher_designs_first" +#@ # group_variable hdl "verilogout_levelize" +#@ group_variable hdl "verilogout_include_files" +#@ group_variable hdl "verilogout_unconnected_prefix" +#@ group_variable hdl "verilogout_show_unconnected_pins" +#@ group_variable hdl "verilogout_no_negative_index" +#@ group_variable hdl "hdlin_enable_rtldrc_info" +#@ group_variable hdl "hdlin_sv_blackbox_modules" +#@ group_variable hdl "hdlin_sv_enable_rtl_attributes" +#@ group_variable hdl "hdlin_enable_hier_map" +#@ group_variable hdl "hdlin_sv_interface_only_modules" +#@ group_variable hdl "hdlin_infer_function_local_latches" +#@ group_variable hdl "hdlin_module_arch_name_splitting" +#@ group_variable hdl "hdlin_mux_size_min" +#@ group_variable hdl "hdlin_prohibit_nontri_multiple_drivers" +#@ group_variable hdl "hdlin_subprogram_default_values" +#@ group_variable hdl "hdlin_upcase_names" +#@ group_variable hdl "hdlin_vhdl_std" +#@ group_variable hdl "hdlin_vhdl93_concat" +#@ group_variable hdl "hdlin_vhdl_syntax_extensions" +#@ group_variable hdl "hdlin_vrlg_std" +#@ group_variable hdl "hdlin_while_loop_iterations" +#@ group_variable hdl "hdlin_auto_save_templates" +#@ group_variable hdl "hdlin_elab_errors_deep" +#@ group_variable hdl "hdlin_enable_assertions" +#@ group_variable hdl "hdlin_enable_configurations" +#@ group_variable hdl "hdlin_field_naming_style" +#@ group_variable hdl "hdlin_generate_naming_style" +#@ group_variable hdl "hdlin_generate_separator_style" +#@ group_variable hdl "hdlin_enable_relative_placement" +#@ group_variable hdl "hdlin_mux_rp_limit" +#@ group_variable hdl "hdlin_keep_signal_name" +#@ group_variable hdl "hdlin_module_name_limit" +#@ group_variable hdl "hdlin_mux_size_only" +#@ group_variable hdl "hdlin_preserve_sequential" +#@ group_variable hdl "hdlin_presto_cell_name_prefix" +#@ group_variable hdl "hdlin_presto_net_name_prefix" +#@ group_variable hdl "hdlin_strict_verilog_reader" +#@ group_variable hdl "hdlin_shorten_long_module_name" +#@ group_variable hdl "hdlin_sv_packages" +#@ group_variable hdl "hdlin_sv_tokens" +#@ group_variable hdl "hdlin_enable_elaborate_ref_linking" +#@ group_variable hdl "hdlin_enable_hier_naming" +#@ group_variable hdl "hdlin_enable_elaborate_update" +#@ group_variable hdl "hdlin_autoread_verilog_extensions" +#@ group_variable hdl "hdlin_autoread_sverilog_extensions" +#@ group_variable hdl "hdlin_autoread_vhdl_extensions" +#@ group_variable hdl "hdlin_autoread_exclude_extensions" +#@ group_variable hdl "hdlin_enable_upf_compatible_naming" +#@ group_variable hdl "hdlin_report_sequential_pruning" +#@ group_variable hdl "hdlin_analyze_verbose_mode" +#@ +#@ # "vhdlio" variables are variables pertaining to VHDL generation +#@ group_variable vhdlio "vhdllib_timing_mesg" +#@ group_variable vhdlio "vhdllib_timing_xgen" +#@ group_variable vhdlio "vhdllib_timing_checks" +#@ group_variable vhdlio "vhdllib_negative_constraint" +#@ group_variable vhdlio "vhdllib_pulse_handle" +#@ group_variable vhdlio "vhdllib_glitch_handle" +#@ group_variable vhdlio "vhdllib_architecture" +#@ group_variable vhdlio "vhdllib_tb_compare" +#@ group_variable vhdlio "vhdllib_tb_x_eq_dontcare" +#@ group_variable vhdlio "vhdllib_logic_system" +#@ group_variable vhdlio "vhdllib_logical_name" +#@ +#@ # group_variable vhdlio "vhdlout_architecture_name" +#@ group_variable vhdlio "vhdlout_bit_type" +#@ # group_variable vhdlio "vhdlout_bit_type_resolved" +#@ group_variable vhdlio "vhdlout_bit_vector_type" +#@ # group_variable vhdlio "vhdlout_conversion_functions" +#@ # group_variable vhdlio "vhdlout_dont_write_types" +#@ group_variable vhdlio "vhdlout_equations" +#@ group_variable vhdlio "vhdlout_one_name" +#@ group_variable vhdlio "vhdlout_package_naming_style" +#@ group_variable vhdlio "vhdlout_preserve_hierarchical_types" +#@ group_variable vhdlio "vhdlout_separate_scan_in" +#@ group_variable vhdlio "vhdlout_single_bit" +#@ group_variable vhdlio "vhdlout_target_simulator" +#@ group_variable vhdlio "vhdlout_top_configuration_arch_name" +#@ group_variable vhdlio "vhdlout_top_configuration_entity_name" +#@ group_variable vhdlio "vhdlout_top_configuration_name" +#@ group_variable vhdlio "vhdlout_three_state_name" +#@ group_variable vhdlio "vhdlout_three_state_res_func" +#@ # group_variable vhdlio "vhdlout_time_scale" +#@ group_variable vhdlio "vhdlout_unknown_name" +#@ group_variable vhdlio "vhdlout_use_packages" +#@ group_variable vhdlio "vhdlout_wired_and_res_func" +#@ group_variable vhdlio "vhdlout_wired_or_res_func" +#@ group_variable vhdlio "vhdlout_write_architecture" +#@ group_variable vhdlio "vhdlout_write_entity" +#@ group_variable vhdlio "vhdlout_write_top_configuration" +#@ # group_variable vhdlio "vhdlout_synthesis_off" +#@ group_variable vhdlio "vhdlout_write_components" +#@ group_variable vhdlio "vhdlout_zero_name" +#@ # group_variable vhdlio "vhdlout_levelize" +#@ group_variable vhdlio "vhdlout_dont_create_dummy_nets" +#@ group_variable vhdlio "vhdlout_follow_vector_direction" +#@ +#@ # "suffix" variables are used to find the suffixes of different file types +#@ group_variable suffix "view_execute_script_suffix" +#@ group_variable suffix "view_read_file_suffix" +#@ group_variable suffix "view_analyze_file_suffix" +#@ group_variable suffix "view_write_file_suffix" +#@ +#@ # Meenakshi: Added new group scc (for SystemC compiler) +#@ group_variable scc {systemcout_levelize} +#@ group_variable scc {systemcout_debug_mode} +#@ +#@ # "power" variables are for power-analysis. +#@ group_variable power {power_keep_license_after_power_commands} +#@ group_variable power {power_preserve_rtl_hier_names} +#@ group_variable power {power_do_not_size_icg_cells} +#@ group_variable power {power_hdlc_do_not_split_cg_cells} +#@ group_variable power {power_rtl_saif_file} +#@ group_variable power {power_sdpd_saif_file} +#@ group_variable power {power_cg_flatten} +#@ group_variable power {power_opto_extra_high_dynamic_power_effort} +#@ group_variable power {power_default_static_probability} +#@ group_variable power {power_default_toggle_rate} +#@ group_variable power {power_default_toggle_rate_type} +#@ group_variable power {power_model_preference} +#@ group_variable power {power_sa_propagation_effort} +#@ group_variable power {power_sa_propagation_verbose} +#@ group_variable power {power_fix_sdpd_annotation} +#@ group_variable power {power_fix_sdpd_annotation_verbose} +#@ group_variable power {power_sdpd_message_tolerance} +#@ group_variable power {power_rclock_use_asynch_inputs} +#@ group_variable power {power_rclock_inputs_use_clocks_fanout} +#@ group_variable power {power_rclock_unrelated_use_fastest} +#@ group_variable power {power_lib2saif_rise_fall_pd} +#@ group_variable power {power_min_internal_power_threshold} +#@ group_variable power {power_cg_module_naming_style} +#@ group_variable power {power_cg_cell_naming_style} +#@ group_variable power {power_cg_gated_clock_net_naming_style} +#@ group_variable power {do_operand_isolation} +#@ +#@ # dpcm variables are used by DPCM lib and controllong DC when using DPCM +#@ +#@ if { [info exists dpcm_debuglevel] } { +#@ group_variable dpcm "dpcm_debuglevel" +#@ group_variable dpcm "dpcm_rulespath" +#@ group_variable dpcm "dpcm_rulepath" +#@ group_variable dpcm "dpcm_tablepath" +#@ group_variable dpcm "dpcm_libraries" +#@ group_variable dpcm "dpcm_version" +#@ group_variable dpcm "dpcm_level" +#@ group_variable dpcm "dpcm_temperaturescope" +#@ group_variable dpcm "dpcm_voltagescope" +#@ group_variable dpcm "dpcm_functionscope" +#@ group_variable dpcm "dpcm_wireloadscope" +#@ group_variable dpcm "dpcm_slewlimit" +#@ group_variable dpcm "dpcm_arc_sense_mapping" +#@ +#@ } +#@ +#@ set dpcm_slewlimit "TRUE" +#@ +#@ # executable to fire off RTLA/BCV +#@ group_variable hdl {xterm_executable} +#@ +#@ # Variable group for Chip Compiler +#@ if {[info exists acs_work_dir]} { +#@ group_variable acs acs_area_report_suffix +#@ group_variable acs acs_autopart_max_area +#@ group_variable acs acs_autopart_max_percent +#@ group_variable acs acs_budgeted_cstr_suffix +#@ group_variable acs acs_compile_script_suffix +#@ group_variable acs acs_constraint_file_suffix +#@ group_variable acs acs_cstr_report_suffix +#@ group_variable acs acs_db_suffix +#@ group_variable acs acs_dc_exec +#@ group_variable acs acs_default_pass_name +#@ group_variable acs acs_exclude_extensions +#@ group_variable acs acs_exclude_list +#@ group_variable acs acs_global_user_compile_strategy_script +#@ group_variable acs acs_hdl_verilog_define_list +#@ group_variable acs acs_hdl_source +#@ group_variable acs acs_lic_wait +#@ group_variable acs acs_log_file_suffix +#@ group_variable acs acs_make_args +#@ group_variable acs acs_make_exec +#@ group_variable acs acs_makefile_name +#@ group_variable acs acs_num_parallel_jobs +#@ group_variable acs acs_override_report_suffix +#@ group_variable acs acs_override_script_suffix +#@ group_variable acs acs_qor_report_suffix +#@ group_variable acs acs_timing_report_suffix +#@ group_variable acs acs_use_autopartition +#@ group_variable acs acs_use_default_delays +#@ group_variable acs acs_user_budgeting_script +#@ group_variable acs acs_user_compile_strategy_script_suffix +#@ group_variable acs acs_verilog_extensions +#@ group_variable acs acs_vhdl_extensions +#@ group_variable acs acs_work_dir +#@ group_variable acs check_error_list +#@ group_variable acs ilm_preserve_core_constraints +#@ +#@ } +#@ +#@ # +#@ # DesignTime Variable Group timing +#@ # +#@ +#@ group_variable timing case_analysis_log_file +#@ group_variable timing case_analysis_sequential_propagate +#@ group_variable timing case_analysis_with_logic_constants +#@ group_variable timing create_clock_no_input_delay +#@ group_variable timing disable_auto_time_borrow +#@ group_variable timing disable_case_analysis +#@ group_variable timing disable_conditional_mode_analysis +#@ group_variable timing disable_library_transition_degradation +#@ group_variable timing dont_bind_unused_pins_to_logic_constant +#@ group_variable timing enable_slew_degradation +#@ group_variable timing high_fanout_net_pin_capacitance +#@ group_variable timing high_fanout_net_threshold +#@ group_variable timing lib_thresholds_per_lib +#@ group_variable timing rc_adjust_rd_when_less_than_rnet +#@ group_variable timing rc_ceff_delay_min_diff_ps +#@ group_variable timing rc_degrade_min_slew_when_rd_less_than_rnet +#@ group_variable timing rc_driver_model_max_error_pct +#@ group_variable timing rc_filter_rd_less_than_rnet +#@ group_variable timing rc_input_threshold_pct_fall +#@ group_variable timing rc_input_threshold_pct_rise +#@ group_variable timing rc_output_threshold_pct_fall +#@ group_variable timing rc_output_threshold_pct_rise +#@ group_variable timing rc_rd_less_than_rnet_threshold +#@ group_variable timing rc_slew_derate_from_library +#@ group_variable timing rc_slew_lower_threshold_pct_fall +#@ group_variable timing rc_slew_lower_threshold_pct_rise +#@ group_variable timing rc_slew_upper_threshold_pct_fall +#@ group_variable timing rc_slew_upper_threshold_pct_rise +#@ group_variable timing timing_disable_cond_default_arcs +#@ # group_variable timing timing_enable_multiple_clocks_per_reg +#@ group_variable timing timing_report_attributes +#@ group_variable timing timing_self_loops_no_skew +#@ group_variable timing when_analysis_permitted +#@ group_variable timing when_analysis_without_case_analysis +#@ +#@ } ;# $synopsys_program_name != "ptxr" +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ # +#@ # IC Compile Variable Group: +#@ # +#@ # These variables affect the designs created by the route_opt command. +#@ # +#@ group_variable routeopt routeopt_checkpoint +#@ group_variable routeopt routeopt_disable_cpulimit +#@ } +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ # +#@ # IC Compiler Variable Group: MCMM +#@ # +#@ # These variables affect Multi-Corner/Multi-Mode. Currently, MCMM is +#@ # only supported in ICC--hence the "icc_shell" qualification, above +#@ # +#@ group_variable MCMM mcmm_enable_high_capacity_flow +#@ } +#@ +#@ # Aliases for backwards compatibility or other reasons +#@ group_variable compile {compile_log_format} +#@ alias view_cursor_number x11_set_cursor_number +#@ alias set_internal_load set_load +#@ alias set_internal_arrival set_arrival +#@ alias set_connect_delay "set_annotated_delay -net" +#@ alias create_test_vectors create_test_patterns +#@ alias compile_test insert_test +#@ alias check_clocks check_timing +#@ alias lint check_design +#@ # gen removed; alias gen create_schematic +#@ alias free remove_design +#@ alias group_bus create_bus +#@ alias ungroup_bus remove_bus +#@ alias groupvar group_variable +#@ alias report_constraints report_constraint +#@ alias report_attributes report_attribute +#@ alias fsm_reduce reduce_fsm +#@ alias fsm_minimize minimize_fsm +#@ alias disable_timing set_disable_timing +#@ alias dont_touch set_dont_touch +#@ alias dont_touch_network set_dont_touch_network +#@ alias dont_use set_dont_use +#@ alias fix_hold set_fix_hold +#@ alias prefer set_prefer +#@ alias remove_package "echo remove_package command is obsolete: packages are stored on disk not in-memory:" +#@ alias analyze_scan preview_scan +#@ alias get_clock get_clocks +#@ alias dc_shell_is_in_incr_mode shell_is_in_xg_mode +#@ alias set_vh_module_options set_dps_module_options +#@ alias set_vh_physopt_options set_dps_options +#@ alias update_vh_design update_dps_design +#@ alias vh_start dps_start +#@ alias vh_end dps_end +#@ alias all_vh_modules all_dps_modules +#@ alias all_designs_of_vh all_designs_of_dps +#@ alias vh_use_auto_partitioning dps_auto_partitioning +#@ alias vh_write_changes dps_write_changes +#@ alias vh_read_changes dps_read_changes +#@ alias vh_write_module_clock dps_write_module_clock +#@ alias get_lib get_libs +#@ +#@ # Enable unsupported psyn commands +#@ if { $synopsys_program_name == "psyn_shell" || $synopsys_program_name == "icc_shell"} { +#@ proc enable_unsupported_commands { { arg "default" } } { +#@ global cgpi_use_new_wire_factors +#@ global cgpi_use_relative_wire_factors +#@ global cgpi_use_new_path_factors +#@ global pwlm_use_new_wire_factors +#@ global pwlm_use_relative_wire_factors +#@ global pwlm_use_new_path_factors +#@ global psyn_unsupported_commands_dir +#@ global synopsys_root +#@ if {![info exists psyn_unsupported_commands_dir]} { +#@ set psyn_unsupported_commands_dir $synopsys_root/auxx/syn/psyn/unsupported_commands +#@ } +#@ set psyn_unsupported_commands_option1 $arg +#@ if {[file readable $psyn_unsupported_commands_dir/setup.tcl]} { +#@ source $psyn_unsupported_commands_dir/setup.tcl +#@ } else { +#@ source -encrypted $psyn_unsupported_commands_dir/setup.tcl.e +#@ } +#@ } +#@ } +#@ # For Intel +#@ if { $synopsys_program_name == "icc_shell"} { +#@ set psyn_unsupported_commands_dir $synopsys_root/auxx/syn/psyn/unsupported_commands +#@ source -encrypted $psyn_unsupported_commands_dir/max_dist.tcl.e +#@ } +#@ +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ # to enable CLE readline-ish terminal by default for ICC +#@ set sh_enable_line_editing true +#@ +#@ # Astro forms create an enormous number of new variables which are +#@ # very annoying for users to see, so the default of this variable +#@ # for ICC is false +#@ set sh_new_variable_message false +#@ } +#@ +#@ if { $synopsys_program_name == "icc_shell" || (($synopsys_program_name == "dc_shell") && ([shell_is_in_topographical_mode])) } { +#@ source $synopsys_root/auxx/syn/psyn/verify_ilm.tcl +#@ } +#@ +#@ # Enable vh psyn commands +#@ if { $synopsys_program_name == "psyn_shell" } { +#@ proc enable_vh_flow { } { +#@ global VH_SCRIPT_FILE +#@ global synopsys_root +#@ global suppress_errors +#@ set suppress_errors "$suppress_errors CMD-041 UID-95 SEL-003 SEL-005" +#@ if {![info exists VH_SCRIPT_FILE]} { +#@ set VH_SCRIPT_FILE $synopsys_root/auxx/syn/psyn/vh_pc.tcl.e +#@ } +#@ if {[file readable $VH_SCRIPT_FILE]} { +#@ if {[string match *.tcl $VH_SCRIPT_FILE]} { +#@ source $VH_SCRIPT_FILE +#@ } else { +#@ source -encrypted $VH_SCRIPT_FILE +#@ } +#@ } else { +#@ puts "Error: VH script file $VH_SCRIPT_FILE not found." +#@ } +#@ } +#@ } +#@ +#@ +#@ #Turn on enable_netl_view to true by default. +#@ set enable_netl_view "TRUE" +#@ +#@ +#@ #Turn on physopt_bypass_multiple_plib_check by default +#@ if { $synopsys_program_name == "psyn_shell" } { +#@ set physopt_bypass_multiple_plib_check TRUE +#@ } +#@ +#@ # The ls command is gone, now it is just an alias for dc_shell eqn mode +#@ +#@ if { [string compare $dc_shell_mode "default"] == 0 } { +#@ if { ( $sh_arch == {mips}) && ( ( $synopsys_program_name == {design_analyzer}) || ( $isatty == 0)) } { +#@ alias ls "sh ls -a " +#@ } else { +#@ if { ( $sh_arch == {mips}) || ( $sh_arch == {necmips}) } { +#@ alias ls "sh ls -aC " +#@ } else { +#@ alias ls "sh ls -aC " +#@ } +#@ } +#@ } +#@ +#@ # Aliases for RouteCompiler +#@ alias run_rodeo_router route66 +#@ +#@ # Removing route_global from the code. Earlier it was hidden. --Mukesh +#@ #proc route_global {} { +#@ # global route_global_keep_tmp_data +#@ # global rt66_dont_lock_dir +#@ # +#@ # set rt66_dont_lock_dir TRUE +#@ # +#@ # for { set i 0} {1==1} {incr i} { +#@ # set wdir [file join [pwd] ".route_global.$i"] +#@ # if {[file exist $wdir] == 0} { +#@ # break; +#@ # } +#@ # } +#@ # +#@ # set_routing_options -cut_out_covered_port CORE_ONLY +#@ # set_routing_options -internal_routing FALSE +#@ # set_routing_options -stick_routing FALSE +#@ # +#@ # ###puts "wdir = $wdir" +#@ # +#@ # set success [route66 -global -dontstop -dir $wdir] +#@ # +#@ # #clean tmp data if required: +#@ # if { $success == 1 } { +#@ # if [catch {string toupper $route_global_keep_tmp_data} result] { +#@ # #variable is not defined +#@ # ###puts "result_1 = $result => removing dir ..." +#@ # catch { file delete -force $wdir } +#@ # } else { +#@ # #variable is set to FALSE +#@ # if { [string compare $result "TRUE"] != 0} { +#@ # ###puts "result_2 = $result => removing dir ..." +#@ # catch { file delete -force $wdir } +#@ # } +#@ # } +#@ # } +#@ # +#@ # set rt66_dont_lock_dir FALSE +#@ # return 1 +#@ #} +#@ #define_proc_attributes route_global -hidden +#@ +#@ #/* Aliases added for report command */ +#@ alias report_clock_constraint "report_timing -path end -to all_registers(-data_pins)" +#@ alias report_clock_fanout "report_transitive_fanout -clock_tree" +#@ alias report_clocks report_clock +#@ alias report_synthetic report_cell +#@ +#@ # Alias added for Ultra backward compatibility mode +#@ alias set_ultra_mode set_ultra_optimization +#@ +#@ # alias for write_sge and menu item in DA for db2sge +#@ +#@ #if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ # set db2sge_script ${synopsys_root}/admin/setup/.dc_write_sge.tcl +#@ #} else { +#@ # set db2sge_script ${synopsys_root}/admin/setup/.dc_write_sge +#@ #} +#@ +#@ #set db2sge_command ${synopsys_root}/${sh_arch}/syn/bin/db2sge +#@ set view_script_submenu_items "\"DA to SGE Transfer\" write_sge" +#@ +#@ +#@ if { $synopsys_program_name != "lc_shell"} { +#@ # read schematic annotation setup file +#@ #source ${synopsys_root}/admin/setup/.dc_annotate +#@ +#@ # setup the default layer settings +#@ #source ${synopsys_root}/admin/setup/.dc_layers +#@ +#@ if {$synopsys_program_name != "dc_sms_shell"} { +#@ source ${synopsys_root}/admin/setup/.dc_name_rules +#@ } +#@ } else { +#@ #for read_lib -html +#@ source ${synopsys_root}/auxx/syn/lc/read_lib_html_msg_list.tcl +#@ } +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/admin/setup/.dc_name_rules + +#@ # +#@ +#@ # .dc_name_rules Initialization file for +#@ +#@ # Dc_Shell and Design_Analyzer +#@ +#@ # This files defines name rules for target systems. Change_names +#@ # will use this rules to fix the object names. +#@ +#@ #*/ +#@ +#@ +#@ define_name_rules sverilog -type net -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules sverilog -type port -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules sverilog -type cell -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ define_name_rules sverilog -reserved { "always" "always_comb" "always_ff" "always_latch" "and" "assert" "assert_strobe" "assign" "automatic" "begin" "bit" "break" "buf" "bufif0" "bufif1" "byte" "case" "casex" "casez" "cell" "changed" "char" "cmos" "config" "const" "continue" "deassign" "default" "defparam" "design" "disable" "do" "edge" "else" "end" "endcase" "endconfig" "endfunction" "endgenerate" "endinterface" "endmodule" "endprimitive" "endspecify" "endtable" "endtask" "endtransition" "enum" "event" "export" "extern" "for" "force" "forever" "fork" "forkjoin" "function" "generate" "genvar" "highz0" "highz1" "if" "iff" "ifnone" "import" "incdir" "include" "initial" "inout" "input" "instance" "int" "integer" "interface" "join" "large" "liblist" "library" "localparam" "logic" "longint" "longreal" "macromodule" "medium" "modport" "module" "nand" "negedge" "nmos" "nor" "noshowcancelled" "not" "notif0" "notif1" "or" "output" "packed" "parameter" "pmos" "posedge" "primitive" "process" "priority" "pull0" "pull1" "pullup" "pulldown" "pulsestyle_onevent" "pulsestyle_ondetect" "rcmos" "real" "realtime" "reg" "release" "repeat" "return" "rnmos" "rpmos" "rtran" "rtranif0" "rtranif1" "scalared" "shortint" "shortreal" "showcancelled" "signed" "small" "specify" "specparam" "static" "strong0" "strong1" "struct" "supply0" "supply1" "table" "task" "time" "timeprecision" "timeunit" "tran" "tranif0" "tranif1" "transition" "tri" "tri0" "tri1" "triand" "trior" "trireg" "type" "typedef" "union" "unique" "use" "unsigned" "vectored" "void" "wait" "wand" "weak0" "weak1" "while" "wire" "wor" "xor" "xnor" } -special verilog -target_bus_naming_style {%s[%d]} -flatten_multi_dimension_busses -check_internal_net_name -check_bus_indexing +#@ +#@ define_name_rules verilog -type net -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules verilog -type port -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules verilog -type cell -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ define_name_rules verilog -reserved { "always" "and" "assign" "automatic" "begin" "buf" "bufif0" "bufif1" "case" "casex" "casez" "cell" "cmos" "config" "deassign" "default" "defparam" "design" "disable" "edge" "else" "end" "endcase" "endconfig" "endfunction" "endgenerate" "endmodule" "endprimitive" "endspecify" "endtable" "endtask" "event" "for" "force" "forever" "fork" "function" "generate" "genvar" "highz0" "highz1" "if" "ifnone" "incdir" "include" "initial" "inout" "input" "instance" "integer" "join" "large" "liblist" "library" "localparam" "macromodule" "medium" "module" "nand" "negedge" "nmos" "nor" "noshowcancelled" "not" "notif0" "notif1" "or" "output" "parameter" "pmos" "posedge" "primitive" "pull0" "pull1" "pullup" "pulldown" "pulsestyle_onevent" "pulsestyle_ondetect" "rcmos" "real" "realtime" "reg" "release" "repeat" "rnmos" "rpmos" "rtran" "rtranif0" "rtranif1" "scalared" "showcancelled" "signed" "small" "specify" "specparam" "strong0" "strong1" "supply0" "supply1" "table" "task" "time" "tran" "tranif0" "tranif1" "tri" "tri0" "tri1" "triand" "trior" "trireg" "unsigned" "use" "vectored" "wait" "wand" "weak0" "weak1" "while" "wire" "wor" "xor" "xnor" } -special verilog -target_bus_naming_style {%s[%d]} -flatten_multi_dimension_busses -check_internal_net_name -check_bus_indexing +#@ +#@ define_name_rules verilog_1995 -type net -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules verilog_1995 -type port -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules verilog_1995 -type cell -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ define_name_rules verilog_1995 -reserved { "always" "and" "assign" "begin" "buf" "bufif0" "bufif1" "case" "casex" "casez" "cell" "cmos" "deassign" "default" "defparam" "design" "disable" "edge" "else" "end" "endcase" "endfunction" "endmodule" "endprimitive" "endspecify" "endtable" "endtask" "event" "for" "force" "forever" "fork" "function" "highz0" "highz1" "if" "ifnone" "initial" "inout" "input" "integer" "join" "large" "macromodule" "medium" "module" "nand" "negedge" "nmos" "nor" "notif0" "notif1" "or" "output" "parameter" "pmos" "posedge" "primitive" "pull0" "pull1" "pullup" "pulldown" "rcmos" "real" "realtime" "reg" "release" "repeat" "rnmos" "rpmos" "rtran" "rtranif0" "rtranif1" "scalared" "small" "specify" "specparam" "strong0" "strong1" "supply0" "supply1" "table" "task" "time" "tran" "tranif0" "tranif1" "tri" "tri0" "tri1" "triand" "trior" "trireg" "vectored" "wait" "wand" "weak0" "weak1" "while" "wire" "wor" "xor" "xnor" } -special verilog -target_bus_naming_style {%s[%d]} -flatten_multi_dimension_busses -check_internal_net_name -check_bus_indexing +#@ +#@ +#@ ####/* Name rule for VHDL */ +#@ +#@ ####/* Name rule for VHDL */ +#@ +#@ ####/* Name rule for VHDL */ +#@ +#@ define_name_rules vhdl -reserved_words { "abs" "access" "after" "alias" "all" "and" "architecture" "array" "assert" "attribute" \ +#@ "begin" "block" "body" "buffer" "bus" "case" "component" "configuration" "constant" "disconnect" "downto" "else" "elsif" "end" "entity" "exit" "file" "for" "function" "generate" "generic" "group" "guarded" "if" "impure" "in" "inertial" "inout" "is" "label" "library" "linkage" "literal" "loop" "map" "mod" "nand" "new" "next" "nor" "not" "null" "of" "on" "open" "or" "others" "out" "package" "port" "postponed" "procedure" "process" "pure" "range" "record" "register" "reject" "rem" "report" "return" "rol" "ror" "select" "severity" "signal" "shared" "sla" "sll" "sra" "srl" "subtype" "then" "to" "transport" "type" "unaffected" "units" "until" "use" "variable" "wait" "when" "while" "with" "xnor" "xor"} -case_insensitive -target_bus_naming_style "%s(%d)" -replacement_char "x" -special vhdl +#@ define_name_rules vhdl -type net -allowed "A-Z a-z _ 0-9 " -first_restricted "0-9 _" -last_restricted "_" +#@ define_name_rules vhdl -type port -allowed "A-Z a-z _ 0-9 " -first_restricted "0-9 _" -last_restricted "_" +#@ define_name_rules vhdl -type cell -allowed "A-Z a-z _ 0-9" -first_restricted "0-9 _" -last_restricted "_" +#@ define_name_rules vhdl -map { {{"__","_"},{"_$",""}} } +#@ +#@ ####/* Name rule for VHDL */ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/admin/setup/.dc_name_rules + +#@ +#@ if { $synopsys_program_name == "psyn_gui"} { +#@ # read RouteCompiler GUI file for timing critical pathes. +#@ source ${synopsys_root}/auxx/syn/route_gui/write_route_timing_path.tcl +#@ } +#@ +#@ # Set physopt_dw_opto to false +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ set physopt_dw_opto FALSE +#@ } +#@ +#@ #/* Read budgeting setup script */ +#@ +#@ if { [string compare $dc_shell_mode "default"] == 0 } { +#@ +#@ # Need a encrypted file in Tcl format for budget.setup.et +#@ if { $sh_arch != "msvc50" && $sh_arch != "alpha_nt" } { +#@ # source -e synopsys_root + "/admin/setup/budget.setup.et" +#@ } +#@ } +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ source $synopsys_root/auxx/syn/.icc_procs.tcl +#@ source -encrypted $synopsys_root/auxx/syn/cts/fast_atomic_cts.tcl.e +#@ } +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ alias report_scenario report_scenarios +#@ } +#@ +#@ # floorplanning preferences globals +#@ global fp_snap_type +#@ +#@ set fp_snap_type(port) wiretrack +#@ set fp_snap_type(cell) litho +#@ set fp_snap_type(pin) wiretrack +#@ set fp_snap_type(movebound) litho +#@ set fp_snap_type(port_shape) wiretrack +#@ set fp_snap_type(wiring_keepout) wiretrack +#@ set fp_snap_type(placement_keepout) litho +#@ set fp_snap_type(net_shape) wiretrack +#@ set fp_snap_type(route_shape) wiretrack +#@ set fp_snap_type(none) litho +#@ +#@ # STAR 9000615813. PWR-18 is no longer internally suppressed. +#@ # Instead call tcl suppress_message so that it can be unsuppressed by users in +#@ # command line if needed +#@ suppress_message PWR-18 +#@ +#@ # alias for write_sge is always the last line of the setup file +#@ #if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ # alias write_sge "source db2sge_script" +#@ #} else { +#@ # alias write_sge "include db2sge_script" +#@ #} +#@ +#@ if { $dc_shell_mode == "tcl" } { +#@ # Configure Execute script dialog to display .tcl files +#@ set view_execute_script_suffix "$view_execute_script_suffix .tcl" +#@ } +#@ +#@ # +#@ # Shirley Lu 5/15/2007 +#@ # +#@ # Invoke NCX validation/correlation/fomatter from lc_shell: +#@ # +#@ # UNIX shell: +#@ # setenv SYNOPSYS_NCX_ROOT /mydisk/ncx_2007.06 +#@ # +#@ +#@ if {[info exists env(SYNOPSYS_NCX_ROOT)]} { +#@ +#@ set ncx_path $env(SYNOPSYS_NCX_ROOT)/ncx/${sh_arch}/bin +#@ +#@ # +#@ # check_ccs_lib +#@ # use libchecker under $ncx_path defined above +#@ # Disable this command since 2010.12-SP3 (should be done in 2010.12 release) +#@ #proc check_ccs_lib {args} { +#@ # global ncx_path +#@ # set cmdStr [linsert $args 0 ${ncx_path}/libchecker -lc_shell] +#@ # set cmd [open "| $cmdStr 2>@ stdout"] +#@ # catch { +#@ # while {[gets $cmd info] >= 0} { +#@ # echo $info +#@ # } +#@ # } +#@ # if {[catch {close $cmd} msg]} { +#@ # } +#@ #} +#@ +#@ # +#@ # format_lib +#@ # use ncx under $ncx_path defined above +#@ # Disable format_lib command in 2014.09 release -- xwwang, 7/25/2014 +#@ #proc format_lib {args} { +#@ # global ncx_path +#@ # echo "Warning: format_lib command is scheduled to become obsolete in a future production release." +#@ # set cmdStr [linsert $args 0 ${ncx_path}/ncx -lc_shell] +#@ # set cmd [open "| $cmdStr 2>@ stdout"] +#@ # catch { +#@ # while {[gets $cmd info] >= 0} { +#@ # echo $info +#@ # } +#@ # } +#@ # if {[catch {close $cmd} msg]} { +#@ # } +#@ #} +#@ +#@ } +#@ +#@ proc valias {v_orig v_alias} { +#@ uplevel 1 "upvar 0 $v_orig $v_alias" +#@ } +#@ +#@ set lc_run_from_legacy_library_compiler "true" +#@ +#@ set lc_enable_legacy_library_compiler "false" +#@ +#@ valias lc_enable_legacy_library_compiler lc_enable_common_shell_lc +#@ +#@ if {[info exists ::env(SYNOPSYS_LC_ROOT)] && [file exists $::env(SYNOPSYS_LC_ROOT)/$::sh_arch/lc/bin/lc_shell_exec]} { +#@ # make lc man pages search path override the default man page search path +#@ set man_path [linsert $man_path 0 $::env(SYNOPSYS_LC_ROOT)/doc/lc/man] +#@ } else { +#@ set lc_link "$::synopsys_root/$::sh_arch/syn/bin/lc_shell_exec" +#@ while { [file exists $lc_link] && [file type $lc_link] == "link"} { +#@ set lc_link [file readlink $lc_link] +#@ } +#@ # resolve symbol-link to get $exec_path of lc_shell_exec +#@ if { [file exists $lc_link] } { +#@ set LC_ROOT [file dirname [file dirname [file dirname [file dirname $lc_link]]]] +#@ set man_path [linsert $man_path 0 $LC_ROOT/doc/lc/man] +#@ } +#@ } +#@ +#@ source ${synopsys_root}/auxx/syn/lc_commands.tbc +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lc_commands.tbc + +#@ ############################################################################## +#@ # Author : Liping Zhao +#@ # History: 2016/11/21 created +#@ # Description: This is the source tcl file of run_nglc.tbc. +#@ # The procs are all for run library compiler under the hood. +#@ # These procs are exracted from .synopsys_dc.setup +#@ ############################################################################## +#@ # TclPro::Compiler::Include +#@ +#@ if {[catch {package require tbcload 1.6} err] == 1} { +#@ return -code error "[info script]: The TclPro ByteCode Loader is not available or does not support the correct version -- $err" +#@ } +#@ tbcload::bceval { +#@ TclPro ByteCode 2 0 1.7 8.5 +#@ 44 0 426 61 0 0 312 0 12 44 44 -1 -1 +#@ 426 +#@ `:G,f=!CM1qv2&|=!A8#>!*BEKs!6#o9v.EW< +#@ !E;kpvJSapvQXxOwI1IOwI1IOwI1IOwI1IOwI1IOwI1IOwI1IOw +#@ 44 +#@ I%%n#;c(;v0g>a'?qwn#I%%n#I%%n#I%%n#I%%n#I%%n#I%%n#Hq^R# +#@ 61 +#@ x +#@ 4 +#@ ,CHr@ +#@ x +#@ 23 +#@ lj|Z?!aiaEw>m#H8&Z)F5mNaEt-E- +#@ x +#@ 1 +#@ A! +#@ p +#@ 5 0 29 3 0 0 20 0 9 5 5 -1 -1 +#@ 29 +#@ w0EpvQks6#;>fv!E*<!8^w!!a9)!!&E&s +#@ !18:3w4Ki!8^w!!KJv!!&E&s!1rA=!;Yq9-C^w +#@ !!+?!!!1;l!,A^w!!+?!!!fqlwv5v!!!D!!!!gF#!!&E&s!:8B=!4,tl#,eN48;I%!!'BWMe`BJ>'0.#3WW!0#>6#3# +#@ Ts!TG;I/m&3,!/uJv!#0EMe`BLP|f.#3WW!0#>6#82Ts!TG;I/o,3,!1,|v!#0EMe`BJ +#@ >'0.#3WW!0#>6#:8Ts!TG;I/m&3,!/uJv!#0E!^KnMe`BJ>'0.#3WW!0#>6#<>Ts!TG;I/m&3,!/uJv!#0E!_KnMe`BJ>'0.#3 +#@ WW!0#>6#>DTs!TG;I/m&3,!/uJv!#0Em#HvdM +#@ e`BBKMT+#3WW!w0EMe`BBKMT+#3WW!w0EMe`BBKMT+#3WW!w0EMe`BBKMT+#3WW!w0Em#HvdKv +#@ x +#@ 3 +#@ g'i- +#@ 0 +#@ 0 +#@ 1 2 +#@ 1 +#@ ?v +#@ 0 0 256 +#@ 3 +#@ g'i- +#@ 1 0 0 +#@ x +#@ 13 +#@ qd,r@dIa:@e-%lB.v +#@ x +#@ 6 +#@ 'E%6B_-v +#@ p +#@ 1 0 7 1 0 0 4 0 2 1 1 -1 -1 +#@ 7 +#@ ,|&v!)'!! +#@ 1 +#@ z +#@ 1 +#@ '! +#@ 1 +#@ x +#@ 21 +#@ w3F/D'gi'FrZ!iCdIa:@e-%lB.v +#@ 0 +#@ 0 +#@ 1 1 +#@ 4 +#@ %N|(F +#@ 0 0 256 +#@ x +#@ 21 +#@ w3F/D'gi'FrZ!iCdIa:@e-%lB.v +#@ x +#@ 5 +#@ %N|(FA! +#@ p +#@ 10 0 92 13 0 0 40 0 5 10 10 -1 -1 +#@ 92 +#@ )NrUNw,?WcEh7|7An1g+ +#@ x +#@ 5 +#@ )lP)F1v +#@ x +#@ 19 +#@ ,v(Z?!aiaEmo3mBm+BRAyOl, +#@ x +#@ 21 +#@ w3F/D'gi'FrZ!iCdIa:@VhrU@?v +#@ x +#@ 18 +#@ #k|Z?(FuSAhaBq@c^CkBHSw +#@ 0 +#@ 0 +#@ 1 3 +#@ 4 +#@ %N|(F +#@ 0 0 256 +#@ 8 +#@ o4jY?m'cSA +#@ 1 0 0 +#@ 4 +#@ g3IID +#@ 2 0 0 +#@ x +#@ 14 +#@ #k|Z?r0H8Aw9fwGJ%% +#@ p +#@ 7 0 70 13 0 0 28 0 6 7 7 -1 -1 +#@ 70 +#@ )Nre`B;a9?)v*<N%Je|v +#@ 13 +#@ x +#@ 3 +#@ _e|+ +#@ x +#@ 15 +#@ kaT5BgxUgCr6m*E_I-, +#@ x +#@ 6 +#@ sT2TAIPw +#@ x +#@ 8 +#@ m'cSANjkSA +#@ x +#@ 1 +#@ +v +#@ x +#@ 5 +#@ n0Hr@7v +#@ x +#@ 12 +#@ #graEv_Bq@,0B(F +#@ x +#@ 4 +#@ m'cSA +#@ x +#@ 6 +#@ gpbSAPSw +#@ x +#@ 6 +#@ AP5cE?Sw +#@ x +#@ 18 +#@ kaT5Bmv +#@ 0 +#@ 0 +#@ 0 1 +#@ 8 +#@ m'cSANjkSA +#@ 0 0 0 +#@ x +#@ 14 +#@ 4rBfD1-0CFq&fwGJ%% +#@ x +#@ 10 +#@ (KxhCN1-.DQ-v +#@ p +#@ 17 0 213 23 2 1 88 2 10 17 21 -1 -1 +#@ 213 +#@ w0E!8^w!!2V'!!*i=6#4;tl#=MGY!g@#!!ee6(!H,FN-gE +#@ EfR8SUNw

    :v8P60%.EW pkgname pkgversion]} { +#@ # Ignore everything not matching our pattern for +#@ # package names. +#@ continue +#@ } +#@ try { +#@ package vcompare $pkgversion 0 +#@ } on error {} { +#@ # Ignore everything where the version part is not +#@ # acceptable to "package vcompare". +#@ continue +#@ } +#@ +#@ if {[package ifneeded $pkgname $pkgversion] ne {}} { +#@ # There's already a provide script registered for +#@ # this version of this package. Since all units of +#@ # code claiming to be the same version of the same +#@ # package ought to be identical, just stick with +#@ # the one we already have. +#@ continue +#@ } +#@ +#@ # We have found a candidate, generate a "provide script" +#@ # for it, and remember it. Note that we are using ::list +#@ # to do this; locally [list] means something else without +#@ # the namespace specifier. +#@ +#@ # NOTE. When making changes to the format of the provide +#@ # command generated below CHECK that the 'LOCATE' +#@ # procedure in core file 'platform/shell.tcl' still +#@ # understands it, or, if not, update its implementation +#@ # appropriately. +#@ # +#@ # Right now LOCATE's implementation assumes that the path +#@ # of the package file is the last element in the list. +#@ +#@ package ifneeded $pkgname $pkgversion "[::list package provide $pkgname $pkgversion];[::list source -encoding utf-8 $file]" +#@ +#@ # We abort in this unknown handler only if we got a +#@ # satisfying candidate for the requested package. +#@ # Otherwise we still have to fallback to the regular +#@ # package search to complete the processing. +#@ +#@ if {($pkgname eq $name) +#@ && [package vsatisfies $pkgversion {*}$args]} { +#@ set satisfied 1 +#@ +#@ # We do not abort the loop, and keep adding provide +#@ # scripts for every candidate in the directory, just +#@ # remember to not fall back to the regular search +#@ # anymore. +#@ } +#@ } +#@ } +#@ } +#@ +#@ if {$satisfied} { +#@ return +#@ } +#@ } +#@ +#@ # Fallback to previous command, if existing. See comment above about +#@ # ::list... +#@ +#@ if {[llength $original]} { +#@ uplevel 1 $original [::linsert $args 0 $name] +#@ } +#@ } +#@ +#@ # ::tcl::tm::Defaults -- +#@ # +#@ # Determines the default search paths. +#@ # +#@ # Arguments +#@ # None +#@ # +#@ # Results +#@ # None. +#@ # +#@ # Sideeffects +#@ # May add paths to the list of defaults. +#@ +#@ proc ::tcl::tm::Defaults {} { +#@ global env tcl_platform +#@ +#@ lassign [split [info tclversion] .] major minor +#@ set exe [file normalize [info nameofexecutable]] +#@ +#@ # Note that we're using [::list], not [list] because [list] means +#@ # something other than [::list] in this namespace. +#@ roots [::list [file dirname [info library]] [file join [file dirname [file dirname $exe]] lib] ] +#@ +#@ if {$tcl_platform(platform) eq "windows"} { +#@ set sep ";" +#@ } else { +#@ set sep ":" +#@ } +#@ for {set n $minor} {$n >= 0} {incr n -1} { +#@ foreach ev [::list TCL${major}.${n}_TM_PATH TCL${major}_${n}_TM_PATH ] { +#@ if {![info exists env($ev)]} continue +#@ foreach p [split $env($ev) $sep] { +#@ path add $p +#@ } +#@ } +#@ } +#@ return +#@ } +#@ +#@ # ::tcl::tm::roots -- +#@ # +#@ # Public API to the module path. See specification. +#@ # +#@ # Arguments +#@ # paths - List of 'root' paths to derive search paths from. +#@ # +#@ # Results +#@ # No result. +#@ # +#@ # Sideeffects +#@ # Calls 'path add' to paths to the list of module search paths. +#@ +#@ proc ::tcl::tm::roots {paths} { +#@ lassign [split [package present Tcl] .] major minor +#@ foreach pa $paths { +#@ set p [file join $pa tcl$major] +#@ for {set n $minor} {$n >= 0} {incr n -1} { +#@ set px [file join $p ${major}.${n}] +#@ if {![interp issafe]} {set px [file normalize $px]} +#@ path add $px +#@ } +#@ set px [file join $p site-tcl] +#@ if {![interp issafe]} {set px [file normalize $px]} +#@ path add $px +#@ } +#@ return +#@ } +#@ +#@ # Initialization. Set up the default paths, then insert the new handler into +#@ # the chain. +#@ +#@ if {![interp issafe]} {::tcl::tm::Defaults} +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/tm.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/package.tcl + +#@ # package.tcl -- +#@ # +#@ # utility procs formerly in init.tcl which can be loaded on demand +#@ # for package management. +#@ # +#@ # Copyright (c) 1991-1993 The Regents of the University of California. +#@ # Copyright (c) 1994-1998 Sun Microsystems, Inc. +#@ # +#@ # See the file "license.terms" for information on usage and redistribution +#@ # of this file, and for a DISCLAIMER OF ALL WARRANTIES. +#@ # +#@ +#@ namespace eval tcl::Pkg {} +#@ +#@ # ::tcl::Pkg::CompareExtension -- +#@ # +#@ # Used internally by pkg_mkIndex to compare the extension of a file to a given +#@ # extension. On Windows, it uses a case-insensitive comparison because the +#@ # file system can be file insensitive. +#@ # +#@ # Arguments: +#@ # fileName name of a file whose extension is compared +#@ # ext (optional) The extension to compare against; you must +#@ # provide the starting dot. +#@ # Defaults to [info sharedlibextension] +#@ # +#@ # Results: +#@ # Returns 1 if the extension matches, 0 otherwise +#@ +#@ proc tcl::Pkg::CompareExtension {fileName {ext {}}} { +#@ global tcl_platform +#@ if {$ext eq ""} {set ext [info sharedlibextension]} +#@ if {$tcl_platform(platform) eq "windows"} { +#@ return [string equal -nocase [file extension $fileName] $ext] +#@ } else { +#@ # Some unices add trailing numbers after the .so, so +#@ # we could have something like '.so.1.2'. +#@ set root $fileName +#@ while {1} { +#@ set currExt [file extension $root] +#@ if {$currExt eq $ext} { +#@ return 1 +#@ } +#@ +#@ # The current extension does not match; if it is not a numeric +#@ # value, quit, as we are only looking to ignore version number +#@ # extensions. Otherwise we might return 1 in this case: +#@ # tcl::Pkg::CompareExtension foo.so.bar .so +#@ # which should not match. +#@ +#@ if {![string is integer -strict [string range $currExt 1 end]]} { +#@ return 0 +#@ } +#@ set root [file rootname $root] +#@ } +#@ } +#@ } +#@ +#@ # pkg_mkIndex -- +#@ # This procedure creates a package index in a given directory. The package +#@ # index consists of a "pkgIndex.tcl" file whose contents are a Tcl script that +#@ # sets up package information with "package require" commands. The commands +#@ # describe all of the packages defined by the files given as arguments. +#@ # +#@ # Arguments: +#@ # -direct (optional) If this flag is present, the generated +#@ # code in pkgMkIndex.tcl will cause the package to be +#@ # loaded when "package require" is executed, rather +#@ # than lazily when the first reference to an exported +#@ # procedure in the package is made. +#@ # -verbose (optional) Verbose output; the name of each file that +#@ # was successfully rocessed is printed out. Additionally, +#@ # if processing of a file failed a message is printed. +#@ # -load pat (optional) Preload any packages whose names match +#@ # the pattern. Used to handle DLLs that depend on +#@ # other packages during their Init procedure. +#@ # dir - Name of the directory in which to create the index. +#@ # args - Any number of additional arguments, each giving +#@ # a glob pattern that matches the names of one or +#@ # more shared libraries or Tcl script files in +#@ # dir. +#@ +#@ proc pkg_mkIndex {args} { +#@ set usage {"pkg_mkIndex ?-direct? ?-lazy? ?-load pattern? ?-verbose? ?--? dir ?pattern ...?"} +#@ +#@ set argCount [llength $args] +#@ if {$argCount < 1} { +#@ return -code error "wrong # args: should be\n$usage" +#@ } +#@ +#@ set more "" +#@ set direct 1 +#@ set doVerbose 0 +#@ set loadPat "" +#@ for {set idx 0} {$idx < $argCount} {incr idx} { +#@ set flag [lindex $args $idx] +#@ switch -glob -- $flag { +#@ -- { +#@ # done with the flags +#@ incr idx +#@ break +#@ } +#@ -verbose { +#@ set doVerbose 1 +#@ } +#@ -lazy { +#@ set direct 0 +#@ append more " -lazy" +#@ } +#@ -direct { +#@ append more " -direct" +#@ } +#@ -load { +#@ incr idx +#@ set loadPat [lindex $args $idx] +#@ append more " -load $loadPat" +#@ } +#@ -* { +#@ return -code error "unknown flag $flag: should be\n$usage" +#@ } +#@ default { +#@ # done with the flags +#@ break +#@ } +#@ } +#@ } +#@ +#@ set dir [lindex $args $idx] +#@ set patternList [lrange $args [expr {$idx + 1}] end] +#@ if {![llength $patternList]} { +#@ set patternList [list "*.tcl" "*[info sharedlibextension]"] +#@ } +#@ +#@ try { +#@ set fileList [glob -directory $dir -tails -types {r f} -- {*}$patternList] +#@ } on error {msg opt} { +#@ return -options $opt $msg +#@ } +#@ foreach file $fileList { +#@ # For each file, figure out what commands and packages it provides. +#@ # To do this, create a child interpreter, load the file into the +#@ # interpreter, and get a list of the new commands and packages that +#@ # are defined. +#@ +#@ if {$file eq "pkgIndex.tcl"} { +#@ continue +#@ } +#@ +#@ set c [interp create] +#@ +#@ # Load into the child any packages currently loaded in the parent +#@ # interpreter that match the -load pattern. +#@ +#@ if {$loadPat ne ""} { +#@ if {$doVerbose} { +#@ tclLog "currently loaded packages: '[info loaded]'" +#@ tclLog "trying to load all packages matching $loadPat" +#@ } +#@ if {![llength [info loaded]]} { +#@ tclLog "warning: no packages are currently loaded, nothing" +#@ tclLog "can possibly match '$loadPat'" +#@ } +#@ } +#@ foreach pkg [info loaded] { +#@ if {![string match -nocase $loadPat [lindex $pkg 1]]} { +#@ continue +#@ } +#@ if {$doVerbose} { +#@ tclLog "package [lindex $pkg 1] matches '$loadPat'" +#@ } +#@ try { +#@ load [lindex $pkg 0] [lindex $pkg 1] $c +#@ } on error err { +#@ if {$doVerbose} { +#@ tclLog "warning: load [lindex $pkg 0] [lindex $pkg 1]\nfailed with: $err" +#@ } +#@ } on ok {} { +#@ if {$doVerbose} { +#@ tclLog "loaded [lindex $pkg 0] [lindex $pkg 1]" +#@ } +#@ } +#@ if {[lindex $pkg 1] eq "Tk"} { +#@ # Withdraw . if Tk was loaded, to avoid showing a window. +#@ $c eval [list wm withdraw .] +#@ } +#@ } +#@ +#@ $c eval { +#@ # Stub out the package command so packages can require other +#@ # packages. +#@ +#@ rename package __package_orig +#@ proc package {what args} { +#@ switch -- $what { +#@ require { +#@ return; # Ignore transitive requires +#@ } +#@ default { +#@ __package_orig $what {*}$args +#@ } +#@ } +#@ } +#@ proc tclPkgUnknown args {} +#@ package unknown tclPkgUnknown +#@ +#@ # Stub out the unknown command so package can call into each other +#@ # during their initialilzation. +#@ +#@ proc unknown {args} {} +#@ +#@ # Stub out the auto_import mechanism +#@ +#@ proc auto_import {args} {} +#@ +#@ # reserve the ::tcl namespace for support procs and temporary +#@ # variables. This might make it awkward to generate a +#@ # pkgIndex.tcl file for the ::tcl namespace. +#@ +#@ namespace eval ::tcl { +#@ variable dir ;# Current directory being processed +#@ variable file ;# Current file being processed +#@ variable direct ;# -direct flag value +#@ variable x ;# Loop variable +#@ variable debug ;# For debugging +#@ variable type ;# "load" or "source", for -direct +#@ variable namespaces ;# Existing namespaces (e.g., ::tcl) +#@ variable packages ;# Existing packages (e.g., Tcl) +#@ variable origCmds ;# Existing commands +#@ variable newCmds ;# Newly created commands +#@ variable newPkgs {} ;# Newly created packages +#@ } +#@ } +#@ +#@ $c eval [list set ::tcl::dir $dir] +#@ $c eval [list set ::tcl::file $file] +#@ $c eval [list set ::tcl::direct $direct] +#@ +#@ # Download needed procedures into the slave because we've just deleted +#@ # the unknown procedure. This doesn't handle procedures with default +#@ # arguments. +#@ +#@ foreach p {::tcl::Pkg::CompareExtension} { +#@ $c eval [list namespace eval [namespace qualifiers $p] {}] +#@ $c eval [list proc $p [info args $p] [info body $p]] +#@ } +#@ +#@ try { +#@ $c eval { +#@ set ::tcl::debug "loading or sourcing" +#@ +#@ # we need to track command defined by each package even in the +#@ # -direct case, because they are needed internally by the +#@ # "partial pkgIndex.tcl" step above. +#@ +#@ proc ::tcl::GetAllNamespaces {{root ::}} { +#@ set list $root +#@ foreach ns [namespace children $root] { +#@ lappend list {*}[::tcl::GetAllNamespaces $ns] +#@ } +#@ return $list +#@ } +#@ +#@ # init the list of existing namespaces, packages, commands +#@ +#@ foreach ::tcl::x [::tcl::GetAllNamespaces] { +#@ set ::tcl::namespaces($::tcl::x) 1 +#@ } +#@ foreach ::tcl::x [package names] { +#@ if {[package provide $::tcl::x] ne ""} { +#@ set ::tcl::packages($::tcl::x) 1 +#@ } +#@ } +#@ set ::tcl::origCmds [info commands] +#@ +#@ # Try to load the file if it has the shared library extension, +#@ # otherwise source it. It's important not to try to load +#@ # files that aren't shared libraries, because on some systems +#@ # (like SunOS) the loader will abort the whole application +#@ # when it gets an error. +#@ +#@ if {[::tcl::Pkg::CompareExtension $::tcl::file [info sharedlibextension]]} { +#@ # The "file join ." command below is necessary. Without +#@ # it, if the file name has no \'s and we're on UNIX, the +#@ # load command will invoke the LD_LIBRARY_PATH search +#@ # mechanism, which could cause the wrong file to be used. +#@ +#@ set ::tcl::debug loading +#@ load [file join $::tcl::dir $::tcl::file] +#@ set ::tcl::type load +#@ } else { +#@ set ::tcl::debug sourcing +#@ source [file join $::tcl::dir $::tcl::file] +#@ set ::tcl::type source +#@ } +#@ +#@ # As a performance optimization, if we are creating direct +#@ # load packages, don't bother figuring out the set of commands +#@ # created by the new packages. We only need that list for +#@ # setting up the autoloading used in the non-direct case. +#@ if {!$::tcl::direct} { +#@ # See what new namespaces appeared, and import commands +#@ # from them. Only exported commands go into the index. +#@ +#@ foreach ::tcl::x [::tcl::GetAllNamespaces] { +#@ if {![info exists ::tcl::namespaces($::tcl::x)]} { +#@ namespace import -force ${::tcl::x}::* +#@ } +#@ +#@ # Figure out what commands appeared +#@ +#@ foreach ::tcl::x [info commands] { +#@ set ::tcl::newCmds($::tcl::x) 1 +#@ } +#@ foreach ::tcl::x $::tcl::origCmds { +#@ unset -nocomplain ::tcl::newCmds($::tcl::x) +#@ } +#@ foreach ::tcl::x [array names ::tcl::newCmds] { +#@ # determine which namespace a command comes from +#@ +#@ set ::tcl::abs [namespace origin $::tcl::x] +#@ +#@ # special case so that global names have no +#@ # leading ::, this is required by the unknown +#@ # command +#@ +#@ set ::tcl::abs [lindex [auto_qualify $::tcl::abs ::] 0] +#@ +#@ if {$::tcl::x ne $::tcl::abs} { +#@ # Name changed during qualification +#@ +#@ set ::tcl::newCmds($::tcl::abs) 1 +#@ unset ::tcl::newCmds($::tcl::x) +#@ } +#@ } +#@ } +#@ } +#@ +#@ # Look through the packages that appeared, and if there is a +#@ # version provided, then record it +#@ +#@ foreach ::tcl::x [package names] { +#@ if {[package provide $::tcl::x] ne "" +#@ && ![info exists ::tcl::packages($::tcl::x)]} { +#@ lappend ::tcl::newPkgs [list $::tcl::x [package provide $::tcl::x]] +#@ } +#@ } +#@ } +#@ } on error msg { +#@ set what [$c eval set ::tcl::debug] +#@ if {$doVerbose} { +#@ tclLog "warning: error while $what $file: $msg" +#@ } +#@ } on ok {} { +#@ set what [$c eval set ::tcl::debug] +#@ if {$doVerbose} { +#@ tclLog "successful $what of $file" +#@ } +#@ set type [$c eval set ::tcl::type] +#@ set cmds [lsort [$c eval array names ::tcl::newCmds]] +#@ set pkgs [$c eval set ::tcl::newPkgs] +#@ if {$doVerbose} { +#@ if {!$direct} { +#@ tclLog "commands provided were $cmds" +#@ } +#@ tclLog "packages provided were $pkgs" +#@ } +#@ if {[llength $pkgs] > 1} { +#@ tclLog "warning: \"$file\" provides more than one package ($pkgs)" +#@ } +#@ foreach pkg $pkgs { +#@ # cmds is empty/not used in the direct case +#@ lappend files($pkg) [list $file $type $cmds] +#@ } +#@ +#@ if {$doVerbose} { +#@ tclLog "processed $file" +#@ } +#@ } +#@ interp delete $c +#@ } +#@ +#@ append index "# Tcl package index file, version 1.1\n" +#@ append index "# This file is generated by the \"pkg_mkIndex$more\" command\n" +#@ append index "# and sourced either when an application starts up or\n" +#@ append index "# by a \"package unknown\" script. It invokes the\n" +#@ append index "# \"package ifneeded\" command to set up package-related\n" +#@ append index "# information so that packages will be loaded automatically\n" +#@ append index "# in response to \"package require\" commands. When this\n" +#@ append index "# script is sourced, the variable \$dir must contain the\n" +#@ append index "# full path name of this file's directory.\n" +#@ +#@ foreach pkg [lsort [array names files]] { +#@ set cmd {} +#@ lassign $pkg name version +#@ lappend cmd ::tcl::Pkg::Create -name $name -version $version +#@ foreach spec [lsort -index 0 $files($pkg)] { +#@ foreach {file type procs} $spec { +#@ if {$direct} { +#@ set procs {} +#@ } +#@ lappend cmd "-$type" [list $file $procs] +#@ } +#@ } +#@ append index "\n[eval $cmd]" +#@ } +#@ +#@ set f [open [file join $dir pkgIndex.tcl] w] +#@ puts $f $index +#@ close $f +#@ } +#@ +#@ # tclPkgSetup -- +#@ # This is a utility procedure use by pkgIndex.tcl files. It is invoked as +#@ # part of a "package ifneeded" script. It calls "package provide" to indicate +#@ # that a package is available, then sets entries in the auto_index array so +#@ # that the package's files will be auto-loaded when the commands are used. +#@ # +#@ # Arguments: +#@ # dir - Directory containing all the files for this package. +#@ # pkg - Name of the package (no version number). +#@ # version - Version number for the package, such as 2.1.3. +#@ # files - List of files that constitute the package. Each +#@ # element is a sub-list with three elements. The first +#@ # is the name of a file relative to $dir, the second is +#@ # "load" or "source", indicating whether the file is a +#@ # loadable binary or a script to source, and the third +#@ # is a list of commands defined by this file. +#@ +#@ proc tclPkgSetup {dir pkg version files} { +#@ global auto_index +#@ +#@ package provide $pkg $version +#@ foreach fileInfo $files { +#@ set f [lindex $fileInfo 0] +#@ set type [lindex $fileInfo 1] +#@ foreach cmd [lindex $fileInfo 2] { +#@ if {$type eq "load"} { +#@ set auto_index($cmd) [list load [file join $dir $f] $pkg] +#@ } else { +#@ set auto_index($cmd) [list source [file join $dir $f]] +#@ } +#@ } +#@ } +#@ } +#@ +#@ # tclPkgUnknown -- +#@ # This procedure provides the default for the "package unknown" function. It +#@ # is invoked when a package that's needed can't be found. It scans the +#@ # auto_path directories and their immediate children looking for pkgIndex.tcl +#@ # files and sources any such files that are found to setup the package +#@ # database. As it searches, it will recognize changes to the auto_path and +#@ # scan any new directories. +#@ # +#@ # Arguments: +#@ # name - Name of desired package. Not used. +#@ # version - Version of desired package. Not used. +#@ # exact - Either "-exact" or omitted. Not used. +#@ +#@ proc tclPkgUnknown {name args} { +#@ global auto_path env +#@ +#@ if {![info exists auto_path]} { +#@ return +#@ } +#@ # Cache the auto_path, because it may change while we run through the +#@ # first set of pkgIndex.tcl files +#@ set old_path [set use_path $auto_path] +#@ while {[llength $use_path]} { +#@ set dir [lindex $use_path end] +#@ +#@ # Make sure we only scan each directory one time. +#@ if {[info exists tclSeenPath($dir)]} { +#@ set use_path [lrange $use_path 0 end-1] +#@ continue +#@ } +#@ set tclSeenPath($dir) 1 +#@ +#@ # we can't use glob in safe interps, so enclose the following in a +#@ # catch statement, where we get the pkgIndex files out of the +#@ # subdirectories +#@ catch { +#@ foreach file [glob -directory $dir -join -nocomplain * pkgIndex.tcl] { +#@ set dir [file dirname $file] +#@ if {![info exists procdDirs($dir)]} { +#@ try { +#@ source $file +#@ } trap {POSIX EACCES} {} { +#@ # $file was not readable; silently ignore +#@ continue +#@ } on error msg { +#@ tclLog "error reading package index file $file: $msg" +#@ } on ok {} { +#@ set procdDirs($dir) 1 +#@ } +#@ } +#@ } +#@ } +#@ set dir [lindex $use_path end] +#@ if {![info exists procdDirs($dir)]} { +#@ set file [file join $dir pkgIndex.tcl] +#@ # safe interps usually don't have "file exists", +#@ if {([interp issafe] || [file exists $file])} { +#@ try { +#@ source $file +#@ } trap {POSIX EACCES} {} { +#@ # $file was not readable; silently ignore +#@ continue +#@ } on error msg { +#@ tclLog "error reading package index file $file: $msg" +#@ } on ok {} { +#@ set procdDirs($dir) 1 +#@ } +#@ } +#@ } +#@ +#@ set use_path [lrange $use_path 0 end-1] +#@ +#@ # Check whether any of the index scripts we [source]d above set a new +#@ # value for $::auto_path. If so, then find any new directories on the +#@ # $::auto_path, and lappend them to the $use_path we are working from. +#@ # This gives index scripts the (arguably unwise) power to expand the +#@ # index script search path while the search is in progress. +#@ set index 0 +#@ if {[llength $old_path] == [llength $auto_path]} { +#@ foreach dir $auto_path old $old_path { +#@ if {$dir ne $old} { +#@ # This entry in $::auto_path has changed. +#@ break +#@ } +#@ incr index +#@ } +#@ } +#@ +#@ # $index now points to the first element of $auto_path that has +#@ # changed, or the beginning if $auto_path has changed length Scan the +#@ # new elements of $auto_path for directories to add to $use_path. +#@ # Don't add directories we've already seen, or ones already on the +#@ # $use_path. +#@ foreach dir [lrange $auto_path $index end] { +#@ if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { +#@ lappend use_path $dir +#@ } +#@ } +#@ set old_path $auto_path +#@ } +#@ } +#@ +#@ # tcl::MacOSXPkgUnknown -- +#@ # This procedure extends the "package unknown" function for MacOSX. It scans +#@ # the Resources/Scripts directories of the immediate children of the auto_path +#@ # directories for pkgIndex files. +#@ # +#@ # Arguments: +#@ # original - original [package unknown] procedure +#@ # name - Name of desired package. Not used. +#@ # version - Version of desired package. Not used. +#@ # exact - Either "-exact" or omitted. Not used. +#@ +#@ proc tcl::MacOSXPkgUnknown {original name args} { +#@ # First do the cross-platform default search +#@ uplevel 1 $original [linsert $args 0 $name] +#@ +#@ # Now do MacOSX specific searching +#@ global auto_path +#@ +#@ if {![info exists auto_path]} { +#@ return +#@ } +#@ # Cache the auto_path, because it may change while we run through the +#@ # first set of pkgIndex.tcl files +#@ set old_path [set use_path $auto_path] +#@ while {[llength $use_path]} { +#@ set dir [lindex $use_path end] +#@ +#@ # Make sure we only scan each directory one time. +#@ if {[info exists tclSeenPath($dir)]} { +#@ set use_path [lrange $use_path 0 end-1] +#@ continue +#@ } +#@ set tclSeenPath($dir) 1 +#@ +#@ # get the pkgIndex files out of the subdirectories +#@ foreach file [glob -directory $dir -join -nocomplain * Resources Scripts pkgIndex.tcl] { +#@ set dir [file dirname $file] +#@ if {![info exists procdDirs($dir)]} { +#@ try { +#@ source $file +#@ } trap {POSIX EACCES} {} { +#@ # $file was not readable; silently ignore +#@ continue +#@ } on error msg { +#@ tclLog "error reading package index file $file: $msg" +#@ } on ok {} { +#@ set procdDirs($dir) 1 +#@ } +#@ } +#@ } +#@ set use_path [lrange $use_path 0 end-1] +#@ +#@ # Check whether any of the index scripts we [source]d above set a new +#@ # value for $::auto_path. If so, then find any new directories on the +#@ # $::auto_path, and lappend them to the $use_path we are working from. +#@ # This gives index scripts the (arguably unwise) power to expand the +#@ # index script search path while the search is in progress. +#@ set index 0 +#@ if {[llength $old_path] == [llength $auto_path]} { +#@ foreach dir $auto_path old $old_path { +#@ if {$dir ne $old} { +#@ # This entry in $::auto_path has changed. +#@ break +#@ } +#@ incr index +#@ } +#@ } +#@ +#@ # $index now points to the first element of $auto_path that has +#@ # changed, or the beginning if $auto_path has changed length Scan the +#@ # new elements of $auto_path for directories to add to $use_path. +#@ # Don't add directories we've already seen, or ones already on the +#@ # $use_path. +#@ foreach dir [lrange $auto_path $index end] { +#@ if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { +#@ lappend use_path $dir +#@ } +#@ } +#@ set old_path $auto_path +#@ } +#@ } +#@ +#@ # ::tcl::Pkg::Create -- +#@ # +#@ # Given a package specification generate a "package ifneeded" statement +#@ # for the package, suitable for inclusion in a pkgIndex.tcl file. +#@ # +#@ # Arguments: +#@ # args arguments used by the Create function: +#@ # -name packageName +#@ # -version packageVersion +#@ # -load {filename ?{procs}?} +#@ # ... +#@ # -source {filename ?{procs}?} +#@ # ... +#@ # +#@ # Any number of -load and -source parameters may be +#@ # specified, so long as there is at least one -load or +#@ # -source parameter. If the procs component of a module +#@ # specifier is left off, that module will be set up for +#@ # direct loading; otherwise, it will be set up for lazy +#@ # loading. If both -source and -load are specified, the +#@ # -load'ed files will be loaded first, followed by the +#@ # -source'd files. +#@ # +#@ # Results: +#@ # An appropriate "package ifneeded" statement for the package. +#@ +#@ proc ::tcl::Pkg::Create {args} { +#@ append err(usage) "[lindex [info level 0] 0] " +#@ append err(usage) "-name packageName -version packageVersion" +#@ append err(usage) "?-load {filename ?{procs}?}? ... " +#@ append err(usage) "?-source {filename ?{procs}?}? ..." +#@ +#@ set err(wrongNumArgs) "wrong # args: should be \"$err(usage)\"" +#@ set err(valueMissing) "value for \"%s\" missing: should be \"$err(usage)\"" +#@ set err(unknownOpt) "unknown option \"%s\": should be \"$err(usage)\"" +#@ set err(noLoadOrSource) "at least one of -load and -source must be given" +#@ +#@ # process arguments +#@ set len [llength $args] +#@ if {$len < 6} { +#@ error $err(wrongNumArgs) +#@ } +#@ +#@ # Initialize parameters +#@ array set opts {-name {} -version {} -source {} -load {}} +#@ +#@ # process parameters +#@ for {set i 0} {$i < $len} {incr i} { +#@ set flag [lindex $args $i] +#@ incr i +#@ switch -glob -- $flag { +#@ "-name" - +#@ "-version" { +#@ if {$i >= $len} { +#@ error [format $err(valueMissing) $flag] +#@ } +#@ set opts($flag) [lindex $args $i] +#@ } +#@ "-source" - +#@ "-load" { +#@ if {$i >= $len} { +#@ error [format $err(valueMissing) $flag] +#@ } +#@ lappend opts($flag) [lindex $args $i] +#@ } +#@ default { +#@ error [format $err(unknownOpt) [lindex $args $i]] +#@ } +#@ } +#@ } +#@ +#@ # Validate the parameters +#@ if {![llength $opts(-name)]} { +#@ error [format $err(valueMissing) "-name"] +#@ } +#@ if {![llength $opts(-version)]} { +#@ error [format $err(valueMissing) "-version"] +#@ } +#@ +#@ if {!([llength $opts(-source)] || [llength $opts(-load)])} { +#@ error $err(noLoadOrSource) +#@ } +#@ +#@ # OK, now everything is good. Generate the package ifneeded statment. +#@ set cmdline "package ifneeded $opts(-name) $opts(-version) " +#@ +#@ set cmdList {} +#@ set lazyFileList {} +#@ +#@ # Handle -load and -source specs +#@ foreach key {load source} { +#@ foreach filespec $opts(-$key) { +#@ lassign $filespec filename proclist +#@ +#@ if { [llength $proclist] == 0 } { +#@ set cmd "\[list $key \[file join \$dir [list $filename]\]\]" +#@ lappend cmdList $cmd +#@ } else { +#@ lappend lazyFileList [list $filename $key $proclist] +#@ } +#@ } +#@ } +#@ +#@ if {[llength $lazyFileList]} { +#@ lappend cmdList "\[list tclPkgSetup \$dir $opts(-name) $opts(-version) [list $lazyFileList]\]" +#@ } +#@ append cmdline [join $cmdList "\\n"] +#@ return $cmdline +#@ } +#@ +#@ interp alias {} ::pkg::create {} ::tcl::Pkg::Create +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/package.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/pkgIndex.tcl + +#@ # Copyright (c) 2016 Synopsys, Inc. This Synopsys software and all +#@ # associated documentation are proprietary to Synopsys, Inc. and may +#@ # only be used pursuant to the terms and conditions of a written +#@ # license agreement with Synopsys, Inc. All other use, reproduction, +#@ # modification, or distribution of the Synopsys software or the +#@ # associated documentation is strictly prohibited. +#@ +#@ package ifneeded cae 1.0 [list source [file join $dir syn.tcl]] +#@ package ifneeded cae::utils 1.0 [list source [file join $dir utils utils.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/iwidgets4.1/pkgIndex.tcl + +#@ # Tcl package index file +#@ package ifneeded iwidgets 4.1 " +#@ package require itk 4 +#@ namespace eval ::iwidgets { +#@ namespace export * +#@ variable library [file dirname [info script]] +#@ variable version 4.1 +#@ } +#@ source [file join $dir colors.itcl] +#@ source [file join $dir roman.itcl] +#@ source [file join $dir buttonbox.itk] +#@ source [file join $dir calendar.itk] +#@ source [file join $dir canvasprintbox.itk] +#@ source [file join $dir shell.itk] +#@ source [file join $dir dialogshell.itk] +#@ source [file join $dir dialog.itk] +#@ source [file join $dir canvasprintdialog.itk] +#@ source [file join $dir labeledframe.itk] +#@ source [file join $dir checkbox.itk] +#@ source [file join $dir labeledwidget.itk] +#@ source [file join $dir entryfield.itk] +#@ source [file join $dir combobox.itk] +#@ source [file join $dir datefield.itk] +#@ source [file join $dir dateentry.itk] +#@ source [file join $dir disjointlistbox.itk] +#@ source [file join $dir extbutton.itk] +#@ source [file join $dir extfileselectionbox.itk] +#@ source [file join $dir extfileselectiondialog.itk] +#@ source [file join $dir feedback.itk] +#@ source [file join $dir fileselectionbox.itk] +#@ source [file join $dir fileselectiondialog.itk] +#@ source [file join $dir finddialog.itk] +#@ source [file join $dir scrolledwidget.itk] +#@ source [file join $dir hierarchy.itk] +#@ source [file join $dir hyperhelp.itk] +#@ source [file join $dir mainwindow.itk] +#@ source [file join $dir menubar.itk] +#@ source [file join $dir messagebox.itk] +#@ source [file join $dir messagedialog.itk] +#@ source [file join $dir notebook.itk] +#@ source [file join $dir optionmenu.itk] +#@ source [file join $dir panedwindow.itk] +#@ source [file join $dir pane.itk] +#@ source [file join $dir promptdialog.itk] +#@ source [file join $dir pushbutton.itk] +#@ source [file join $dir radiobox.itk] +#@ source [file join $dir regexpfield.itk] +#@ source [file join $dir scrolledcanvas.itk] +#@ source [file join $dir scrolledframe.itk] +#@ source [file join $dir scrolledtext.itk] +#@ source [file join $dir scrolledhtml.itk] +#@ source [file join $dir scrolledlistbox.itk] +#@ source [file join $dir selectionbox.itk] +#@ source [file join $dir selectiondialog.itk] +#@ source [file join $dir spindate.itk] +#@ source [file join $dir spinner.itk] +#@ source [file join $dir spinint.itk] +#@ source [file join $dir spintime.itk] +#@ source [file join $dir tabnotebook.itk] +#@ source [file join $dir tabset.itk] +#@ source [file join $dir timefield.itk] +#@ source [file join $dir timeentry.itk] +#@ source [file join $dir toolbar.itk] +#@ source [file join $dir watch.itk] +#@ package provide iwidgets 4.1 +#@ " +#@ +#@ package ifneeded Iwidgets 4.1 " +#@ package require iwidgets 4.1 +#@ package provide Iwidgets 4.1 +#@ " +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/iwidgets4.1/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsTclPro/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ package ifneeded snpsTclPro 1.0 [list source [file join $dir snpsTclPro.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsTclPro/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsTest/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ package ifneeded snpsTest 1.0 [list source [file join $dir snpsTest.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsTest/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsUtils/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ package ifneeded snpsUtils 1.0 [list source [file join $dir snpsUtils.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/snpsUtils/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/pkgIndex.tcl + +#@ package ifneeded Itcl 3.4 {load {} Itcl} +#@ package ifneeded tbcload 1.7 {load {} tbcload} +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/snps_tcl/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/reg/pkgIndex.tcl + +#@ if {([info commands ::tcl::pkgconfig] eq "") +#@ || ([info sharedlibextension] ne ".dll")} return +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/reg/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/dde/pkgIndex.tcl + +#@ if {([info commands ::tcl::pkgconfig] eq "") +#@ || ([info sharedlibextension] ne ".dll")} return +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/dde/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/platform/pkgIndex.tcl + +#@ package ifneeded platform 1.0.13 [list source [file join $dir platform.tcl]] +#@ package ifneeded platform::shell 1.1.4 [list source [file join $dir shell.tcl]] +#@ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/platform/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/tcltest/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ if {![package vsatisfies [package provide Tcl] 8.5]} {return} +#@ package ifneeded tcltest 2.3.8 [list source [file join $dir tcltest.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/tcltest/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/http/pkgIndex.tcl + +#@ if {![package vsatisfies [package provide Tcl] 8.6]} {return} +#@ package ifneeded http 2.8.8 [list tclPkgSetup $dir http 2.8.8 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister ::http::mapReply}}}] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/http/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/msgcat/pkgIndex.tcl + +#@ if {![package vsatisfies [package provide Tcl] 8.5]} {return} +#@ package ifneeded msgcat 1.5.2 [list source [file join $dir msgcat.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/msgcat/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/http1.0/pkgIndex.tcl + +#@ # Tcl package index file, version 1.0 +#@ # This file is generated by the "pkg_mkIndex" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ package ifneeded http 1.0 [list tclPkgSetup $dir http 1.0 {{http.tcl source {httpCopyDone httpCopyStart httpEof httpEvent httpFinish httpMapReply httpProxyRequired http_code http_config http_data http_formatQuery http_get http_reset http_size http_status http_wait}}}] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/http1.0/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/opt/pkgIndex.tcl + +#@ # Tcl package index file, version 1.1 +#@ # This file is generated by the "pkg_mkIndex -direct" command +#@ # and sourced either when an application starts up or +#@ # by a "package unknown" script. It invokes the +#@ # "package ifneeded" command to set up package-related +#@ # information so that packages will be loaded automatically +#@ # in response to "package require" commands. When this +#@ # script is sourced, the variable $dir must contain the +#@ # full path name of this file's directory. +#@ +#@ if {![package vsatisfies [package provide Tcl] 8.2]} {return} +#@ package ifneeded opt 0.4.6 [list source [file join $dir optparse.tcl]] +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/tcllib/lib/tcl8.6/opt/pkgIndex.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/syn.tcl + +#@ # Copyright (c) 2016 Synopsys, Inc. This Synopsys software and all +#@ # associated documentation are proprietary to Synopsys, Inc. and may +#@ # only be used pursuant to the terms and conditions of a written +#@ # license agreement with Synopsys, Inc. All other use, reproduction, +#@ # modification, or distribution of the Synopsys software or the +#@ # associated documentation is strictly prohibited. +#@ +#@ # primary file of syn package +#@ +#@ # require all the sub-packages (if any) +#@ +#@ # name of the provided package +#@ +#@ package provide cae 1.0 +#@ +#@ # create command group after loading sub packages +#@ # because last group is listed first by "help" +#@ +#@ create_command_group "syn" -info "synthesis utilities" +#@ +#@ namespace eval ::cae { +#@ variable selfdir [file dirname [info script]] +#@ variable scripts [list auto_path_groups.tcl ] +#@ variable script +#@ } +#@ +#@ # source encrypted version if available +#@ # encrypted commands must use "define_proc_attributes -hide_body" +#@ +#@ foreach ::cae::script ${::cae::scripts} { +#@ if { [file exists ${::cae::selfdir}/${::cae::script}.e] } { +#@ source ${::cae::selfdir}/${::cae::script}.e +#@ } else { +#@ source ${::cae::selfdir}/${::cae::script} +#@ } +#@ } +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/auto_path_groups.tcl + +#@ # Copyright (c) 2016-2017 Synopsys, Inc. This Synopsys software and all +#@ # associated documentation are proprietary to Synopsys, Inc. and may +#@ # only be used pursuant to the terms and conditions of a written +#@ # license agreement with Synopsys, Inc. All other use, reproduction, +#@ # modification, or distribution of the Synopsys software or the +#@ # associated documentation is strictly prohibited. +#@ +#@ package require cae::utils +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/utils/utils.tcl + +#@ # Copyright (c) 2016 Synopsys, Inc. This Synopsys software and all +#@ # associated documentation are proprietary to Synopsys, Inc. and may +#@ # only be used pursuant to the terms and conditions of a written +#@ # license agreement with Synopsys, Inc. All other use, reproduction, +#@ # modification, or distribution of the Synopsys software or the +#@ # associated documentation is strictly prohibited. +#@ +#@ # primary file of cae::utils package +#@ +#@ # name of the provided package +#@ +#@ package provide cae::utils 1.0 +#@ +#@ namespace eval ::cae::utils { +#@ } +#@ +#@ proc ::cae::utils::msg { type s } { +#@ switch -glob -- ${type} { +#@ i* { return "INFO: ${s}" } +#@ w* { return "WARNING: ${s}" } +#@ e* { return "ERROR: ${s}" } +#@ } +#@ return +#@ } +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/utils/utils.tcl + +#@ +#@ namespace eval ::cae { +#@ +#@ # note: check if these are all necessary +#@ variable auto_path_groups_messages {ATTR-3 OPT-806 OPT-774 UID-101 TIM-134 TIM-99 OPT-806 MWUI-203 MW-212 TIM-112} +#@ +#@ # default prefix for path groups +#@ variable auto_path_groups_prefix synopsys_pg_ +#@ # default slack for path groups +#@ variable auto_path_groups_slack 0.0 +#@ # default max for path groups +#@ variable auto_path_groups_max 0 +#@ # default verbosity +#@ variable auto_path_groups_verbose false +#@ # default priority +#@ variable auto_path_groups_priority 1 +#@ # default min_regs_per_hierarchy +#@ variable auto_path_groups_min_regs_per_hierarchy 10 +#@ # registers path group suffix +#@ variable auto_path_groups_reg_suffix to_regs_ +#@ # macro path group suffix +#@ variable auto_path_groups_to_macro_suffix to_macros_ +#@ # macro path group suffix +#@ variable auto_path_groups_from_macro_suffix from_macros_ +#@ # ICG path group suffix +#@ variable auto_path_groups_icg_suffix to_ICGs +#@ # input path group suffix +#@ variable auto_path_groups_input_suffix inputs +#@ # output path group suffix +#@ variable auto_path_groups_output_suffix outputs +#@ # feedthrough path group suffix +#@ variable auto_path_groups_feedthrough_suffix feedthrough +#@ # user path groups +#@ variable auto_path_groups_user_path_groups_file auto_path_groups.user_path_groups.tcl +#@ } +#@ +#@ proc create_auto_path_groups { args } { +#@ variable ::cae::auto_path_groups_messages +#@ variable ::cae::auto_path_groups_prefix +#@ variable ::cae::auto_path_groups_slack +#@ variable ::cae::auto_path_groups_max +#@ variable ::cae::auto_path_groups_verbose +#@ variable ::cae::auto_path_groups_priority +#@ variable ::cae::auto_path_groups_min_regs_per_hierarchy +#@ variable ::cae::auto_path_groups_reg_suffix +#@ variable ::cae::auto_path_groups_to_macro_suffix +#@ variable ::cae::auto_path_groups_from_macro_suffix +#@ variable ::cae::auto_path_groups_icg_suffix +#@ variable ::cae::auto_path_groups_input_suffix +#@ variable ::cae::auto_path_groups_output_suffix +#@ variable ::cae::auto_path_groups_feedthrough_suffix +#@ variable ::cae::auto_path_groups_user_path_groups_file +#@ +#@ set options(-slack) ${auto_path_groups_slack} +#@ set options(-max) ${auto_path_groups_max} +#@ set options(-prefix) ${auto_path_groups_prefix} +#@ set options(-verbose) ${auto_path_groups_verbose} +#@ set options(-priority) ${auto_path_groups_priority} +#@ set options(-min_regs_per_hierarchy) ${auto_path_groups_min_regs_per_hierarchy} +#@ set options(-exclude) [list] +#@ set options(-user_path_groups_file) ${auto_path_groups_user_path_groups_file} +#@ +#@ parse_proc_arguments -args ${args} options +#@ +#@ if { [info exists options(-file)] } { +#@ if { [catch {open $options(-file) w} fileId] } { +#@ return -code error [::cae::utils::msg e ${fileId}] +#@ } +#@ } +#@ +#@ # save user path groups +#@ if { ![info exists options(-skip)] } { +#@ echo [::cae::utils::msg i "Saving user path groups to $options(-user_path_groups_file)..."] +#@ if { [file exist $options(-user_path_groups_file)] } { +#@ echo [::cae::utils::msg w "File $options(-user_path_groups_file) already exists and will be overwritten..."] +#@ } +#@ if { [catch {open "| grep \"^group_path\" > $options(-user_path_groups_file)" w} channelId] } { +#@ return -code error [::cae::utils::msg e ${channelId}] +#@ } +#@ redirect -channel ${channelId} { write_script -nosplit } +#@ set r [catch {close ${channelId}} msg] +#@ switch ${r} { +#@ 0 { echo [::cae::utils::msg i "User path groups saved"] } +#@ 1 { echo [::cae::utils::msg i "No user path groups to save"] } +#@ default { return -code error [::cae::utils::msg e ${msg}] } +#@ } +#@ } +#@ +#@ set total 0 +#@ +#@ suppress_message ${auto_path_groups_messages} +#@ switch -- $options(-mode) { +#@ "rtl" { +#@ # create one path group per hierarchy +#@ +#@ echo [::cae::utils::msg i "Collecting hierarchies without optimize_registers..."] +#@ set optimize_registers_cells [get_cells -hier -filter {is_hierarchical==true && optimize_registers==true}] +#@ if { $options(-verbose) } { +#@ set optimize_registers_cells_names [lsort [get_object_name ${optimize_registers_cells}]] +#@ echo [::cae::utils::msg i "cells with optimize_registers: ${optimize_registers_cells_names}"] +#@ } +#@ set optimize_registers_sub_cells {} +#@ foreach_in_collection cell ${optimize_registers_cells} { +#@ redirect -file /dev/null {current_instance ${cell}} +#@ append_to_collection optimize_registers_sub_cells [get_cells -hier -filter {is_hierarchical==true && (optimize_registers==false || undefined(optimize_registers))}] +#@ } +#@ redirect -file /dev/null {current_instance} +#@ if { $options(-verbose) } { +#@ set optimize_registers_sub_cells_names [lsort [get_object_name ${optimize_registers_sub_cells}]] +#@ echo [::cae::utils::msg i "sub-cells of cells with optimize_registers: ${optimize_registers_sub_cells_names}"] +#@ } +#@ set path_group_cells [get_cells -hier -filter {is_hierarchical==true && is_sequential==true && (optimize_registers==false || undefined(optimize_registers))}] +#@ set path_group_cells [remove_from_collection ${path_group_cells} ${optimize_registers_sub_cells}] +#@ +#@ echo [::cae::utils::msg i "Collected [sizeof_collection ${path_group_cells}] hierarchies without optimize_registers"] +#@ +#@ set path_group_names [lsort [get_object_name ${path_group_cells}]] +#@ +#@ if { $options(-verbose) } { +#@ echo [::cae::utils::msg i "cells for which path groups will be created:"] +#@ foreach path_group_name ${path_group_names} { +#@ echo [::cae::utils::msg i " ${path_group_name}"] +#@ } +#@ } +#@ +#@ echo [::cae::utils::msg i "Creating path groups for hierarchies without optimize_registers..."] +#@ set counter 0 +#@ foreach path_group_name ${path_group_names} { +#@ set number_of_registers [sizeof_collection [get_cells ${path_group_name}/* -filter "is_hierarchical==false && is_sequential==true"]] +#@ if { ${number_of_registers} > $options(-min_regs_per_hierarchy) } { +#@ echo [::cae::utils::msg i "Number of sequential cells found in ${path_group_name} hierarchy: ${number_of_registers}"] +#@ set command "group_path -name $options(-prefix)${auto_path_groups_reg_suffix}${counter} -to \[get_cells ${path_group_name}/* -filter \"is_hierarchical==false && is_sequential==true\"\] -priority $options(-priority)" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ } else { +#@ echo [::cae::utils::msg i "Not enough sequential cells found in ${path_group_name} hierarchy (${number_of_registers}), skipping..."] +#@ } +#@ } +#@ echo [::cae::utils::msg i "Number of reg path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ } +#@ "mapped" { +#@ # create one path group per hierarchy not meeting timing +#@ +#@ array unset fail +#@ echo [::cae::utils::msg i "Collecting hierarchies with timing violations..."] +#@ foreach_in_collection pin [all_registers -data_pins] { +#@ set slack [get_attribute ${pin} max_slack] +#@ if { ${slack} < $options(-slack) && ${slack} != "" } { +#@ set cell [get_cells -of_objects ${pin}] +#@ set full_name [get_attribute ${cell} full_name] +#@ set name [get_attribute ${cell} name] +#@ if {[string length ${full_name}] > [string length ${name}]} { +#@ set length [expr [string length ${full_name}] - [string length ${name}] - 1] +#@ set hierarchy [string range ${full_name} 0 [expr ${length} - 1]] +#@ } else { +#@ set hierarchy "" +#@ } +#@ if { ![info exists fail(${hierarchy})] || +#@ ([info exists fail(${hierarchy})] && ${slack} < $fail(${hierarchy})) } { +#@ set fail(${hierarchy}) ${slack} +#@ } +#@ } +#@ } +#@ echo [::cae::utils::msg i "Collected [array size fail] hierarchies with timing violations"] +#@ +#@ if { $options(-max) > 0 } { +#@ echo [::cae::utils::msg i "Keeping only $options(-max) hierarchies with worst timing violations"] +#@ set hierarchy_slack_list [lsort -stride 2 -index 1 -real -increasing [array get fail]] +#@ set hierarchy_slack_list [lrange ${hierarchy_slack_list} 0 [expr {2 * $options(-max) - 1}]] +#@ array unset fail +#@ array set fail ${hierarchy_slack_list} +#@ } +#@ +#@ set path_group_names [lsort [array names fail]] +#@ +#@ if { $options(-verbose) } { +#@ echo [::cae::utils::msg i "hierarchies for which path groups will be created:"] +#@ foreach path_group_name ${path_group_names} { +#@ echo [::cae::utils::msg i " ${path_group_name} $fail(${path_group_name})"] +#@ } +#@ } +#@ +#@ echo [::cae::utils::msg i "Creating path groups for hierarchies with timing violations..."] +#@ set counter 0 +#@ foreach path_group_name ${path_group_names} { +#@ if { ${path_group_name} == "" } { +#@ set command "group_path -name $options(-prefix)${auto_path_groups_reg_suffix}${counter} -to \[get_cells * -filter {is_hierarchical==false && is_sequential==true}\] -priority $options(-priority)" +#@ } else { +#@ set command "group_path -name $options(-prefix)${auto_path_groups_reg_suffix}${counter} -to \[get_cells ${path_group_name}/* -filter {is_hierarchical==false && is_sequential==true}\] -priority $options(-priority)" +#@ } +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ } +#@ echo [::cae::utils::msg i "Number of reg path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ +#@ } +#@ +#@ } +#@ +#@ # macro path groups +#@ if { [lsearch $options(-exclude) macro] == -1} { +#@ echo [::cae::utils::msg i "Creating macro path groups..."] +#@ if { [shell_is_in_topographical_mode] } { +#@ #set macro_cells [all_macro_cells] +#@ set macro_cells [remove_from_collection [all_macro_cells] [get_cells -quiet -hier -all -filter "is_physical_only==true"]] +#@ } else { +#@ set macro_cells [get_cells -hier * -filter "is_macro_cell == true"] +#@ } +#@ if { [sizeof_collection ${macro_cells}] != 0 } { +#@ set path_group_names [get_object_name ${macro_cells}] +#@ set counter 0 +#@ foreach path_group_name ${path_group_names} { +#@ set command "group_path -name $options(-prefix)${auto_path_groups_to_macro_suffix}${counter} -to \[get_cells ${path_group_name}\] -priority $options(-priority)" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ set command "group_path -name $options(-prefix)${auto_path_groups_from_macro_suffix}${counter} -from \[get_cells ${path_group_name}\] -priority $options(-priority)" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ } +#@ echo [::cae::utils::msg i "Number of macro path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ } else { +#@ echo [::cae::utils::msg i "No macro found, skipping..."] +#@ } +#@ } +#@ +#@ # ICG path groups +#@ if { [lsearch $options(-exclude) ICG] == -1} { +#@ echo [::cae::utils::msg i "Creating ICG path groups..."] +#@ set all_icg_cells [get_cells -hier -filter "full_name=~*latch || full_name=~*u_clkgate && defined(clock_gating_integrated_cell)"] +#@ if { [sizeof_collection ${all_icg_cells}] } { +#@ set counter 0 +#@ set command "group_path -name $options(-prefix)${auto_path_groups_icg_suffix} -to \[get_cells -hier -filter \"full_name=~*latch || full_name=~*u_clkgate && defined(clock_gating_integrated_cell)\"\] -priority $options(-priority)" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ echo [::cae::utils::msg i "Number of ICG path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ } else { +#@ echo [::cae::utils::msg i "No ICG found, skipping..."] +#@ } +#@ } +#@ +#@ # IO path groups +#@ if { [lsearch $options(-exclude) IO] == -1} { +#@ echo [::cae::utils::msg i "Creating IO path groups..."] +#@ set counter 0 +#@ set command "group_path -name $options(-prefix)${auto_path_groups_input_suffix} -from \[ remove_from_collection \[all_inputs\] \[get_ports \[get_attribute \[get_clocks -filter defined(sources)\] sources\]\] \]" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ set command "group_path -name $options(-prefix)${auto_path_groups_output_suffix} -to \[all_outputs\]" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ set command "group_path -name $options(-prefix)${auto_path_groups_feedthrough_suffix} -from \[ remove_from_collection \[all_inputs\] \[get_ports \[get_attribute \[get_clocks -filter defined(sources)\] sources\]\] \] -to \[all_outputs\]" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ incr counter +#@ echo [::cae::utils::msg i "Number of IO path groups created: ${counter}"] +#@ set total [expr {${total} + ${counter}}] +#@ } +#@ +#@ unsuppress_message ${auto_path_groups_messages} +#@ +#@ echo [::cae::utils::msg i "Total number of path groups created: ${total}"] +#@ +#@ if { [info exists options(-file)] } { +#@ close ${fileId} +#@ } +#@ +#@ return +#@ } +#@ +#@ define_proc_attributes create_auto_path_groups -command_group syn -dont_abbrev -hide_body -info "Creates path groups for current design" -define_args { +#@ { -mode "creates path groups for unmapped/mapped netlist" mode one_of_string {required value_help {values {rtl mapped}}} } +#@ { -exclude "excludes specific path groups (IO ICG macro) (default: empty list)" list list {optional} } +#@ { -slack "slack value used to select hierarchy violating timing (default: 0.0) - mapped mode only" slack float optional } +#@ { -max "maximum number of paths groups (default: 0=unlimited) - mapped mode only" max int optional } +#@ { -min_regs_per_hierarchy "minimum number of registers per hierarchy (default: 10) - rtl mode only" min_regs int optional } +#@ { -prefix "path group name prefix (default: synopsys_pg_)" prefix string optional } +#@ { -file "file name to dump group_path commands" file_name string optional } +#@ { -verbose "verbose mode" "" boolean optional } +#@ { -user_path_groups_file "save user path groups to this file" file_name string optional } +#@ { -skip "do not save user path groups" "" boolean optional } +#@ } +#@ +#@ proc remove_auto_path_groups { args } { +#@ variable ::cae::auto_path_groups_messages +#@ variable ::cae::auto_path_groups_prefix +#@ variable ::cae::auto_path_groups_verbose +#@ variable ::cae::auto_path_groups_user_path_groups_file +#@ +#@ set options(-prefix) ${auto_path_groups_prefix} +#@ set options(-verbose) ${auto_path_groups_verbose} +#@ set options(-user_path_groups_file) ${auto_path_groups_user_path_groups_file} +#@ +#@ parse_proc_arguments -args ${args} options +#@ +#@ if { [info exists options(-file)] } { +#@ if {[catch {open $options(-file) w } fileId] } { +#@ return -code error [::cae::utils::msg e ${fileId}] +#@ } +#@ } +#@ +#@ suppress_message ${auto_path_groups_messages} +#@ set path_group_names [get_object_name [get_path_group -filter "full_name =~ $options(-prefix)*"]] +#@ foreach path_group_name ${path_group_names} { +#@ set command "remove_path_group ${path_group_name}" +#@ echo [::cae::utils::msg i ${command}] +#@ if { [info exists options(-file)] } { +#@ puts ${fileId} ${command} +#@ } +#@ eval ${command} +#@ } +#@ echo [::cae::utils::msg i "Number of path groups removed: [llength ${path_group_names}]"] +#@ unsuppress_message ${auto_path_groups_messages} +#@ +#@ if { [info exists options(-file)] } { +#@ close ${fileId} +#@ } +#@ +#@ # restore user path groups +#@ if { ![info exists options(-skip)] } { +#@ echo [::cae::utils::msg i "Restoring user path groups from $options(-user_path_groups_file)..."] +#@ if { [file exist $options(-user_path_groups_file)] } { +#@ if { [file size $options(-user_path_groups_file)] != 0} { +#@ source -continue_on_error $options(-user_path_groups_file) +#@ } else { +#@ echo [::cae::utils::msg i "No user path groups to restore"] +#@ } +#@ file delete -force $options(-user_path_groups_file) +#@ } else { +#@ echo [::cae::utils::msg w "File $options(-user_path_groups_file) doesn't exist"] +#@ } +#@ } +#@ +#@ return +#@ } +#@ +#@ define_proc_attributes remove_auto_path_groups -command_group syn -dont_abbrev -hide_body -info "Removes path groups for current design" -define_args { +#@ { -prefix "path group name prefix (default: synopsys_pg)" prefix string optional } +#@ { -file "file name to dump group_path commands" file_name string optional } +#@ { -verbose "verbose mode" "" boolean optional } +#@ { -user_path_groups_file "restore user path groups from this file" file_name string optional } +#@ { -skip "do not restore user path groups" "" boolean optional } +#@ } +#@ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/auto_path_groups.tcl + +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lib/syn.tcl + +#@ +#@ if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ set sh_enable_line_editing "true" +#@ set sh_line_editing_mode "emacs" +#@ } +#@ +#@ if {$synopsys_program_name == "icc_shell"} { +#@ if {"$sh_output_log_file" == ""} { +#@ set sh_output_log_file "icc_output.txt" +#@ } +#@ +#@ ## the variable sh_redirect_progress_messages only makes it possible +#@ ## for some commands to redirect progress messages to the log file,thereby +#@ ## bypassing the console and reducing the volume of messages on the console. +#@ set sh_redirect_progress_messages true +#@ } +#@ +#@ +#@ # Suppress new variable messages for the following variables +#@ array set auto_index {} +#@ set auto_oldpath "" +#@ +#@ # Enable customer support banner on fatal +#@ if { $sh_arch == "linux" || $sh_arch == "amd64" || $sh_arch == "linux64" || $sh_arch == "suse32" || $sh_arch == "suse64" || $sh_arch == "sparcOS5" || $sh_arch == "sparc64" || $sh_arch == "x86sol32" || $sh_arch == "x86sol64" || $sh_arch == "rs6000" || $sh_arch == "aix64" } { +#@ setenv SYNOPSYS_TRACE "" +#@ } +#@ +#@ # +#@ # Load the procedures which make up part of the user interface. +#@ # +#@ if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ source $synopsys_root/auxx/syn/.dc_common_procs.tcl +#@ if {$synopsys_program_name != "dc_sms_shell"} { +#@ source $synopsys_root/auxx/syn/.dc_procs.tcl +#@ } +#@ alias list_commands help +#@ } +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/.dc_common_procs.tcl + +#@ ############################################################################## +#@ # +#@ # +#@ # FILE: auxx/syn/.dc_common_procs.tcl +#@ # +#@ # ABSTRACT: These procedures are part of the PrimeTime and DC +#@ # user interface. +#@ # They are loaded by .synopsys_pt.setup and .synopsys_dc.setup. +#@ # +#@ ############################################################################## +#@ # +#@ # +#@ +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: group_variable +#@ # +#@ # ABSTRACT: Add a variable to the specified variable group. +#@ # This command is typically used by the system +#@ # administrator only. +#@ # +#@ # Below the proc is the command which creates the command +#@ # help information and semantic data for the argument. +#@ # +#@ # RETURNS: 1 if it is successful. +#@ # error code if the variable does not exist. +#@ # error code of the variable is already in the group. +#@ # +#@ # SYNTAX: group_variable group_name variable_name +#@ # +#@ ############################################################################## +#@ # +#@ +#@ +#@ proc group_variable { args } { +#@ global _Variable_Groups +#@ +#@ parse_proc_arguments -args $args resarr +#@ set group $resarr(group) +#@ set var $resarr(variable_name) +#@ +#@ if { ![info exists _Variable_Groups($group)] } { +#@ set _Variable_Groups($group) "" +#@ } +#@ +#@ # Verify that var exists as a global variable +#@ +#@ set cmd "uplevel #0 \{info exists $var\}" +#@ if { ![eval $cmd] } { +#@ return -code error "Variable '$var' is not defined." +#@ } +#@ +#@ # Only add it if it's not already there +#@ +#@ if { [lsearch $_Variable_Groups($group) $var] == -1 } { +#@ lappend _Variable_Groups($group) $var +#@ } +#@ +#@ return 1 +#@ } +#@ +#@ define_proc_attributes group_variable -info "Add a variable to a variable group" -command_group "Builtins" -permanent -dont_abbrev -define_args { +#@ {group "Variable group name" group} +#@ {variable_name "Variable name" variable_name}} +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: print_variable_group +#@ # +#@ # ABSTRACT: Shows variables and their values defined in the given group. +#@ +#@ # +#@ # Below the proc is the command which creates the command +#@ # help information and semantic data for the argument. +#@ # +#@ # RETURNS: 1 if it is successful. +#@ # error code of the variable group does not exist. +#@ # +#@ # SYNTAX: print_variable_group group_name +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc print_variable_group { args } { +#@ global _Variable_Groups +#@ +#@ parse_proc_arguments -args $args resarr +#@ set group $resarr(group) +#@ +#@ if { [string compare $group "all"] == 0 } { +#@ set cmd "uplevel #0 \{printvar\}" +#@ return [eval $cmd] +#@ } +#@ +#@ if { ![info exists _Variable_Groups($group)] } { +#@ return -code error "Variable group '$group' does not exist." +#@ } +#@ +#@ # Print out each global variable in the list. To be totally bulletproof, +#@ # test that each variable in the group is still defined. If not, remove +#@ # it from the list. +#@ +#@ foreach var [lsort $_Variable_Groups($group)] { +#@ set cmd "uplevel #0 \{info exists $var\}" +#@ if { ![eval $cmd] } { +#@ # Remove it +#@ set n [lsearch $_Variable_Groups($group) $var] +#@ set $_Variable_Groups($group) [lreplace $_Variable_Groups($group) $n $n] +#@ } else { +#@ # Print it. +#@ set cmd "uplevel #0 \{set $var\}" +#@ set val [eval $cmd] +#@ echo [format "%-25s = \"%s\"" $var $val] +#@ } +#@ } +#@ +#@ return 1 +#@ } +#@ +#@ define_proc_attributes print_variable_group -info "Print the contents of a variable group" -command_group "Builtins" -permanent -define_args {{group "Variable group name" group}} +#@ +#@ +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: _Variable_Groups_Get_Groups +#@ # +#@ # ABSTRACT: Return a list of all variable groups. This command is hidden +#@ # and is used by Design Vision. +#@ # +#@ # RETURNS: Tcl list of all variable groups including group all +#@ # +#@ # SYNTAX: _Variable_Groups_Get_Groups +#@ ############################################################################## +#@ # +#@ +#@ proc _Variable_Groups_Get_Groups { } { +#@ global _Variable_Groups +#@ +#@ set groups [array names _Variable_Groups] +#@ append groups " all" +#@ return $groups +#@ } +#@ define_proc_attributes _Variable_Groups_Get_Groups -hidden +#@ +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: _Variable_Groups_Get_Variables_Of_Group +#@ # +#@ # ABSTRACT: Return a list of all variables of a variable group. +#@ # It also works for pseudo group all. +#@ # +#@ # RETURNS: Tcl list of all variables of a variable group including +#@ # pseudo group all +#@ # +#@ # SYNTAX: _Variable_Groups_Get_Groups +#@ ############################################################################## +#@ # +#@ +#@ proc _Variable_Groups_Get_Variables_Of_Group { group } { +#@ global _Variable_Groups +#@ +#@ if { [string compare $group "all"] == 0 } { +#@ set itr [array startsearch _Variable_Groups] +#@ for { } { [array anymore _Variable_Groups $itr]} { } { +#@ set index [array nextelement _Variable_Groups $itr] +#@ append vars $_Variable_Groups($index) +#@ } +#@ array donesearch _Variable_Groups $itr +#@ return $vars +#@ } +#@ +#@ if { ![info exists _Variable_Groups($group)] } { +#@ return -code error "Variable group '$group' does not exist." +#@ } +#@ +#@ # Test if all variables in the list of variables are still defined. +#@ # Remove not existing variables. +#@ foreach var [lsort $_Variable_Groups($group)] { +#@ set cmd "uplevel #0 \{info exists $var\}" +#@ if { ![eval $cmd] } { +#@ # Remove it +#@ set n [lsearch $_Variable_Groups($group) $var] +#@ set $_Variable_Groups($group) [lreplace $_Variable_Groups($group) $n $n] +#@ } +#@ } +#@ return $_Variable_Groups($group) +#@ } +#@ define_proc_attributes _Variable_Groups_Get_Variables_Of_Group -hidden +#@ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/.dc_common_procs.tcl + +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/.dc_procs.tcl + +#@ ############################################################################## +#@ # +#@ # +#@ # FILE: auxx/syn/.dc_procs.tcl +#@ # +#@ # ABSTRACT: These procedures are part of the Design Compiler Tcl +#@ # user interface. +#@ # They are loaded by .synopsys_dc.setup. +#@ # +#@ ############################################################################## +#@ # +#@ # +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_verilog +#@ # +#@ # ABSTRACT: Emulate PT's read_verilog command in DC: +#@ # +#@ # Usage: read_verilog # Read one or more verilog files +#@ # *[-hdl_compiler] (Use HDL Compiler (ignored)) +#@ # file_names (Files to read) +#@ # +#@ # Modified: Bharat 11/17/99. Use uplevel to ensure that the command +#@ # sees user/hidden variables from the top level. Star 92970. +#@ # +#@ # Modified: Evan Rosser, 12/5/01. Support -netlist and -rtl flags. +#@ # +#@ ############################################################################## +#@ # +#@ +#@ if { $synopsys_program_name != "icc_shell" } { +#@ proc read_verilog { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format verilog %s %s [list %s]} [array names ra -rtl] [array names ra -netlist] $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_verilog -info " Read one or more verilog files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-netlist "Use structural Verilog netlist reader" "" boolean optional} +#@ {-rtl "Use RTL Verilog compiler (Presto or HDLC)" "" boolean optional} +#@ {-hdl_compiler "Use HDL Compiler (ignored)" "" boolean {hidden optional}} +#@ } +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_sverilog +#@ # +#@ # ABSTRACT: Emulate PT's read_sverilog command in DC: +#@ # +#@ # Usage: read_sverilog # Read one or more systemverilog files +#@ # *[-hdl_compiler] (Use HDL Compiler (ignored)) +#@ # file_names (Files to read) +#@ # +#@ # Modified: Yong Xiao, 01/31/2003: Copied from read_verilog to support +#@ # systemverilog input. +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc read_sverilog { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format sverilog %s %s [list %s]} [array names ra -rtl] [array names ra -netlist] $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_sverilog -info " Read one or more systemverilog files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-netlist "Use structural Verilog netlist reader" "" boolean optional} +#@ {-rtl "Use RTL Systemverilog compiler (Presto or HDLC)" "" boolean optional} +#@ {-hdl_compiler "Use HDL Compiler (ignored)" "" boolean {hidden optional}} +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_vhdl +#@ # +#@ # ABSTRACT: Emulate PT's read_vhdl command in DC: +#@ # +#@ # Usage: read_vhdl # Read one or more vhdl files +#@ # file_names (Files to read) +#@ # +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc read_vhdl { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format vhdl %s [list %s]} [array names ra -netlist] $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_vhdl -info " Read one or more vhdl files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-netlist "Use structural VHDL netlist reader" "" boolean optional} +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_db +#@ # +#@ # ABSTRACT: Emulate PT's read_db command in DC: +#@ # +#@ # Usage: +#@ # read_db # Read one or more db files +#@ # *[-netlist_only] (Do not read any attributes from db (ignored)) +#@ # *[-library] (File is a library DB (ignored)) +#@ # file_names (Files to read) +#@ # +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc read_db { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format db [list %s]} $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_db -info " Read one or more db files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-netlist_only "Do not read any attributes from db (ignored)" "" boolean {hidden optional}} +#@ {-library "File is a library DB (ignored)" "" boolean {hidden optional}} +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_edif +#@ # +#@ # ABSTRACT: Emulate PT's read_edif command in DC: +#@ # +#@ # Usage: +#@ # read_edif # Read one or more edif files +#@ # *[-complete_language] (Use ptxr to read the file (ignored)) +#@ # file_names (Files to read) +#@ # +#@ # +#@ ############################################################################## +#@ # +#@ proc read_edif { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {read_file -format edif [list %s]} $ra(file_names)] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_edif -info " Read one or more edif files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-complete_language "Use ptxr to read the file (ignored)" "" boolean {hidden optional}} +#@ } +#@ +#@ +#@ ############################################################################## +#@ # +#@ # +#@ # PROCEDURE: read_ddc +#@ # +#@ # ABSTRACT: Shorthand for "read_file -format ddc": +#@ # +#@ # Usage: +#@ # read_ddc # Read one or more ddc files +#@ # *[-scenarios] only read constraints for specified scenarios +#@ # *[-active_scenarios] only activate the specified scenarios +#@ # file_names (Files to read) +#@ # +#@ # +#@ ############################################################################## +#@ # +#@ +#@ proc read_ddc { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "read_file -format ddc" +#@ if { [ info exists ra(-scenarios) ] } { +#@ set cmd "$cmd -scenarios { $ra(-scenarios) }" +#@ } +#@ if { [ info exists ra(-active_scenarios) ] } { +#@ set cmd "$cmd -active_scenarios { $ra(-active_scenarios) }" +#@ } +#@ set cmd "$cmd { $ra(file_names) }" +#@ return [uplevel \#0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_ddc -info "Read one or more ddc files" -permanent -define_args { +#@ {file_names "Files to read" file_names list required} +#@ {-scenarios "list of scenarios to be read from ddc file" +#@ scenario_list list optional} +#@ {-active_scenarios "list of scenarios to be made active" +#@ active_scenario_list list optional}} +#@ +#@ +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: source_tcl_file +#@ # +#@ # ABSTRACT: generic procedure to source another tcl file +#@ # +#@ # Arguments: +#@ # filename tcl filename +#@ # dir directory to check for file +#@ # msg verbose message +#@ # verbose verbose mode +#@ # +#@ # Usage: +#@ # +#@ ############################################################################## +#@ # +#@ proc source_tcl_file { filename dir msg {verbose 1} } { +#@ set __qual_pref_file [file join $dir $filename] +#@ if {[file exists $__qual_pref_file]} { +#@ if { $verbose } { +#@ echo $msg $__qual_pref_file +#@ } +#@ # use catch to recover from errors in the pref file +#@ echo_trace "Sourcing " $__qual_pref_file +#@ # to speed up sourcing use read and eval +#@ set f [open $__qual_pref_file] +#@ if {[catch {namespace eval :: [read -nonewline $f]} __msg]} { +#@ echo Error: Error during sourcing of $__qual_pref_file +#@ if {$__msg != ""} { echo $__msg } +#@ # actually, it looks like $__msg is always null after +#@ # source fails +#@ } +#@ close $f +#@ } else { +#@ echo_trace "Info: File '" $__qual_pref_file "' does not exist!" +#@ } +#@ } +#@ define_proc_attributes source_tcl_file -hidden +#@ +#@ +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: echo_trace +#@ # +#@ # ABSTRACT: echo only in trace modus +#@ # +#@ ############################################################################## +#@ # +#@ proc echo_trace { args } { +#@ if { [info exists ::env(TCL_TRACE)] } { +#@ echo TRACE\> [join $args "" ] +#@ } +#@ } +#@ define_proc_attributes echo_trace -hidden +#@ +#@ ############################################################################# +#@ # +#@ # Following procedures added for PC write_script +#@ # +#@ # +#@ # +#@ ############################################################################ +#@ +#@ proc set_cell_restriction { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {set_attribute %s -type integer restrictions %s } $ra(cell) $ra(value)] +#@ return [uplevel #0 $cmd] +#@ +#@ } +#@ define_proc_attributes set_cell_restriction -hidden -define_args { {cell "cell_name" cell string required} {value "value" value string required} } +#@ +#@ +#@ proc set_cell_soft_keepout {args} { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {set_keepout_margin -type soft -outer {%d %d %d %d} [list %s] } $ra(llx) $ra(lly) $ra(urx) $ra(ury) $ra(objects)] +#@ return [uplevel #0 $cmd] +#@ +#@ +#@ } +#@ +#@ define_proc_attributes set_cell_soft_keepout -hidden -define_args { {llx "llx" llx float required} {lly "lly" lly float required} {urx "urx" urx float required} {ury "ury" ury float required} {objects "objects" objects list required} } +#@ +#@ proc set_cell_hard_keepout {args} { +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {set_keepout_margin -type soft -outer {%d %d %d %d} [list %s] } $ra(llx) $ra(lly) $ra(urx) $ra(ury) $ra(objects)] +#@ return [uplevel #0 $cmd] +#@ +#@ +#@ } +#@ +#@ define_proc_attributes set_cell_hard_keepout -hidden -define_args { {llx "llx" llx float required} {lly "lly" lly float required} {urx "urx" urx float required} {ury "ury" ury float required} {objects "objects" objects list required} } +#@ +#@ set mw_use_pdb_lib_format false +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: write_milkyway +#@ # +#@ # ABSTRACT: wrapper around save_mw_cel to support original write_milkyway +#@ # interface +#@ # if { [info commands open_mw_cel] == "open_mw_cel" } {} +#@ # +#@ ############################################################################## +#@ +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ +#@ proc write_milkyway args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {save_mw_cel -as %s %s %s %s %s} $ra(-output) [array names ra -overwrite] [array names ra -create] [array names ra -all] [array names ra -dps]] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes write_milkyway -hidden -info " Saves the design as milkyway CEL" -define_args {{-output fileName "Name" string {optional}} {-overwrite "Overwrite the current version" "" boolean {optional}} {-create "Create from scratch" "" boolean {hidden optional}} {-all "Save all modified cells" "" boolean {hidden optional}} {-dps "Save internal DPS design" "" boolean {hidden optional}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: read_milkyway +#@ # +#@ # ABSTRACT: wrapper around open_mw_cel to support original read_milkyway +#@ # interface +#@ # MODIFIED: To support DPS in Galileo we need to pass the filtering +#@ # parameters to the DPS command. (Pankaj Goswami, Mar09 2005) +#@ # +#@ ############################################################################## +#@ +#@ proc read_milkyway args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {open_mw_cel %s} $ra() ] +#@ +#@ if {[info exists ra(-library)]} { +#@ set cmd [concat [concat $cmd " -library " ] " $ra(-library) "] +#@ } +#@ +#@ if {[info exists ra(-read_only)]} { +#@ lappend cmd {-readonly} +#@ } +#@ +#@ # DPS specific stuff +#@ set dps_cmd "vh_set_current_partition " +#@ set read_mw_with_dps_filter false +#@ +#@ if {[info exists ra(-vh_module_only)]} { +#@ append dps_cmd "-vh_module_only " +#@ set read_mw_with_dps_filter true +#@ } +#@ +#@ if {[info exists ra(-vh_include)]} { +#@ append dps_cmd [concat " -vh_include " " \{ $ra(-vh_include) \}"] +#@ append dps_cmd " " +#@ set read_mw_with_dps_filter true +#@ } +#@ +#@ if {[info exists ra(-vh_exclude)]} { +#@ append dps_cmd [concat " -vh_exclude" " \{ $ra(-vh_exclude) \}"] +#@ set read_mw_with_dps_filter true +#@ } +#@ +#@ if { $read_mw_with_dps_filter == true } { +#@ # Call the DPS command to store the DPS filtering params. +#@ uplevel #0 $dps_cmd +#@ } else { +#@ # If there is no DPS filtering params, then we need to reset the +#@ # params which might have been stored from the provious command. +#@ append dps_cmd " -vh_reset_partition" +#@ uplevel #0 $dps_cmd +#@ } +#@ # End of DPS stuff +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes read_milkyway -hidden -info " Read milkyway CEL from disk" -define_args {{-library "library name" "lib_name" string {optional}} {-read_only "open design in read only mode" "" boolean {optional}} {-version "version number of the CEL" "number" string {optional}} {-vh_module_only "open design for DPS module only partition" "" boolean {hidden optional}} {-vh_include "list of designs to be included in the DPS partition" "include_designs" list {hidden optional}} {-vh_exclude "list of designs to be excluded in the DPS partition" "exclude_designs" list {hidden optional}} {"" fileName "CEL name" string {required}}} +#@ +#@ } +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: set_mw_technology_file +#@ # +#@ # ABSTRACT: wrapper around update_mw_lib +#@ # +#@ # HISTORY : 2009/6/21, yunz, support ALF reader in ICC +#@ # +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] || +#@ ([string match -nocase {*d[ce]_shell*} $synopsys_program_name] && [shell_is_mwlib_enabled]) } { +#@ +#@ proc set_mw_technology_file args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ set lib_name "" +#@ set pdb_file "tech.pdb" +#@ set log_file "log_file" +#@ set alf_file "" +#@ +#@ if {[info exists ra(-technology)] && [info exists ra(-plib)]} { +#@ echo "Error: the $ra(-technology) and $ra(-plib) options are mutually exclusive." +#@ return [uplevel #0 $cmd] +#@ } elseif {[info exists ra(-technology)] && [info exists ra(-alf)]} { +#@ echo "Error: the $ra(-technology) and $ra(-alf) options are mutually exclusive." +#@ return [uplevel #0 $cmd] +#@ } elseif {[info exists ra(-plib)] && [info exists ra(-alf)]} { +#@ echo "Error: the $ra(-plib) and $ra(-alf) options are mutually exclusive." +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ if {[info exists ra(-technology)]} { +#@ +#@ set cmd [format {update_mw_lib -technology %s %s} $ra(-technology) $ra() ] +#@ } +#@ +#@ if {[info exists ra(-alf)]} { +#@ +#@ set cmd [format {update_mw_lib %s} $ra() ] +#@ +#@ set cmd [concat [concat $cmd " -alf " ] " $ra(-alf) "] +#@ } +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes set_mw_technology_file -hide_body -info " Set technology file for the library " -define_args {{-technology "Technology file name" "tech_file" string {optional}} {-alf "alf file name" "file_name" string {optional}} {"" "Library name" "libName" string {required}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: rebuild_mw_lib +#@ # +#@ # ABSTRACT: wrapper around update_mw_lib +#@ # +#@ ############################################################################## +#@ +#@ proc rebuild_mw_lib args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {update_mw_lib -rebuild %s} $ra() ] +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes rebuild_mw_lib -hide_body -info " Rebuild the library " -define_args {{"" "Library name" "libName" string {required}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: set_mw_lib_reference +#@ # +#@ # ABSTRACT: Procedure to set ref lib list or ref ctrl file +#@ # +#@ ############################################################################## +#@ +#@ proc set_mw_lib_reference args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ +#@ if {[info exists ra(-mw_reference_library)]} { +#@ set cmd [format {set_reference_control_file -reference_libraries {%s} %s} $ra(-mw_reference_library) $ra() ] +#@ } +#@ +#@ if {[info exists ra(-reference_control_file)]} { +#@ set cmd [format {set_reference_control_file -file %s %s} $ra(-reference_control_file) $ra() ] +#@ } +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes set_mw_lib_reference -hide_body -info " Set reference for the library " -define_args {{-mw_reference_library "List of reference libraries" "lib_list" list {optional}} {-reference_control_file "Reference control file" "file_name" string {optional}} {"" "Library name" "libName" string {required}}} +#@ +#@ # +#@ ############################################################################## +#@ # +#@ # PROCEDURE: create_mw_lib +#@ # +#@ # ABSTRACT: wrapper around MWUI create_mw_lib +#@ # +#@ ############################################################################## +#@ +#@ proc create_mw_lib args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ set lib_name "" +#@ set pdb_file "tech.pdb" +#@ set log_file "log_file" +#@ +#@ if {[info exists ra(-ignore_case)]} { +#@ set cmd [format {org_create_mw_lib %s} $ra() ] +#@ } else { +#@ set cmd [format {org_create_mw_lib -case_sensitive %s} $ra() ] +#@ } +#@ +#@ if {[info exists ra(-technology)]} { +#@ set cmd [concat [concat $cmd " -technology " ] " $ra(-technology) "] +#@ } +#@ +#@ if {[info exists ra(-ignore_tf_error)]} { +#@ set cmd [concat $cmd " -ignore_tf_error " ] +#@ } +#@ +#@ if {[info exists ra(-hier_separator)]} { +#@ set cmd [concat [concat $cmd " -hier_seperator " ] " $ra(-hier_separator) "] +#@ } +#@ +#@ if {[info exists ra(-bus_naming_style)]} { +#@ set cmd [concat [concat $cmd " -bus_naming_style " ] " {$ra(-bus_naming_style)} "] +#@ } +#@ +#@ +#@ if {[info exists ra(-reference_control_file)]} { +#@ set cmd [concat [concat $cmd " -reference_control_file " ] " $ra(-reference_control_file) "] +#@ } +#@ +#@ if {[info exists ra(-mw_reference_library)]} { +#@ set cmd [concat [concat [concat $cmd " -mw_reference_library {" ] " $ra(-mw_reference_library) "] "}"] +#@ } +#@ +#@ if { ![uplevel #0 $cmd] } { +#@ return 0 +#@ } +#@ +#@ set cmd "" +#@ +#@ if {[info exists ra(-open)]} { +#@ uplevel #0 $cmd +#@ set cmd [format {open_mw_lib %s} $ra() ] +#@ } +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes create_mw_lib -hide_body -info " Create a milkyway library " -define_args {{-technology "Technology file name" "file_name" string {optional}} {-ignore_tf_error "Ignore the error in technology file" "" boolean {hidden optional}} {-hier_separator "Hierarchical separator, default is backslash / " "separator" string {hidden optional}} {-bus_naming_style "Bus naming style" "bus_naming_style" string {optional}} {-ignore_case "Make case insensitive" "" boolean {hidden optional}} {-case_sensitive "Make case sensitive" "" boolean {hidden optional}} {-mw_reference_library "List of reference libraries" "lib_list" list {optional}} {-reference_control_file "Reference control file" "file_name" string {optional}} {-open "Open the library after creation" "" boolean {optional}} {"" "Library name to create" "libName" string {required}}} +#@ +#@ # +#@ ############################################################################## +#@ # +#@ # PROCEDURE: report_mw_lib +#@ # +#@ # ABSTRACT: wrapper around MWUI report_mw_lib +#@ # +#@ ############################################################################## +#@ +#@ proc report_mw_lib args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ +#@ if {[info exists ra(-mw_reference_library)]} { +#@ if {[info exists ra()]} { +#@ set cmd [format {org_report_mw_lib -mw_reference_library %s} $ra() ] +#@ } else { +#@ set cmd [format {org_report_mw_lib -mw_reference_library} ] +#@ } +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ if {[info exists ra(-unit_range)]} { +#@ if {[info exists ra()]} { +#@ set cmd [format {org_report_mw_lib -unit_range %s} $ra() ] +#@ } else { +#@ echo "Error : Library name must be specified when using this option" +#@ return 0; +#@ } +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ } +#@ +#@ define_proc_attributes report_mw_lib -hide_body -info " Report information about the library " -define_args {{-unit_range "Report unit range of library" "" boolean {optional}} {-mw_reference_library "Report list of reference libraries" "" boolean {optional}} {"" "Library to be reported" "libName" string {optional}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: close_mw_lib +#@ # +#@ # ABSTRACT: Wrapper around close_mw_lib to handle -save option properly +#@ # - save_mw_cel to save current cel with dc_netlist +#@ # - close_mw_cel to close current cel +#@ # - save_open_cels to save other open cels before closing library +#@ # +#@ ############################################################################## +#@ +#@ proc close_mw_lib args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ if {$args == ""} { +#@ set cmd [format {icc_is_dc_up} ] +#@ if {[uplevel #0 $cmd]} { +#@ set cmd [format {remove_design -quiet -designs} ] +#@ if {[uplevel #0 $cmd]} { +#@ set cmd [format {org_close_mw_lib } ] +#@ return [uplevel #0 $cmd] +#@ } else { +#@ return 0 +#@ } +#@ } else { +#@ set cmd [format {org_close_mw_lib } ] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ +#@ if {[info exists ra(-save)]} { +#@ +#@ set cmd [format {save_mw_cel} ] +#@ if {![uplevel #0 $cmd]} { +#@ return +#@ } +#@ +#@ set cmd [format {close_mw_cel} ] +#@ if {![uplevel #0 $cmd]} { +#@ return +#@ } +#@ +#@ set cmd [format {save_open_cels} ] +#@ if {![uplevel #0 $cmd]} { +#@ return +#@ } +#@ } +#@ +#@ set cmd [format {org_close_mw_lib} ] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ define_proc_attributes close_mw_lib -hide_body -info " Closes the milkyway library " -define_args {{-save "Save open cels" "" boolean {optional}} {"" "libraries to be closed" "lib list" list {hidden optional}}} +#@ } else { +#@ define_proc_attributes close_mw_lib -hide_body -info " Closes the milkyway library " -define_args {{-no_save "Don't save open cels" "" boolean {hidden optional}} {"" "libraries to be closed" "lib list" list {hidden optional}}} +#@ } +#@ ############################################################################## +#@ # +#@ # PROCEDURE: write_mw_lib_files +#@ # +#@ # ABSTRACT: Write technology or reference control file +#@ # History: Yun Zhang 2012/12/11, public option -stream_layer_map_file +#@ # History: Yun Zhang 2012/9/5. support new hidden option -vt_cell_placement_properties +#@ # History: Yun Zhang 2011/12/5. add new hidden option -stream_layer_map_file +#@ # +#@ ############################################################################## +#@ proc write_mw_lib_files args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd "" +#@ +#@ if {[info exists ra(-reference_control_file)]} { +#@ #Option -reference_contrl_file, -plib and -technology are exclusive. +#@ # If both of them are set at the same time, error reported. +#@ # 9000273455, by xqsun, 2009/2/4 +#@ if {[info exists ra(-technology)]} { +#@ echo "Error: Cannot specify '-reference_control_file' with '-technology'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-plib)]} { +#@ echo "Error: Cannot specify '-reference_control_file' with '-plib'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-vt_cell_placement_properties)]} { +#@ echo "Error: Cannot specify '-reference_control_file' with '-vt_cell_placement_properties'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-stream_layer_map_file)]} { +#@ echo "Error: Cannot specify '-reference_control_file' with '-stream_layer_map_file'.(CMD-001)" +#@ return 0 +#@ } else { +#@ set cmd [format {report_mw_lib_ref_ctrl_file -output %s %s} $ra(-output) $ra() ] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ +#@ if {[info exists ra(-technology)]} { +#@ if {[info exists ra(-plib)]} { +#@ echo "Error: Cannot specify '-technology' with '-plib'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-vt_cell_placement_properties)]} { +#@ echo "Error: Cannot specify '-technology' with '-vt_cell_placement_properties'.(CMD-001)" +#@ return 0 +#@ } elseif {[info exists ra(-stream_layer_map_file)]} { +#@ echo "Error: Cannot specify '-technology' with '-stream_layer_map_file'.(CMD-001)" +#@ return 0 +#@ } else { +#@ set cmd [format {org_report_mw_lib -output %s %s} $ra(-output) $ra() ] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ +#@ if {[info exists ra(-vt_cell_placement_properties)]} { +#@ if {[info exists ra(-stream_layer_map_file)]} { +#@ echo "Error: Cannot specify '-vt_cell_placement_properties' with '-stream_layer_map_file'.(CMD-001)" +#@ return 0 +#@ } else { +#@ set cmd [format {org_report_mw_lib -vt_cell_placement_properties -output %s %s} $ra(-output) $ra() ] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ +#@ if {[info exists ra(-stream_layer_map_file)]} { +#@ set cmd [format {org_report_mw_lib -stream_layer_map_file %s -output %s %s} $ra(-stream_layer_map_file) $ra(-output) $ra() ] +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ } +#@ +#@ define_proc_attributes write_mw_lib_files -hide_body -info " Write technology or reference control file " -define_args {{-technology "Dump technology file" "" boolean {optional}} {-vt_cell_placement_properties "Dump multi-VT cells' implant layer information of library" "" boolean {optional hidden}} {-reference_control_file "Dump reference control file" "" boolean {optional}} {-stream_layer_map_file "Dump layer map file during stream in/out" "" string {optional}} {-output "Output file" "file_name" string {required}} {"" "Library to be reported" "libName" string {required}}} +#@ } +#@ ############################################################################## +#@ # +#@ # PROCEDURE: close_mw_cel +#@ # +#@ # ABSTRACT: Wrapper around close_mw_cel to add -save option +#@ # remove_timing_design is the command to shutdown dc netlist +#@ # +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ +#@ proc close_mw_cel args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ global mw_is_all_views +#@ set cmd [format {icc_is_dc_up} ] +#@ set dc_is_up [uplevel #0 $cmd] +#@ +#@ set cmd_close [format {org_close_mw_cel} ] +#@ +#@ if {[info exists ra(-all_views)]} { +#@ set cmd_close [format {%s -all_views} $cmd_close] +#@ set mw_is_all_views 1 +#@ } +#@ if {[info exists ra(-all_versions)]} { +#@ set cmd_close [format {%s -all_versions} $cmd_close] +#@ } +#@ if {[info exists ra(-save)]} { +#@ set cmd_close [format {%s -save} $cmd_close] +#@ } +#@ if {[info exists ra(-verbose)]} { +#@ set cmd_close [format {%s -verbose} $cmd_close] +#@ } +#@ if {[info exists ra(-hierarchy)]} { +#@ set cmd_close [format {%s -hierarchy} $cmd_close] +#@ } +#@ +#@ ui_util_clean_saved_lib_attr $args +#@ +#@ set cmd "" +#@ set lcels "" +#@ set is_current_closed 1 +#@ +#@ if {[info exists ra()]} { +#@ set lcels $ra() +#@ } +#@ set len [string length $lcels] +#@ if {$len > 0} { +#@ set is_current_closed [is_current_mw_cel $lcels] +#@ set cmd_close [format {%s {%s}} $cmd_close $lcels] +#@ } +#@ if {[uplevel #0 $cmd_close]} { +#@ set mw_is_all_views 0 +#@ if {$dc_is_up == 1} { +#@ if {$is_current_closed == 1} { +#@ set cmd [format {remove_design -quiet -designs} ] +#@ return [uplevel #0 $cmd] +#@ } +#@ return 1 +#@ } else { +#@ return 1 +#@ } +#@ } else { +#@ set mw_is_all_views 0 +#@ return 0 +#@ } +#@ } +#@ +#@ define_proc_attributes close_mw_cel -hide_body -info " Closes the design " -define_args {{-save "Save the design" "" boolean {optional}} {-discard "Discard any changes" "" boolean {optional hidden}} {-verbose "Print out debugging messages" "" boolean {optional hidden}} {-hierarchy "Close top design and its child designs" "" boolean {optional}} {-all_views "Close all views of the design" "" boolean {optional}} {-all_versions "Close all versions of the design" "" boolean {optional}} {"" "designs to be closed" "design list" list {optional}}} +#@ +#@ ############################################################################## +#@ # +#@ # PROCEDURE: save_all_mw_cel +#@ # +#@ # ABSTRACT: Wrapper around save_mw_cel to save all the open cels. Needed for Black box flow. +#@ # +#@ ############################################################################## +#@ +#@ proc save_all_mw_cels { } { +#@ set top_cel [get_attribute [current_mw_cel] name] +#@ +#@ set cels [fp_get_open_cells] +#@ +#@ foreach cel $cels { +#@ if {$cel != $top_cel} { +#@ current_mw_cel $cel +#@ +#@ save_mw_cel +#@ } +#@ } +#@ +#@ current_mw_cel $top_cel +#@ +#@ save_mw_cel +#@ } +#@ +#@ icc_hide_cmd save_all_mw_cels +#@ +#@ ############################################################################## +#@ # PROCEDURE: execute_command_and_create_cel_from_scratch +#@ # ABSTRACT: This procedure executes the given command and creates the CEL +#@ # from scratch after executing this command. +#@ ############################################################################## +#@ proc execute_command_and_create_cel_from_scratch {org_cmd_name args} { +#@ global mw_create_cel_force +#@ global mw_enable_auto_cel +#@ global mw_force_auto_cel +#@ +#@ set lib [current_mw_lib] +#@ +#@ # If no MW lib, design is not from MW. Execute the original command +#@ # and return. +#@ if {$lib == ""} { +#@ return [eval $org_cmd_name $args] +#@ } +#@ +#@ # Get values of few variables. +#@ set incr_mode $mw_create_cel_force +#@ set mw_create_cel_force TRUE +#@ +#@ # Get auto cel mode, disable it temporarily if enabled. +#@ set auto_cel_mode $mw_enable_auto_cel +#@ set mw_enable_auto_cel FALSE +#@ +#@ # Check if the already existing CEL is auto-CEL. +#@ set auto_cel 0 +#@ if {[is_cel_auto_cel]} { +#@ set auto_cel 1 +#@ } elseif {![get_top_cel_mwid]} { +#@ set auto_cel 1 +#@ } +#@ +#@ +#@ # Run the original command, if not successful restore the incr_mode +#@ # variable and return. No CEL is created. +#@ if {![eval $org_cmd_name $args]} { +#@ set mw_create_cel_force $incr_mode +#@ set mw_enable_auto_cel $auto_cel_mode +#@ return 0 +#@ } +#@ +#@ # Restore auto_cel mode +#@ set mw_enable_auto_cel $auto_cel_mode +#@ +#@ # Now create auto or real CEL depending on what the original CEL was. +#@ if {$auto_cel == "1"} { +#@ # Force creation of auto-CEL, since commands other than read_def/pdef +#@ # do not decouple CEL from DC. +#@ +#@ set mw_force_auto_cel TRUE +#@ set cmd [format {save_mw_cel -auto}] +#@ } else { +#@ if [get_top_cel_mwid] { +#@ set cmd [format {save_mw_cel -create}] +#@ echo "Information: Command not supported by incr. update or write-thru." +#@ echo " Creating new CEL from scratch, old CEL will be closed." +#@ } +#@ } +#@ +#@ # Create the Auto CEL or normal CEL from scratch. +#@ if {![uplevel #0 $cmd]} { +#@ set mw_create_cel_force $incr_mode +#@ set mw_force_auto_cel FALSE +#@ return 0 +#@ } +#@ +#@ set mw_create_cel_force $incr_mode +#@ set mw_force_auto_cel FALSE +#@ return 1 +#@ } +#@ +#@ define_proc_attributes execute_command_and_create_cel_from_scratch -hidden -hide_body +#@ +#@ ############################################################################## +#@ # PROCEDURE: read_def +#@ # ABSTRACT: Wrapper around read_def to handle incremental update properly +#@ # if MW based read_def is used, bypass the wrapper +#@ # enable_milkyway_def_reader_writer must be TRUE and use_pdb_lib_format must +#@ # be false for MW read_Def to be run, use wrapper if either condition fails +#@ ############################################################################## +#@ rename -force dc_read_def org_read_def +#@ icc_hide_cmd org_read_def +#@ proc dc_read_def args { +#@ parse_proc_arguments -args $args ra +#@ +#@ return [eval execute_command_and_create_cel_from_scratch "org_read_def" $args] +#@ } +#@ +#@ define_proc_attributes dc_read_def -hide_body -info " Read a def file " -define_args {{-design "name of design for which clusters are to be read" "" string {optional}} {-quiet "do not print out any warnings" "" boolean {optional}} {-verbose "print out more warnings" "" boolean {optional}} {-allow_physical_cells "allow physical cells" "" boolean {optional}} {-allow_physical_ports "allow physical ports" "" boolean {optional}} {-allow_physical_nets "allow physical nets" "" boolean {optional}} {-skip_signal_nets "skip signal nets" "" boolean {optional}} {-incremental "incremental" "" boolean {optional}} {-enforce_scaling "enforce_scaling" "" boolean {optional}} {-move_bounds "move bounds" "" boolean {optional}} {"" "input def file names" "input_def_file_name" string {required}}} +#@ +#@ +#@ ############################################################################## +#@ # PROCEDURE: group +#@ # ABSTRACT: Wrapper around group to handle incremental update properly +#@ ############################################################################## +#@ rename -force group org_group +#@ icc_hide_cmd org_group +#@ proc group args { +#@ parse_proc_arguments -args $args ra +#@ return [eval execute_command_and_create_cel_from_scratch "org_group" $args] +#@ } +#@ +#@ define_proc_attributes group -hide_body -info " create new hierarchy" -define_args {{-except "cells not to be included in the group" "exclude_list" list {optional}} +#@ {-design_name "name of design created for new hierarchy" "design_name" string {optional}} +#@ {-cell_name "name of cell created for new hierarchy" "cell_name" string {optional}} +#@ {-logic "group any combinational elements" "" boolean {optional}} +#@ {-pla "group any PLA elements" "" boolean {optional}} +#@ {-fsm "group all elements part of a finite state machine" "" boolean {optional}} +#@ {-hdl_block "name of hdl_block to group" "" string {optional}} +#@ {-hdl_bussed "group all bussed gates under this block" "" boolean {optional}} +#@ {-hdl_all_blocks "group all hdl blocks under this block" "" boolean {optional}} +#@ {-soft "set the group_name attribute" "" boolean {optional}} +#@ {"" "cells to be included in the group" "cell_list" list {optional}}} +#@ +#@ ############################################################################## +#@ # PROCEDURE: copy_design +#@ # ABSTRACT: Wrapper around copy_design to handle incremental update properly +#@ ############################################################################## +#@ rename -force copy_design org_copy_design +#@ icc_hide_cmd org_copy_design +#@ proc copy_design args { +#@ parse_proc_arguments -args $args ra +#@ return [eval execute_command_and_create_cel_from_scratch "org_copy_design" $args] +#@ } +#@ +#@ define_proc_attributes copy_design -hide_body -info " copy_design" -define_args {{"" "List of designs to be copied" "design_list" list {required}} +#@ {"" "Name of new design or target file" "target_name" string {required}}} +#@ +#@ ############################################################################## +#@ # PROCEDURE: create_design +#@ # ABSTRACT: Wrapper around create_design to handle incremental update properly +#@ ############################################################################## +#@ rename -force create_design org_create_design +#@ icc_hide_cmd org_create_design +#@ proc create_design args { +#@ parse_proc_arguments -args $args ra +#@ return [eval execute_command_and_create_cel_from_scratch "org_create_design" $args] +#@ } +#@ +#@ define_proc_attributes create_design -hide_body -info " Creates a design in dc_shell memory" -define_args {{"" "name of the design to create" "" string {required}} +#@ {"" "name of file for design; optional" "" string {optional}}} +#@ +#@ ############################################################################## +#@ # PROCEDURE: reset_design +#@ # ABSTRACT: Wrapper around reset_design to handle incremental update properly +#@ ############################################################################## +#@ #rename -force reset_design org_reset_design +#@ #icc_hide_cmd org_reset_design +#@ #proc reset_design args { +#@ # parse_proc_arguments -args $args ra +#@ # return [eval execute_command_and_create_cel_from_scratch "org_reset_design" $args] +#@ #} +#@ +#@ ############################################################################## +#@ # PROCEDURE: rename_design +#@ # ABSTRACT: Wrapper around rename_design to handle incremental update properly +#@ ############################################################################## +#@ rename -force rename_design org_rename_design +#@ icc_hide_cmd org_rename_design +#@ proc rename_design args { +#@ parse_proc_arguments -args $args ra +#@ return [eval execute_command_and_create_cel_from_scratch "org_rename_design" $args] +#@ } +#@ +#@ define_proc_attributes rename_design -hide_body -info " rename_design" -define_args {{"" "List of designs to be renamed" "design_list" list {required}} +#@ {"" "Name of new design or target file" "target_name" string {required}}} +#@ +#@ } +#@ +#@ ############################################################################## +#@ # If we are in icc_shell (i.e. Galileo) then +#@ # load the procedures to switch between DC and Milkyway collections. +#@ # Set the default to MW collection unless otherwise specified. +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ # load the procedures that switch between DC and MW collections +#@ source $synopsys_root/auxx/syn/collection_procs.tcl +#@ +#@ set CS mw +#@ +#@ # see if the user wants DC +#@ if {! [catch {getenv USE_DC_COLLECTIONS_ONLY}] && +#@ [getenv USE_DC_COLLECTIONS_ONLY] } { +#@ set CS dc +#@ } +#@ +#@ # set the collection source now +#@ redirect /dev/null { +#@ if {[catch {set_collection_mode -handle $CS}]} { +#@ catch {set_collection_option -handle $CS} +#@ } +#@ } +#@ +#@ unset CS +#@ } +#@ +#@ ############################################################################## +#@ # procedure for route command +#@ # echo the command to a temp tcl file for seperate process to pick up +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ rename -force route org_route +#@ icc_hide_cmd org_route +#@ proc route args { +#@ set route_cmd_file_name ".route_cmd.tcl" +#@ set route_cmd_temp_file_name ".route_cmd.tcl.temp" +#@ set fp [open $route_cmd_file_name "w"] +#@ set route_cmd [concat "sep_proc_route " $args " -child"] +#@ puts $fp $route_cmd +#@ close $fp +#@ +#@ uplevel #0 rename -force route route_temp_proc +#@ uplevel #0 rename -force org_route route +#@ set status [ uplevel #0 route $args ] +#@ uplevel #0 rename -force route org_route +#@ uplevel #0 rename -force route_temp_proc route +#@ +#@ if { [info exist status ] == 1 } { +#@ return $status +#@ } +#@ return +#@ } +#@ } +#@ +#@ ############################################################################## +#@ # Tcl Command: set_ignore_cell +#@ # Description: Load the command only in IC Compiler (icc_shell) +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ source $synopsys_root/auxx/syn/psyn/ideal_cell.tcl.e +#@ } +#@ +#@ ############################################################################## +#@ # Tcl Command: check_physical_design +#@ # Description: Load the command only in IC Compiler (icc_shell) +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ # Load the compiled Tcl byte-code: +#@ # 9000784997: Do not log to command.log when sourcing .tbc files +#@ set prev_sh_source_logging [get_app_var sh_source_logging] +#@ set_app_var sh_source_logging 0 +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_core.tbc +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_utils.tbc +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_flows.tbc +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_reports.tbc +#@ source $synopsys_root/auxx/syn/psyn/check_physical_design_ui.tbc +#@ source $synopsys_root/auxx/syn/psyn/sanity_setup_opt.tbc +#@ source $synopsys_root/auxx/syn/psyn/sanity_setup_cmd.tbc +#@ source $synopsys_root/auxx/syn/psyn/sanity_setup_rpt.tbc +#@ source $synopsys_root/auxx/syn/psyn/create_qor_snapshot.tbc +#@ source $synopsys_root/auxx/syn/psyn/report_qor_snapshot.tbc +#@ source $synopsys_root/auxx/syn/psyn/msgParser.tbc +#@ source $synopsys_root/auxx/syn/psyn/displacement_gui.tbc +#@ source $synopsys_root/auxx/syn/psyn/categorize_timing_gui.tbc +#@ set_app_var sh_source_logging $prev_sh_source_logging +#@ +#@ source $synopsys_root/auxx/syn/psyn/mcmm_utils.tcl.e +#@ source $synopsys_root/auxx/syn/psyn/propagate_all_clocks.tcl.e +#@ } +#@ +#@ if { [string match -nocase {*dc_shell*} $synopsys_program_name] && [shell_is_in_topographical_mode] } { +#@ # 9000784997: Do not log to command.log when sourcing .tbc files +#@ set prev_sh_source_logging [get_app_var sh_source_logging] +#@ set_app_var sh_source_logging 0 +#@ source $synopsys_root/auxx/syn/psyn/create_qor_snapshot.tbc +#@ source $synopsys_root/auxx/syn/psyn/report_qor_snapshot.tbc +#@ set_app_var sh_source_logging $prev_sh_source_logging +#@ +#@ source $synopsys_root/auxx/syn/psyn/mcmm_utils.tcl.e +#@ } +#@ +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] || [string match -nocase {*dc_shell*} $synopsys_program_name] || [string match -nocase {*de_shell*} $synopsys_program_name] } { +#@ source $synopsys_root/auxx/syn/psyn/write_timing_context.tcl.e; +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ source $synopsys_root/auxx/syn/psyn/write_scenarios.tbc; +#@ } +#@ } +#@ +#@ if { $synopsys_program_name == "de_shell" } { +#@ # 9000784997: Do not log to command.log when sourcing .tbc files +#@ set prev_sh_source_logging [get_app_var sh_source_logging] +#@ set_app_var sh_source_logging 0 +#@ source $synopsys_root/auxx/syn/psyn/create_qor_snapshot.tbc +#@ source $synopsys_root/auxx/syn/psyn/report_qor_snapshot.tbc +#@ set_app_var sh_source_logging $prev_sh_source_logging +#@ +#@ source $synopsys_root/auxx/syn/psyn/mcmm_utils.tcl.e +#@ } +#@ +#@ ############################################################################## +#@ # ICC setup and hiding commands/procs etc +#@ ############################################################################## +#@ +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ #set save_mw_cel_lib_setup TRUE +#@ #set auto_restore_mw_cel_lib_setup FALSE +#@ +#@ alias create_wiring_keepout create_wiring_keepouts +#@ alias get_wiring_keepout get_wiring_keepouts +#@ alias get_placement_keepout get_placement_keepouts +#@ alias create_placement_keepout create_placement_keepouts +#@ +#@ icc_hide_cmd execute_command_and_create_cel_from_scratch +#@ icc_hide_cmd dc_read_def +#@ icc_hide_cmd read_edif +#@ icc_hide_cmd read_sverilog +#@ icc_hide_cmd read_vhdl +#@ icc_hide_cmd set_collection_mode +#@ icc_hide_cmd return_dc_collection +#@ icc_hide_cmd return_mw_collection +#@ set mw_use_pdb_lib_format true +#@ } +#@ +#@ +#@ ############################################################################## +#@ # Tcl Command: get_dont_touch_nets +#@ # Description: wrapper of "get_nets -filter dont_touch_reason==mv" +#@ ############################################################################## +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ +#@ proc get_dont_touch_nets args { +#@ +#@ parse_proc_arguments -args $args ra +#@ +#@ set cmd [format {get_nets}] +#@ +#@ if {[info exists ra()]} { +#@ set cmd [format {%s {%s}} $cmd $ra()] +#@ } +#@ if {[info exists ra(-type)]} { +#@ set cmd [format {%s -filter dont_touch_reasons=~*%s*} $cmd $ra(-type)] +#@ } +#@ if {[info exists ra(-hierarchical)]} { +#@ set cmd [format {%s -hierarchical} $cmd] +#@ } +#@ if {[info exists ra(-quiet)]} { +#@ set cmd [format {%s -quiet} $cmd] +#@ } +#@ if {[info exists ra(-regexp)]} { +#@ set cmd [format {%s -regexp} $cmd] +#@ } +#@ if {[info exists ra(-nocase)]} { +#@ set cmd [format {%s -nocase} $cmd] +#@ } +#@ if {[info exists ra(-exact)]} { +#@ set cmd [format {%s -exact} $cmd] +#@ } +#@ +#@ return [uplevel #0 $cmd] +#@ } +#@ +#@ define_proc_attributes get_dont_touch_nets -info " Get dont_touch nets " -permanent -define_args { {"" "Match net names against patterns" "patterns" list {optional}} {-type "Match net dont_touch reasons" "reasons" list {required}} {-hierarchical "Search level-by-level in current instance" "" boolean {optional}} {-quiet "Suppress all messages" "" boolean {optional hidden}} {-regexp "Patterns are full regular expressions" "" boolean {optional hidden}} {-nocase "With -regexp, matches are case-insensitive" "" boolean {optional hidden}} {-exact "Wildcards are considered as plain characters" "" boolean {optional hidden}} } +#@ +#@ alias get_dont_touch_net get_dont_touch_nets +#@ } +#@ +#@ +#@ ############################################################################## +#@ # return the first {index value} pair in Tcl array ary. +#@ ############################################################################## +#@ proc _snps_array_peek { level ary } { +#@ upvar #$level $ary loc_ary +#@ set ret [list] +#@ if {[catch {set token [array startsearch loc_ary]}]} { +#@ return $ret +#@ } +#@ while {[array anymore loc_ary $token]} { +#@ set k [array nextelement loc_ary $token] +#@ set v $loc_ary($k) +#@ set ret [list $k $v] +#@ break +#@ } +#@ array donesearch loc_ary $token +#@ return $ret; +#@ } +#@ define_proc_attributes _snps_array_peek -hidden +#@ +#@ +#@ ############################################################################## +#@ # Tcl Command: filter_collection +#@ # Description: DC wrapper for filter_collection with fixes of direction filter +#@ # +#@ # This is a fix for DC's filter using "direction" attribute. This +#@ # attribute is of integer type, but user wants a string format +#@ ############################################################################## +#@ if {[string match -nocase {*icc_shell*} $synopsys_program_name] == 0} { +#@ rename -force -hidden filter_collection _real_filter_collection +#@ proc filter_collection {args} { +#@ parse_proc_arguments -args $args ra +#@ +#@ set regexp "" +#@ set nocase "" +#@ if {[info exist ra(-regexp)]} { +#@ set regexp "-regexp" +#@ } +#@ if {[info exist ra(-nocase)]} { +#@ set nocase "-nocase" +#@ } +#@ set coll $ra(collection1) +#@ +#@ # _real_filter_collection silently returns in this error condition +#@ if {[catch {set coll_size [sizeof_collection $coll]}] || $coll_size <= 0} { +#@ return [list] +#@ } +#@ +#@ if {$::sh_translate_direction_attribute == true} { +#@ set filter_expr [replace_direction $coll $ra(expression)] +#@ } else { +#@ set filter_expr $ra(expression) +#@ } +#@ +#@ # if $ra(expression) is not empty but filter_expr is, collection is heterogrnous +#@ # and expression has "direction" as substring. We have to walk through all objects +#@ if {[string length $filter_expr] == 0 && [string length $ra(expression)] != 0} { +#@ set part1 [format {_real_filter_collection %s %s } $regexp $nocase] +#@ set results "" +#@ set subclxn "" +#@ set subsize [expr [sizeof_collection $coll]/80 + 10] +#@ set counter 0 +#@ foreach_in_collection obj $coll { +#@ incr counter +#@ set cmd [format {%s %s {%s}} $part1 $obj [replace_direction $obj $ra(expression)]] +#@ append_to_collection subclxn [uplevel #0 $cmd] +#@ if {[expr $counter % $subsize] == 0} { +#@ append_to_collection results $subclxn +#@ set subclxn "" +#@ } +#@ } +#@ if {[sizeof_collection $subclxn] != 0} { +#@ append_to_collection results $subclxn +#@ } +#@ return $results +#@ } else { +#@ set cmd [format {_real_filter_collection %s %s %s {%s}} $regexp $nocase $coll $filter_expr] +#@ return [uplevel #0 $cmd] +#@ } +#@ } +#@ define_proc_attributes filter_collection -info " Filter a collection, resulting in new collection " -permanent -define_args { {-regexp "Operators =~ and !~ use regular expressions" "" boolean {optional}} {-nocase "Case insensitive string match" "" boolean {optional}} {collection1 "Collection to filter" "collection1" string {required}} {expression "Filter expression" "expression" string {required}} } +#@ +#@ } +#@ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/.dc_procs.tcl + +#@ +#@ # Temporary fix for the LMC_HOME variable- set it to an empty string +#@ +#@ if { [catch {getenv LMC_HOME } __err ] != 0 } { +#@ setenv LMC_HOME "" +#@ } +#@ +#@ +#@ # +#@ # +#@ # Site-Specific Variables +#@ # +#@ # These are the variables that are most commonly changed at a +#@ # specific site, either upon installation of the Synopsys software, +#@ # or by specific engineers in their local .synopsys files. +#@ # +#@ # +#@ +#@ # from the System Variable Group +#@ set link_library { * your_library.db } +#@ +#@ set search_path [list . ${synopsys_root}/libraries/syn ${synopsys_root}/minpower/syn ${synopsys_root}/dw/syn_ver ${synopsys_root}/dw/sim_ver] +#@ set target_library your_library.db +#@ set synthetic_library "" +#@ set command_log_file "./command.log" +#@ set designer "" +#@ set company "" +#@ set find_converts_name_lists "false" +#@ +#@ set symbol_library your_library.sdb +#@ +#@ # Turn on Formality SVF recording +#@ if { $synopsys_program_name == "dc_shell" || $synopsys_program_name == "de_shell" || $synopsys_program_name == "design_vision" } { +#@ set_svf -default default.svf +#@ } +#@ +#@ # from the Schematic Variable Group +#@ +#@ # from the Plot Variable Group +#@ # [froi] 07/06/2012: Remove old Design Analyzer plot_command variable +#@ #if { $sh_arch == "hp700" } { +#@ # set plot_command "lp -d" +#@ #} else { +#@ # set plot_command "lpr -Plw" +#@ #} +#@ +#@ set view_command_log_file "./view_command.log" +#@ +#@ # from the View Variable group +#@ if { $sh_arch == "hp700" } { +#@ set text_print_command "lp -d" +#@ } else { +#@ set text_print_command "lpr -Plw" +#@ } +#@ # +#@ # System Variable Group: +#@ # +#@ # These variables are system-wide variables. +#@ # +#@ set arch_init_path ${synopsys_root}/${sh_arch}/motif/syn/uid +#@ set auto_link_disable "false" +#@ set auto_link_options "-all" +#@ set uniquify_naming_style "%s_%d" +#@ set verbose_messages "true" +#@ set echo_include_commands "true" +#@ set svf_file_records_change_names_changes "true" +#@ set change_names_update_inst_tree "true" +#@ set change_names_dont_change_bus_members false +#@ set default_name_rules "" +#@ #set tdrc_enable_clock_table_creation "true" +#@ +#@ # +#@ # Compile Variable Group: +#@ # +#@ # These variables affect the designs created by the COMPILE command. +#@ # +#@ set compile_assume_fully_decoded_three_state_busses "false" +#@ set compile_no_new_cells_at_top_level "false" +#@ set compile_dont_touch_annotated_cell_during_inplace_opt "false" +#@ set compile_update_annotated_delays_during_inplace_opt "true" +#@ set compile_instance_name_prefix "U" +#@ set compile_instance_name_suffix "" +#@ set compile_negative_logic_methodology "false" +#@ set compile_disable_hierarchical_inverter_opt "false" +#@ set compile_use_low_timing_effort "false" +#@ set compile_fix_cell_degradation "false" +#@ set compile_preserve_subdesign_interfaces "false" +#@ set compile_enable_constant_propagation_with_no_boundary_opt "true" +#@ set port_complement_naming_style "%s_BAR" +#@ set compile_implementation_selection "true" +#@ set compile_delete_unloaded_sequential_cells "true" +#@ set reoptimize_design_changed_list_file_name "" +#@ set compile_checkpoint_phases "false" +#@ set compile_cpu_limit 0.0 +#@ set compile_log_format " %elap_time %area %wns %tns %drc %endpoint"; +#@ set compile_top_all_paths "false" +#@ set compile_top_acs_partition "false" +#@ set default_port_connection_class "universal" +#@ set compile_hold_reduce_cell_count "false" +#@ set compile_retime_license_behavior "wait" +#@ set dont_touch_nets_with_size_only_cells "false" +#@ if { $synopsys_program_name == "dc_shell" && [shell_is_in_topographical_mode] } { +#@ set dct_prioritize_area_correlation "false" +#@ set compile_error_on_missing_physical_cells "false" +#@ } +#@ +#@ set ldd_return_val 0 +#@ if { [string compare $dc_shell_mode "default"] == 0 } { +#@ set ldd_script ${synopsys_root}/auxx/syn/scripts/list_duplicate_designs.dcsh +#@ alias list_duplicate_designs "include -quiet ldd_script; dc_shell_status = ldd_return_val " +#@ +#@ } +#@ if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ if {$synopsys_program_name != "dc_sms_shell"} { +#@ source ${synopsys_root}/auxx/syn/scripts/list_duplicate_designs.tcl +#@ # 9000784997: Do not log to command.log when sourcing .tbc files +#@ set prev_sh_source_logging [get_app_var sh_source_logging] +#@ set_app_var sh_source_logging 0 +#@ source ${synopsys_root}/auxx/syn/scripts/analyze_datapath.tbc +#@ set_app_var sh_source_logging $prev_sh_source_logging +#@ } +#@ } +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/scripts/list_duplicate_designs.tcl + +#@ ####################################################################### +#@ # +#@ # list_duplicate_designs.tcl 21 Sept. 2006 +#@ # +#@ # List designs in dc_shell memory that have the same design name +#@ # +#@ # COPYRIGHT (C) 2006, SYNOPSYS INC., ALL RIGHTS RESERVED. +#@ # +#@ ####################################################################### +#@ +#@ proc list_duplicate_designs { args } { +#@ parse_proc_arguments -args $args ra +#@ +#@ # Get the list of duplicate designs +#@ set the_pid [pid] +#@ set rand_1 [expr int(rand() * 100000)] +#@ set temp_file_1 [format "/tmp/ldd_design_%s_%s" $the_pid $rand_1] +#@ +#@ redirect $temp_file_1 { foreach_in_collection ldd_design [find design "*"] { +#@ echo [get_object_name $ldd_design] +#@ } } +#@ +#@ set rand_2 [expr int(rand() * 100000)] +#@ set temp_file_2 [format "/tmp/ldd_design_%s_%s" $the_pid $rand_2] +#@ +#@ sh sort $temp_file_1 | uniq -d | tee $temp_file_2 +#@ file delete $temp_file_1 +#@ +#@ # Report duplicates +#@ if { ! [file size $temp_file_2] } { +#@ echo [concat {No duplicate designs found.}] +#@ set ldd_return_val 0 +#@ } else { +#@ set rand_3 [expr int(rand() * 100000)] +#@ set temp_file_3 [format "/tmp/ldd_design_%s_%s" $the_pid $rand_3] +#@ echo {Warning: Multiple designs in memory with the same design name.} +#@ echo {} +#@ echo { Design File Path} +#@ echo { ------ ---- ----} +#@ list_designs -table > $temp_file_3 +#@ echo [sh fgrep -f $temp_file_2 $temp_file_3 | sort | grep -v 'Design.*File.*Path'] +#@ file delete $temp_file_3 +#@ set ldd_return_val 1 +#@ } +#@ +#@ # Clean up +#@ file delete $temp_file_2 +#@ +#@ set list_duplicate_designs1 $ldd_return_val +#@ } +#@ +#@ define_proc_attributes list_duplicate_designs -info " List designs of same names" -permanent -define_args { +#@ } +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/scripts/list_duplicate_designs.tcl + +#@ +#@ +#@ set compile_log_format " %elap_time %area %wns %tns %drc %endpoint"; +#@ +#@ set compile_top_all_paths "false" +#@ alias compile_inplace_changed_list_file_name reoptimize_design_changed_list_file_name +#@ +#@ # +#@ # These variables affects compile, report_timing and report_constraints +#@ # commands. +#@ # +#@ set enable_recovery_removal_arcs "false" +#@ set timing_report_attributes {dont_touch dont_use map_only size_only ideal_net infeasible_paths} +#@ +#@ # +#@ # Multibit Variable Group: +#@ # +#@ # These variables affect the multibit mapping functionality +#@ # +#@ +#@ set bus_multiple_separator_style "," +#@ set bus_multiple_name_separator_style ",," +#@ +#@ # +#@ # ILM Variable Group: +#@ # +#@ # These variables affect Interface Logic Model functionality +#@ # +#@ +#@ set ilm_ignore_percentage 25 +#@ +#@ # +#@ # Estimator Variable Group: +#@ # +#@ # These variables affect the designs created by the ESTIMATE command. +#@ # +#@ set estimate_resource_preference "fast" +#@ alias est_resource_preference estimate_resource_preference +#@ set lbo_lfo_enable_at_pin_count 3 +#@ set lbo_cells_in_regions "false" +#@ +#@ # Synthetic Library Group: +#@ # +#@ # These variable affect synthetic library processing. +#@ # +#@ set cache_dir_chmod_octal "777" +#@ set cache_file_chmod_octal "666" +#@ set cache_read "~" +#@ set cache_read_info "false" +#@ set cache_write "~" +#@ set cache_write_info "false" +#@ set synlib_dont_get_license {} +#@ set synlib_library_list {DW01 DW02 DW03 DW04 DW05 DW06 DW07} +#@ set synlib_wait_for_design_license {} +#@ set synlib_dwhomeip {} +#@ +#@ # +#@ # Insert_DFT Variable Group: +#@ # +#@ #set test_default_client_order [list] +#@ set insert_dft_clean_up "true" +#@ set insert_test_design_naming_style "%s_test_%d" +#@ # /*insert_test_scan_chain_only_one_clock = "false" +#@ # Replace by command line option (star 17215) -- Denis Martin 28-Jan-93*/ +#@ set test_clock_port_naming_style "test_c%s" +#@ set test_scan_clock_a_port_naming_style "test_sca%s" +#@ set test_scan_clock_b_port_naming_style "test_scb%s" +#@ set test_scan_clock_port_naming_style "test_sc%s" +#@ set test_scan_enable_inverted_port_naming_style "test_sei%s" +#@ set test_scan_enable_port_naming_style "test_se%s" +#@ set test_scan_in_port_naming_style "test_si%s%s" +#@ set test_scan_out_port_naming_style "test_so%s%s" +#@ set test_non_scan_clock_port_naming_style "test_nsc_%s" +#@ set test_default_min_fault_coverage 95 +#@ set test_dedicated_subdesign_scan_outs "false" +#@ set test_disable_find_best_scan_out "false" +#@ set test_dont_fix_constraint_violations "false" +#@ set test_isolate_hier_scan_out 0 +#@ set test_mode_port_naming_style "test_mode%s" +#@ set test_mode_port_inverted_naming_style "test_mode_i%s" +#@ set compile_dont_use_dedicated_scanout 1 +#@ set test_mux_constant_si "false" +#@ +#@ # +#@ # Analyze_Scan Variable Group: +#@ # +#@ # These variables affect the designs created by the PREVIEW_SCAN command. +#@ # +#@ set test_preview_scan_shows_cell_types "false" +#@ set test_scan_link_so_lockup_key "l" +#@ set test_scan_link_wire_key "w" +#@ set test_scan_segment_key "s" +#@ set test_scan_true_key "t" +#@ +#@ # +#@ # bsd Variable Group: +#@ +#@ # These variables affect the report generated by the check_bsd command +#@ # and the BSDLout generated by the write_bsdl command. +#@ # +#@ set test_user_test_data_register_naming_style "UTDR%d" +#@ +#@ set test_user_defined_instruction_naming_style "USER%d" +#@ +#@ set test_bsdl_default_suffix_name "bsdl" +#@ +#@ set test_bsdl_max_line_length 80 +#@ +#@ set test_cc_ir_masked_bits 0 +#@ +#@ set test_cc_ir_value_of_masked_bits 0 +#@ +#@ set test_bsd_allow_tolerable_violations "false" +#@ set test_bsd_optimize_control_cell "false" +#@ set test_bsd_control_cell_drive_limit 0 +#@ set test_bsd_manufacturer_id 0 +#@ set test_bsd_part_number 0 +#@ set test_bsd_version_number 0 +#@ set bsd_max_in_switching_limit 60000 +#@ set bsd_max_out_switching_limit 60000 +#@ +#@ # +#@ # TestManager Variable Group: +#@ # +#@ # These variables affect the TestManager methodology. +#@ # +#@ set multi_pass_test_generation "false" +#@ +#@ # +#@ # TestSim Variable Group: +#@ # +#@ # These variables affect the TestSim behavior. +#@ # +#@ # set testsim_print_stats_file "true" +#@ +#@ # Test DRC Variable Group: +#@ # +#@ # These variables affect the check_test command. +#@ # +#@ set test_capture_clock_skew "small_skew" +#@ set test_allow_clock_reconvergence "true" +#@ set test_check_port_changes_in_capture "true" +#@ set test_infer_slave_clock_pulse_after_capture "infer" +#@ +#@ # +#@ # Test Variable Group: +#@ # +#@ # These variables affect the rtldrc, check_test, write_test_protocol +#@ # and write_test command. +#@ # +#@ set test_default_delay 0.0 +#@ set test_default_bidir_delay 0.0 +#@ set test_default_strobe 40.0 +#@ set test_default_strobe_width 0.0 +#@ set test_default_period 100.0 +#@ set test_stil_max_line_length 72 +#@ +#@ #added for B-2008.09-place_opt-004 to disable this option in ICC +#@ +#@ if { $synopsys_program_name != "icc_shell"} { +#@ set test_write_four_cycle_stil_protocol "false" +#@ set test_protocol_add_cycle "true" +#@ set test_stil_multiclock_capture_procedures "false" +#@ set write_test_new_translation_engine "false" +#@ set test_default_scan_style "multiplexed_flip_flop" +#@ set test_jump_over_bufs_invs "true" +#@ set test_point_keep_hierarchy "false" +#@ set test_mux_constant_so "false" +#@ set test_use_test_models "false" +#@ set test_stil_netlist_format "db" +#@ group_variable test "test_protocol_add_cycle" +#@ group_variable test "test_write_four_cycle_stil_protocol" +#@ group_variable test "test_stil_multiclock_capture_procedures" +#@ group_variable test "test_default_scan_style" +#@ group_variable preview_scan "test_jump_over_bufs_invs" +#@ group_variable insert_dft "test_point_keep_hierarchy" +#@ group_variable insert_dft "test_mux_constant_so" +#@ group_variable test "test_stil_netlist_format" +#@ } +#@ set test_rtldrc_latch_check_style "default" +#@ set test_enable_capture_checks "true" +#@ set ctldb_use_old_prot_flow "false" +#@ set test_bsd_default_delay 0.0 +#@ set test_bsd_default_bidir_delay 0.0 +#@ set test_bsd_default_strobe 95.0 +#@ set test_bsd_default_strobe_width 0.0 +#@ +#@ # +#@ # Test Variable Group: +#@ # +#@ # These variables affects the set_scan_state command. +#@ # +#@ +#@ set compile_seqmap_identify_shift_registers_with_synchronous_logic_ascii false +#@ +#@ # +#@ # Write_Test Variable Group: +#@ # +#@ # These variables affect output of the WRITE_TEST command. +#@ # +#@ set write_test_input_dont_care_value "X" +#@ set write_test_vector_file_naming_style "%s_%d.%s" +#@ set write_test_scan_check_file_naming_style "%s_schk.%s" +#@ set write_test_pattern_set_naming_style "TC_Syn_%d" +#@ set write_test_max_cycles 0 +#@ set write_test_max_scan_patterns 0 +#@ # /*retain "tssi_ascii" (equivalent to "tds") for backward compatability */ +#@ set write_test_formats {synopsys tssi_ascii tds verilog vhdl wgl} +#@ set write_test_include_scan_cell_info "true" +#@ set write_test_round_timing_values "true" +#@ +#@ +#@ # +#@ # Schematic and EDIF and Hdl Variable Groups: +#@ # +#@ # These variables affect the schematics created by the +#@ # create_schematic command, define the behavior of the +#@ # DC system EDIF interface, and are for controlling hdl +#@ # reading. +#@ # +#@ set bus_dimension_separator_style {][} +#@ set bus_naming_style {%s[%d]} +#@ +#@ +#@ # +#@ # Schematic and EDIF Variable Groups: +#@ # +#@ # These variables affect the schematics created by the +#@ # create_schematic command and define the behavior of +#@ # the DC system EDIF interface. +#@ # +#@ set bus_range_separator_style ":" +#@ +#@ +#@ # +#@ # EDIF and Io Variable Groups: +#@ # +#@ # These variables define the behavior of the DC system EDIF interface and +#@ # define the behavior of the DC system interfaces, i.e. LSI, Mentor, TDL, SGE,# etc. +#@ +#@ set bus_inference_descending_sort "true" +#@ set bus_inference_style "" +#@ set write_name_nets_same_as_ports "false" +#@ # +#@ # Schematic Variable Group: +#@ # +#@ # These variables affect the schematics created by the +#@ # create_schematic command. +#@ # +#@ set font_library "1_25.font" +#@ set generic_symbol_library "generic.sdb" +#@ +#@ # +#@ # Io Variable Group: +#@ # +#@ # These variables define the behavior of the DC system +#@ # interfaces, i.e. LSI, Mentor, TDL, SGE, etc. +#@ # +#@ #set db2sge_output_directory "" +#@ #set db2sge_scale "2" +#@ #set db2sge_overwrite "true" +#@ #set db2sge_display_symbol_names "false" +#@ +#@ +#@ #set db2sge_display_pin_names "false" +#@ #set db2sge_display_instance_names "false" +#@ #set db2sge_use_bustaps "false" +#@ #set db2sge_use_compound_names "true" +#@ #set db2sge_bit_type "std_logic" +#@ #set db2sge_bit_vector_type "std_logic_vector" +#@ #set db2sge_one_name "'1'" +#@ #set db2sge_zero_name "'0'" +#@ #set db2sge_unknown_name "'X'" +#@ #set db2sge_target_xp "false" +#@ #set db2sge_tcf_package_file "synopsys_tcf.vhd" +#@ #set db2sge_use_lib_section "" +#@ #set db2sge_script "" +#@ #set db2sge_command "" +#@ +#@ # set equationout_and_sign "*" +#@ # set equationout_or_sign "+" +#@ # set equationout_postfix_negation "true" +#@ +#@ # # [wjchen] 2006/08/14: The following variables are obsoleted for DC simpilification. +#@ #set lsiin_net_name_prefix "NET_" +#@ #set lsiout_inverter_cell "" +#@ #set lsiout_upcase "true" +#@ +#@ #set mentor_bidirect_value "INOUT" +#@ #set mentor_do_path "" +#@ #set mentor_input_output_property_name "PINTYPE" +#@ #set mentor_input_value "IN" +#@ #set mentor_logic_one_value "1SF" +#@ #set mentor_logic_zero_one_property_name "INIT" +#@ #set mentor_logic_zero_value "0SF" +#@ #set mentor_output_value "OUT" +#@ #set mentor_primitive_property_name "PRIMITIVE" +#@ #set mentor_primitive_property_value "MODULE" +#@ #set mentor_reference_property_name "COMP" +#@ #set mentor_search_path "" +#@ #set mentor_write_symbols "true" +#@ +#@ ## [wjchen] 0606_simp +#@ #set pla_read_create_flip_flop "false" +#@ #set tdlout_upcase "true" +#@ +#@ # # [wjchen] 2006/08/14: The following4 variables are obsoleted for DC simpilification. +#@ # set xnfout_constraints_per_endpoint "50" +#@ # set xnfout_default_time_constraints true +#@ # set xnfout_clock_attribute_style "CLK_ONLY" +#@ # set xnfout_library_version "" +#@ +#@ # # [wjchen] 2006/08/11: The following 8 variables are obsoleted for DC simpilification. +#@ # set xnfin_family "4000" +#@ # set xnfin_ignore_pins "GTS GSR GR" +#@ # set xnfin_dff_reset_pin_name "RD" +#@ # set xnfin_dff_set_pin_name "SD" +#@ # set xnfin_dff_clock_enable_pin_name "CE" +#@ # set xnfin_dff_data_pin_name "D" +#@ # set xnfin_dff_clock_pin_name "C" +#@ # set xnfin_dff_q_pin_name "Q" +#@ # +#@ +#@ # +#@ # EDIF Variable Group: +#@ # +#@ # These variables define the behavior of the DC system +#@ # EDIF interface. +#@ # +#@ +#@ ##[wjchen] 2006/08/24 +#@ +#@ # set bus_extraction_style {%s[%d:%d]} +#@ +#@ ##[wjchen] 2006/08/24 +#@ #set edifin_autoconnect_offpageconnectors "false" +#@ #set edifin_autoconnect_ports "false" +#@ #set edifin_dc_script_flag "" +#@ #set edifin_delete_empty_cells "true" +#@ #set edifin_delete_ripper_cells "true" +#@ #set edifin_ground_net_name "" +#@ #set edifin_ground_net_property_name "" +#@ #set edifin_ground_net_property_value "" +#@ #set edifin_ground_port_name "" +#@ #set edifin_instance_property_name "" +#@ #set edifin_portinstance_disabled_property_name "" +#@ #set edifin_portinstance_disabled_property_value "" +#@ #set edifin_portinstance_property_name "" +#@ #set edifin_power_net_name "" +#@ #set edifin_power_net_property_name "" +#@ #set edifin_power_net_property_value "" +#@ #set edifin_power_port_name "" +#@ #set edifin_use_identifier_in_rename "false" +#@ #set edifin_view_identifier_property_name "" +#@ #set edifin_lib_logic_1_symbol "" +#@ #set edifin_lib_logic_0_symbol "" +#@ #set edifin_lib_in_port_symbol "" +#@ #set edifin_lib_out_port_symbol "" +#@ #set edifin_lib_inout_port_symbol "" +#@ #set edifin_lib_in_osc_symbol "" +#@ #set edifin_lib_out_osc_symbol "" +#@ #set edifin_lib_inout_osc_symbol "" +#@ #set edifin_lib_mentor_netcon_symbol "" +#@ #set edifin_lib_ripper_bits_property "" +#@ #set edifin_lib_ripper_bus_end "" +#@ #set edifin_lib_ripper_cell_name "" +#@ #set edifin_lib_ripper_view_name "" +#@ #set edifin_lib_route_grid 1024 +#@ #set edifin_lib_templates {} +#@ #set edifout_dc_script_flag "" +#@ #set edifout_design_name "Synopsys_edif" +#@ #set edifout_designs_library_name "DESIGNS" +#@ #set edifout_display_instance_names "false" +#@ #set edifout_display_net_names "false" +#@ #set edifout_external "true" +#@ #set edifout_external_graphic_view_name "Graphic_representation" +#@ #set edifout_external_netlist_view_name "Netlist_representation" +#@ #set edifout_external_schematic_view_name "Schematic_representation" +#@ #set edifout_ground_name "logic_0" +#@ #set edifout_ground_net_name "" +#@ #set edifout_ground_net_property_name "" +#@ #set edifout_ground_net_property_value "" +#@ #set edifout_ground_pin_name "logic_0_pin" +#@ #set edifout_ground_port_name "GND" +#@ #set edifout_instance_property_name "" +#@ #set edifout_instantiate_ports "false" +#@ #set edifout_library_graphic_view_name "Graphic_representation" +#@ #set edifout_library_netlist_view_name "Netlist_representation" +#@ #set edifout_library_schematic_view_name "Schematic_representation" +#@ #set edifout_merge_libraries "false" +#@ #set edifout_multidimension_arrays "false" +#@ #set edifout_name_oscs_different_from_ports "false" +#@ #set edifout_name_rippers_same_as_wires "false" +#@ #set edifout_netlist_only "false" +#@ #set edifout_no_array "false" +#@ #set edifout_numerical_array_members "false" +#@ #set edifout_pin_direction_in_value "" +#@ #set edifout_pin_direction_inout_value "" +#@ #set edifout_pin_direction_out_value "" +#@ #set edifout_pin_direction_property_name "" +#@ #set edifout_pin_name_property_name "" +#@ #set edifout_portinstance_disabled_property_name "" +#@ #set edifout_portinstance_disabled_property_value "" +#@ #set edifout_portinstance_property_name "" +#@ #set edifout_power_and_ground_representation "cell" +#@ #set edifout_power_name "logic_1" +#@ #set edifout_power_net_name "" +#@ #set edifout_power_net_property_name "" +#@ #set edifout_power_net_property_value "" +#@ #set edifout_power_pin_name "logic_1_pin" +#@ #set edifout_power_port_name "VDD" +#@ #set edifout_skip_port_implementations "false" +#@ #set edifout_target_system "" +#@ #set edifout_top_level_symbol "true" +#@ #set edifout_translate_origin "" +#@ #set edifout_unused_property_value "" +#@ #set edifout_write_attributes "false" +#@ #set edifout_write_constraints "false" +#@ #set edifout_write_properties_list {} +#@ #set read_name_mapping_nowarn_libraries {} +#@ #set write_name_mapping_nowarn_libraries {} +#@ +#@ # +#@ # Hdl and Vhdlio Variable Groups: +#@ # +#@ # These variables are for controlling hdl reading, writing, +#@ # and optimizing. +#@ # +#@ set hdlin_enable_upf_compatible_naming "FALSE" +#@ set hdlin_auto_save_templates "FALSE" +#@ set hdlin_generate_naming_style "%s_%d" +#@ set hdlin_enable_relative_placement "rb" +#@ set hdlin_mux_rp_limit "128x4" +#@ set hdlin_generate_separator_style "_" +#@ set hdlin_ignore_textio_constructs "TRUE" +#@ set hdlin_infer_function_local_latches "FALSE" +#@ set hdlin_keep_signal_name "all_driving" +#@ set hdlin_module_arch_name_splitting "FALSE" +#@ set hdlin_preserve_sequential "none" +#@ set hdlin_presto_net_name_prefix "N" +#@ set hdlin_presto_cell_name_prefix "C" +#@ set hdlin_strict_verilog_reader "FALSE" +#@ set hdlin_prohibit_nontri_multiple_drivers "TRUE" +#@ if { $synopsys_program_name == "de_shell" } { +#@ set hdlin_elab_errors_deep "TRUE" +#@ } else { +#@ set hdlin_elab_errors_deep "FALSE" +#@ } +#@ set hdlin_mux_size_min 2 +#@ set hdlin_subprogram_default_values "FALSE" +#@ set hdlin_field_naming_style "" +#@ set hdlin_upcase_names "FALSE" +#@ set hdlin_sv_union_member_naming "FALSE" +#@ set hdlin_enable_hier_map "FALSE" +#@ set hdlin_sv_interface_only_modules "" +#@ set hdlin_sv_enable_rtl_attributes "FALSE" +#@ set hdlin_vhdl_std 2008 +#@ set hdlin_vhdl93_concat "TRUE" +#@ set hdlin_vhdl_syntax_extensions "FALSE" +#@ set hdlin_analyze_verbose_mode 0 +#@ set hdlin_report_sequential_pruning "FALSE" +#@ set hdlin_vrlg_std 2005 +#@ set hdlin_sverilog_std 2012 +#@ set hdlin_while_loop_iterations 4096 +#@ set hdlin_reporting_level "basic" +#@ set hdlin_autoread_verilog_extensions ".v" +#@ set hdlin_autoread_sverilog_extensions ".sv .sverilog" +#@ set hdlin_autoread_vhdl_extensions ".vhd .vhdl" +#@ set hdlin_autoread_exclude_extensions "" +#@ +#@ set bus_minus_style "-%d" +#@ set hdlin_latch_always_async_set_reset FALSE +#@ set hdlin_ff_always_sync_set_reset FALSE +#@ set hdlin_ff_always_async_set_reset TRUE +#@ set hdlin_check_input_netlist FALSE +#@ set hdlin_check_no_latch FALSE +#@ set hdlin_mux_for_array_read_sparseness_limit 90 +#@ set hdlin_infer_mux "default" +#@ set hdlin_mux_oversize_ratio 100 +#@ set hdlin_mux_size_limit 32 +#@ set hdlin_mux_size_only 1 +#@ set hdlin_infer_multibit "default_none" +#@ set hdlin_enable_rtldrc_info "false" +#@ set hdlin_interface_port_ABI 3 +#@ set hdlin_shorten_long_module_name "false" +#@ set hdlin_module_name_limit 256 +#@ set hdlin_enable_assertions "FALSE" +#@ set hdlin_enable_configurations "FALSE" +#@ set hdlin_sv_blackbox_modules "" +#@ set hdlin_sv_tokens "FALSE" +#@ set hdlin_sv_packages "enable" +#@ set hdlin_verification_priority "FALSE" +#@ set hdlin_enable_elaborate_ref_linking "FALSE" +#@ set hdlin_enable_hier_naming "FALSE" +#@ set hdlin_enable_elaborate_update "true" +#@ set hdlin_vhdl_mixed_language_instantiation "FALSE" +#@ set hdl_preferred_license "" +#@ set hdl_keep_licenses "true" +#@ set hlo_resource_allocation "constraint_driven" +#@ set sdfout_top_instance_name "" +#@ set sdfout_time_scale 1.0 +#@ set sdfout_min_rise_net_delay 0. +#@ set sdfout_min_fall_net_delay 0. +#@ set sdfout_min_rise_cell_delay 0. +#@ set sdfout_min_fall_cell_delay 0. +#@ set sdfout_write_to_output "false" +#@ set sdfout_allow_non_positive_constraints "false" +#@ set sdfin_top_instance_name "" +#@ set sdfin_min_rise_net_delay 0. +#@ set sdfin_min_fall_net_delay 0. +#@ set sdfin_min_rise_cell_delay 0. +#@ set sdfin_min_fall_cell_delay 0. +#@ set sdfin_rise_net_delay_type "maximum" +#@ set sdfin_fall_net_delay_type "maximum" +#@ set sdfin_rise_cell_delay_type "maximum" +#@ set sdfin_fall_cell_delay_type "maximum" +#@ set site_info_file ${synopsys_root}/admin/license/site_info +#@ if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ alias site_info sh cat $site_info_file +#@ } else { +#@ alias site_info "sh cat site_info_file" +#@ } +#@ set template_naming_style "%s_%p" +#@ set template_parameter_style "%s%d" +#@ set template_separator_style "_" +#@ set verilogout_equation "false" +#@ set verilogout_ignore_case "false" +#@ set verilogout_no_tri "false" +#@ set verilogout_inout_is_in "false" +#@ set verilogout_single_bit "false" +#@ set verilogout_higher_designs_first "FALSE" +#@ # set verilogout_levelize "FALSE" +#@ set verilogout_include_files {} +#@ set verilogout_unconnected_prefix "SYNOPSYS_UNCONNECTED_" +#@ set verilogout_show_unconnected_pins "FALSE" +#@ set verilogout_no_negative_index "FALSE" +#@ #set enable_2003.03_verilog_reader TRUE +#@ # to have a net instead of 1'b0 and 1'b1 in inouts: +#@ set verilogout_indirect_inout_connection "FALSE" +#@ +#@ # set vhdlout_architecture_name "SYN_%a_%u" +#@ set vhdlout_bit_type "std_logic" +#@ # set vhdlout_bit_type_resolved "TRUE" +#@ set vhdlout_bit_vector_type "std_logic_vector" +#@ # set vhdlout_conversion_functions {} +#@ # set vhdlout_dont_write_types "FALSE" +#@ set vhdlout_equations "FALSE" +#@ set vhdlout_one_name "'1'" +#@ set vhdlout_package_naming_style "CONV_PACK_%d" +#@ set vhdlout_preserve_hierarchical_types "VECTOR" +#@ set vhdlout_separate_scan_in "FALSE" +#@ set vhdlout_single_bit "USER" +#@ set vhdlout_target_simulator "" +#@ set vhdlout_three_state_name "'Z'" +#@ set vhdlout_three_state_res_func "" +#@ # set vhdlout_time_scale 1.0 +#@ set vhdlout_top_configuration_arch_name "A" +#@ set vhdlout_top_configuration_entity_name "E" +#@ set vhdlout_top_configuration_name "CFG_TB_E" +#@ set vhdlout_unknown_name "'X'" +#@ set vhdlout_upcase "FALSE" +#@ set vhdlout_use_packages {IEEE.std_logic_1164} +#@ set vhdlout_wired_and_res_func "" +#@ set vhdlout_wired_or_res_func "" +#@ set vhdlout_write_architecture "TRUE" +#@ set vhdlout_write_components "TRUE" +#@ set vhdlout_write_entity "TRUE" +#@ set vhdlout_write_top_configuration "FALSE" +#@ # set vhdlout_synthesis_off "TRUE" +#@ set vhdlout_zero_name "'0'" +#@ #set vhdlout_levelize "FALSE" +#@ set vhdlout_dont_create_dummy_nets "FALSE" +#@ set vhdlout_follow_vector_direction "TRUE" +#@ +#@ +#@ # vhdl netlist reader variables +#@ set enable_vhdl_netlist_reader "FALSE" +#@ +#@ # variables pertaining to VHDL library generation +#@ set vhdllib_timing_mesg "true" +#@ set vhdllib_timing_xgen "false" +#@ set vhdllib_timing_checks "true" +#@ set vhdllib_negative_constraint "false" +#@ set vhdllib_glitch_handle "true" +#@ set vhdllib_pulse_handle "use_vhdllib_glitch_handle" +#@ # /*vhdllib_architecture = {FTBM, UDSM, FTSM, FTGS, VITAL}; */ +#@ set vhdllib_architecture {VITAL} +#@ set vhdllib_tb_compare 0 +#@ set vhdllib_tb_x_eq_dontcare FALSE +#@ set vhdllib_logic_system "ieee-1164" +#@ set vhdllib_logical_name "" +#@ +#@ # variables pertaining to technology library processing +#@ set read_db_lib_warnings FALSE +#@ set read_translate_msff TRUE +#@ set libgen_max_differences -1 +#@ +#@ # +#@ # Gui Variable Group +#@ # used for design_vision and psyn_gui +#@ # +#@ set gui_auto_start 0 +#@ set gui_start_option_no_windows 0 +#@ group_variable gui_variables "gui_auto_start" +#@ group_variable gui_variables "gui_start_option_no_windows" +#@ +#@ # +#@ # If you like emacs, uncomment the next line +#@ # set text_editor_command "emacs -fn 8x13 %s &" ; +#@ +#@ # You can delete pairs from this list, but you can't add new ones +#@ # unless you also update the UIL files. So, customers can not add +#@ # dialogs to this list, only Synopsys can do that. +#@ # +#@ set view_independent_dialogs { "test_report" " Test Reports " "report_print" " Report " "report_options" " Report Options " "report_win" " Report Output " "manual_page" " Manual Page " } +#@ +#@ # if color Silicon Graphics workstation +#@ if { [info exists x11_vendor_string] && [info exists x11_is_color]} { +#@ if { $x11_vendor_string == "Silicon" && $x11_is_color == "true" } { +#@ set x11_set_cursor_foreground "magenta" +#@ set view_use_small_cursor "true" +#@ set view_set_selecting_color "white" +#@ } +#@ } +#@ +#@ # if running on an Apollo machine +#@ set found_x11_vendor_string_apollo 0 +#@ set found_arch_apollo 0 +#@ if { [info exists x11_vendor_string]} { +#@ if { $x11_vendor_string == "Apollo "} { +#@ set found_x11_vendor_string_apollo 1 +#@ } +#@ } +#@ if { [info exists arch]} { +#@ if { $arch == "apollo"} { +#@ set found_arch_apollo 1 +#@ } +#@ } +#@ if { $found_x11_vendor_string_apollo == 1 || $found_arch_apollo == 1} { +#@ set enable_page_mode "false" +#@ } else { +#@ set enable_page_mode "true" +#@ } +#@ +#@ # don't work around this bug on the Apollo +#@ if { $found_x11_vendor_string_apollo == 1} { +#@ set view_extend_thick_lines "false" +#@ } else { +#@ set view_extend_thick_lines "true" +#@ } +#@ +#@ # +#@ # Suffix Variable Group: +#@ # +#@ # Suffixes recognized by the Design Analyzer menu in file choices +#@ # +#@ if { $synopsys_program_name == "design_vision" || $synopsys_program_name == "psyn_gui" } { +#@ # For star 93040 do NOT include NET in list, 108991 : pdb suffix added +#@ set view_read_file_suffix {db gdb sdb pdb edif eqn fnc lsi mif pla st tdl v vhd vhdl xnf} +#@ } else { +#@ set view_read_file_suffix {db gdb sdb edif eqn fnc lsi mif NET pla st tdl v vhd vhdl xnf} +#@ } +#@ +#@ set view_analyze_file_suffix {v vhd vhdl} +#@ set view_write_file_suffix {gdb db sdb do edif eqn fnc lsi NET neted pla st tdl v vhd vhdl xnf} +#@ set view_execute_script_suffix {.script .scr .dcs .dcv .dc .con} +#@ set view_arch_types {sparcOS5 hpux10 rs6000 sgimips} +#@ +#@ # +#@ # links_to_layout Variable Group: +#@ # +#@ # These variables affect the read_timing, write_timing +#@ # set_annotated_delay, compile, create_wire_load and reoptimize_design +#@ # commands. +#@ # +#@ if {$synopsys_program_name != "dc_sms_shell"} { +#@ set auto_wire_load_selection "true" +#@ set compile_create_wire_load_table "false" +#@ } +#@ set rtl_load_resistance_factor 0.0 +#@ +#@ # power Variable Group: +#@ # +#@ # These variables affect the behavior of power optimization and analysis. +#@ # +#@ +#@ set power_keep_license_after_power_commands "false" +#@ set power_rtl_saif_file "power_rtl.saif" +#@ set power_sdpd_saif_file "power_sdpd.saif" +#@ set power_preserve_rtl_hier_names "false" +#@ set power_do_not_size_icg_cells "true" +#@ set power_hdlc_do_not_split_cg_cells "false" +#@ set power_cg_flatten "false" +#@ set power_opto_extra_high_dynamic_power_effort "false" +#@ set power_default_static_probability 0.5 +#@ set power_default_toggle_rate 0.1 +#@ set power_default_toggle_rate_type "fastest_clock" +#@ set power_model_preference "nlpm" +#@ set power_sa_propagation_effort "low" +#@ set power_sa_propagation_verbose "false" +#@ set power_fix_sdpd_annotation "true" +#@ set power_fix_sdpd_annotation_verbose "false" +#@ set power_sdpd_message_tolerance 0.00001 +#@ set do_operand_isolation "false" +#@ set power_cg_module_naming_style "" +#@ set power_cg_cell_naming_style "" +#@ set power_cg_gated_clock_net_naming_style "" +#@ set power_rclock_use_asynch_inputs "false" +#@ set power_rclock_inputs_use_clocks_fanout "true" +#@ set power_rclock_unrelated_use_fastest "true" +#@ set power_lib2saif_rise_fall_pd "false" +#@ set power_min_internal_power_threshold "" +#@ +#@ +#@ # SystemC related variables +#@ set systemcout_levelize "true" +#@ set systemcout_debug_mode "false" +#@ +#@ # ACS Variables +#@ if { [info exists acs_work_dir] } { +#@ set acs_area_report_suffix "area" +#@ set acs_autopart_max_area "0.0" +#@ set acs_autopart_max_percent "0.0" +#@ set acs_budgeted_cstr_suffix "con" +#@ set acs_compile_script_suffix "autoscr" +#@ set acs_constraint_file_suffix "con" +#@ set acs_cstr_report_suffix "cstr" +#@ set acs_db_suffix "db" +#@ set acs_dc_exec "" +#@ set acs_default_pass_name "pass" +#@ set acs_exclude_extensions {} +#@ set acs_exclude_list [list $synopsys_root] +#@ set acs_global_user_compile_strategy_script "default" +#@ set acs_hdl_verilog_define_list {} +#@ set acs_hdl_source {} +#@ set acs_lic_wait 0 +#@ set acs_log_file_suffix "log" +#@ set acs_make_args "set acs_make_args" +#@ set acs_make_exec "gmake" +#@ set acs_makefile_name "Makefile" +#@ set acs_num_parallel_jobs 1 +#@ set acs_override_report_suffix "report" +#@ set acs_override_script_suffix "scr" +#@ set acs_qor_report_suffix "qor" +#@ set acs_timing_report_suffix "tim" +#@ set acs_use_autopartition "false" +#@ set acs_use_default_delays "false" +#@ set acs_user_budgeting_script "budget.scr" +#@ set acs_user_compile_strategy_script_suffix "compile" +#@ set acs_verilog_extensions {.v} +#@ set acs_vhdl_extensions {.vhd} +#@ set acs_work_dir [pwd] +#@ set check_error_list [list CMD-004 CMD-006 CMD-007 CMD-008 CMD-009 CMD-010 CMD-011 CMD-012 CMD-014 CMD-015 CMD-016 CMD-019 CMD-026 CMD-031 CMD-037 DB-1 DCSH-11 DES-001 ACS-193 FILE-1 FILE-2 FILE-3 FILE-4 LINK-7 LINT-7 LINT-20 LNK-023 OPT-100 OPT-101 OPT-102 OPT-114 OPT-124 OPT-127 OPT-128 OPT-155 OPT-157 OPT-181 OPT-462 UI-11 UI-14 UI-15 UI-16 UI-17 UI-19 UI-20 UI-21 UI-22 UI-23 UI-40 UI-41 UID-4 UID-6 UID-7 UID-8 UID-9 UID-13 UID-14 UID-15 UID-19 UID-20 UID-25 UID-27 UID-28 UID-29 UID-30 UID-32 UID-58 UID-87 UID-103 UID-109 UID-270 UID-272 UID-403 UID-440 UID-444 UIO-2 UIO-3 UIO-4 UIO-25 UIO-65 UIO-66 UIO-75 UIO-94 UIO-95 EQN-6 EQN-11 EQN-15 EQN-16 EQN-18 EQN-20 ] +#@ set ilm_preserve_core_constraints "false" +#@ } +#@ +#@ # +#@ # +#@ # DesignTime Variable Group +#@ # +#@ # The variables which affect the DesignTime timing engine +#@ # +#@ +#@ set case_analysis_log_file "" +#@ set case_analysis_sequential_propagate "false" +#@ set create_clock_no_input_delay "false" +#@ set disable_auto_time_borrow "false" +#@ set disable_case_analysis "false" +#@ set disable_conditional_mode_analysis "false" +#@ set disable_library_transition_degradation "false" +#@ set dont_bind_unused_pins_to_logic_constant "false" +#@ set enable_slew_degradation "true" +#@ set high_fanout_net_pin_capacitance 1.000000 +#@ set high_fanout_net_threshold 1000 +#@ set lib_thresholds_per_lib "true" +#@ set rc_adjust_rd_when_less_than_rnet "true" +#@ set rc_ceff_delay_min_diff_ps 0.250000 +#@ set rc_degrade_min_slew_when_rd_less_than_rnet "false" +#@ set rc_driver_model_max_error_pct 0.160000 +#@ set rc_filter_rd_less_than_rnet "true" +#@ set rc_input_threshold_pct_fall 50.000000 +#@ set rc_input_threshold_pct_rise 50.000000 +#@ set rc_output_threshold_pct_fall 50.000000 +#@ set rc_output_threshold_pct_rise 50.000000 +#@ set rc_rd_less_than_rnet_threshold 0.450000 +#@ set rc_slew_derate_from_library 1.000000 +#@ set rc_slew_lower_threshold_pct_fall 20.000000 +#@ set rc_slew_lower_threshold_pct_rise 20.000000 +#@ set rc_slew_upper_threshold_pct_fall 80.000000 +#@ set rc_slew_upper_threshold_pct_rise 80.000000 +#@ set timing_disable_cond_default_arcs "false" +#@ #timing_enable_multiple_clocks_per_reg is on by default +#@ #set timing_enable_multiple_clocks_per_reg "false" +#@ set timing_report_attributes {dont_touch dont_use map_only size_only ideal_net infeasible_paths} +#@ set timing_self_loops_no_skew "false" +#@ set when_analysis_permitted "true" +#@ set when_analysis_without_case_analysis "false" +#@ +#@ +#@ # +#@ # Variable Group Definitions: +#@ # +#@ # The group_variable() command groups variables for display +#@ # in the "File/Defaults" dialog and defines groups of variables +#@ # for the list() command. +#@ # +#@ +#@ set enable_instances_in_report_net "true" +#@ # Set report options env variables +#@ set view_report_interactive "true" +#@ set view_report_output2file "false" +#@ set view_report_append "true" +#@ +#@ if { $synopsys_program_name != "ptxr" } { +#@ +#@ group_variable report_variables "enable_instances_in_report_net" +#@ group_variable report_variables "view_report_interactive" +#@ group_variable report_variables "view_report_output2file" +#@ group_variable report_variables "view_report_append" +#@ +#@ # "links_to_layout" variables are used by multiple commands +#@ # auto_wire_load_selection is also in the "compile" variable group. +#@ group_variable links_to_layout "auto_wire_load_selection" +#@ +#@ # variables starting with "compile" are also in the compile variable group +#@ group_variable links_to_layout "compile_dont_touch_annotated_cell_during_inplace_opt" +#@ +#@ group_variable links_to_layout "compile_update_annotated_delays_during_inplace_opt" +#@ group_variable links_to_layout "compile_create_wire_load_table" +#@ +#@ group_variable links_to_layout "reoptimize_design_changed_list_file_name" +#@ group_variable links_to_layout "sdfout_allow_non_positive_constraints" +#@ +#@ } ;# $synopsys_program_name != "ptxr" +#@ +#@ # +#@ # to find the XErrorDB and XKeySymDB for X11 file +#@ set motif_files ${synopsys_root}/admin/setup +#@ # set filename for logging input file +#@ set filename_log_file "filenames.log" +#@ # whether to delete the filename log after the normal exits +#@ set exit_delete_filename_log_file "true" +#@ +#@ # executable to fire off RTLA/BCV +#@ set xterm_executable "xterm" +#@ +#@ if { $synopsys_program_name != "ptxr" } { +#@ +#@ # "system" variables are used by multiple commands +#@ group_variable system auto_link_disable +#@ group_variable system auto_link_options +#@ group_variable system command_log_file +#@ group_variable system company +#@ group_variable system compatibility_version +#@ +#@ if { [string compare $dc_shell_mode "default"] == 0 } { +#@ group_variable system "current_design" +#@ group_variable system "current_instance" +#@ group_variable system "dc_shell_status" +#@ } else { +#@ set current_design "" +#@ set current_instance "" +#@ group_variable system "current_design" +#@ group_variable system "current_instance" +#@ } +#@ +#@ group_variable system "designer" +#@ group_variable system "echo_include_commands" +#@ group_variable system "enable_page_mode" +#@ group_variable system "change_names_update_inst_tree" +#@ group_variable system "change_names_dont_change_bus_members" +#@ group_variable system "default_name_rules" +#@ group_variable system "verbose_messages" +#@ group_variable system "link_library" +#@ group_variable system "link_force_case" +#@ group_variable system "search_path" +#@ group_variable system "synthetic_library" +#@ group_variable system "target_library" +#@ group_variable system "uniquify_naming_style" +#@ group_variable system "suppress_errors" +#@ group_variable system "find_converts_name_lists" +#@ group_variable system "filename_log_file" +#@ group_variable system "exit_delete_filename_log_file" +#@ group_variable system "syntax_check_status" +#@ group_variable system "context_check_status" +#@ +#@ #/* "compile" variables are used by the compile command */ +#@ group_variable compile "compile_assume_fully_decoded_three_state_busses" +#@ group_variable compile "compile_no_new_cells_at_top_level" +#@ group_variable compile "compile_dont_touch_annotated_cell_during_inplace_opt" +#@ group_variable compile "reoptimize_design_changed_list_file_name" +#@ group_variable compile "compile_create_wire_load_table" +#@ group_variable compile "compile_update_annotated_delays_during_inplace_opt" +#@ group_variable compile "compile_instance_name_prefix" +#@ group_variable compile "compile_instance_name_suffix" +#@ group_variable compile "compile_negative_logic_methodology" +#@ group_variable compile "compile_disable_hierarchical_inverter_opt" +#@ +#@ group_variable compile "port_complement_naming_style" +#@ group_variable compile "auto_wire_load_selection" +#@ group_variable compile "rtl_load_resistance_factor" +#@ group_variable compile "compile_implementation_selection" +#@ group_variable compile "compile_use_low_timing_effort" +#@ group_variable compile "compile_fix_cell_degradation" +#@ group_variable compile "compile_preserve_subdesign_interfaces" +#@ group_variable compile "compile_enable_constant_propagation_with_no_boundary_opt" +#@ group_variable compile "compile_delete_unloaded_sequential_cells" +#@ group_variable compile "enable_recovery_removal_arcs" +#@ group_variable compile "compile_checkpoint_phases" +#@ group_variable compile "compile_cpu_limit" +#@ group_variable compile "compile_top_all_paths" +#@ group_variable compile "compile_top_all_paths" +#@ group_variable compile "compile_top_acs_partition" +#@ group_variable compile "default_port_connection_class" +#@ group_variable compile "compile_retime_license_behavior" +#@ group_variable compile "dont_touch_nets_with_size_only_cells" +#@ group_variable compile "compile_seqmap_no_scan_cell" +#@ +#@ if { $synopsys_program_name == "dc_shell" && [shell_is_in_topographical_mode] } { +#@ group_variable compile "dct_prioritize_area_correlation" +#@ group_variable compile "compile_error_on_missing_physical_cells" +#@ } +#@ +#@ # "multibit" variables are used by the the multibit mapping functionality +#@ +#@ group_variable multibit "bus_multiple_separator_style" +#@ +#@ # "ilm" variables are used by Interface Logic Model functionality +#@ +#@ group_variable ilm "ilm_ignore_percentage" +#@ +#@ # "estimate" variables are used by the estimate command +#@ # The estimate command also recognizes the "compile" variables. +#@ group_variable estimate "estimate_resource_preference" +#@ +#@ # "synthetic_library" variables +#@ group_variable synlib "cache_dir_chmod_octal" +#@ group_variable synlib "cache_file_chmod_octal" +#@ group_variable synlib "cache_read" +#@ group_variable synlib "cache_read_info" +#@ group_variable synlib "cache_write" +#@ group_variable synlib "cache_write_info" +#@ group_variable synlib "synlib_dont_get_license" +#@ group_variable synlib "synlib_wait_for_design_license" +#@ group_variable synlib "synthetic_library" +#@ +#@ # "insert_dft" variables are used by the insert_dft and preview_dft commands +#@ #group_variable insert_dft "test_default_client_order" +#@ group_variable insert_dft "insert_dft_clean_up" +#@ group_variable insert_dft "insert_test_design_naming_style" +#@ group_variable insert_dft "test_clock_port_naming_style" +#@ group_variable insert_dft "test_default_min_fault_coverage" +#@ group_variable insert_dft "test_scan_clock_a_port_naming_style" +#@ group_variable insert_dft "test_scan_clock_b_port_naming_style" +#@ group_variable insert_dft "test_scan_clock_port_naming_style" +#@ group_variable insert_dft "test_scan_enable_inverted_port_naming_style" +#@ group_variable insert_dft "test_scan_enable_port_naming_style" +#@ group_variable insert_dft "test_scan_in_port_naming_style" +#@ group_variable insert_dft "test_scan_out_port_naming_style" +#@ group_variable insert_dft "test_non_scan_clock_port_naming_style" +#@ group_variable insert_dft "test_dedicated_subdesign_scan_outs" +#@ group_variable insert_dft "test_disable_find_best_scan_out" +#@ group_variable insert_dft "test_dont_fix_constraint_violations" +#@ group_variable insert_dft "test_isolate_hier_scan_out" +#@ group_variable insert_dft "test_mode_port_naming_style" +#@ group_variable insert_dft "test_mode_port_inverted_naming_style" +#@ group_variable insert_dft "compile_dont_use_dedicated_scanout" +#@ group_variable insert_dft "test_mux_constant_si" +#@ +#@ # "preview_scan" variables are used by the preview_scan command +#@ group_variable preview_scan "test_preview_scan_shows_cell_types" +#@ group_variable preview_scan "test_scan_link_so_lockup_key" +#@ group_variable preview_scan "test_scan_link_wire_key" +#@ group_variable preview_scan "test_scan_segment_key" +#@ group_variable preview_scan "test_scan_true_key" +#@ +#@ # "bsd" variables are used by the check_bsd and write_bsdl commands +#@ group_variable bsd "test_user_test_data_register_naming_style" +#@ group_variable bsd "test_user_defined_instruction_naming_style" +#@ group_variable bsd "test_bsdl_default_suffix_name" +#@ group_variable bsd "test_bsdl_max_line_length" +#@ group_variable bsd "test_cc_ir_masked_bits" +#@ group_variable bsd "test_cc_ir_value_of_masked_bits" +#@ +#@ group_variable bsd "test_bsd_allow_tolerable_violations" +#@ group_variable bsd "test_bsd_optimize_control_cell" +#@ group_variable bsd "test_bsd_control_cell_drive_limit" +#@ group_variable bsd "test_bsd_manufacturer_id" +#@ group_variable bsd "test_bsd_part_number" +#@ group_variable bsd "test_bsd_version_number" +#@ group_variable bsd "bsd_max_in_switching_limit" +#@ group_variable bsd "bsd_max_out_switching_limit" +#@ +#@ # testmanager variables +#@ group_variable testmanager "multi_pass_test_generation" +#@ +#@ # "testsim" variables +#@ # group_variable testsim "testsim_print_stats_file" +#@ +#@ # "test" variables +#@ group_variable test "test_default_bidir_delay" +#@ group_variable test "test_default_delay" +#@ group_variable test "test_default_period" +#@ group_variable test "test_default_strobe" +#@ group_variable test "test_default_strobe_width" +#@ group_variable test "test_capture_clock_skew" +#@ group_variable test "test_allow_clock_reconvergence" +#@ group_variable test "test_check_port_changes_in_capture" +#@ group_variable test "test_stil_max_line_length" +#@ group_variable test "test_infer_slave_clock_pulse_after_capture" +#@ group_variable test "test_rtldrc_latch_check_style" +#@ group_variable test "test_enable_capture_checks" +#@ +#@ # "write_test" variables are used by the write_test command +#@ group_variable write_test "write_test_formats" +#@ group_variable write_test "write_test_include_scan_cell_info" +#@ group_variable write_test "write_test_input_dont_care_value" +#@ group_variable write_test "write_test_max_cycles" +#@ group_variable write_test "write_test_max_scan_patterns" +#@ group_variable write_test "write_test_pattern_set_naming_style" +#@ group_variable write_test "write_test_scan_check_file_naming_style" +#@ group_variable write_test "write_test_vector_file_naming_style" +#@ group_variable write_test "write_test_round_timing_values" +#@ +#@ group_variable view "test_design_analyzer_uses_insert_scan" +#@ +#@ # "io" variables are used by the read, read_lib, db2sge and write commands +#@ group_variable io "bus_inference_descending_sort" +#@ group_variable io "bus_inference_style" +#@ #group_variable io "db2sge_output_directory" +#@ #group_variable io "db2sge_scale" +#@ #group_variable io "db2sge_overwrite" +#@ #group_variable io "db2sge_display_symbol_names" +#@ #group_variable io "db2sge_display_pin_names" +#@ #group_variable io "db2sge_display_instance_names" +#@ #group_variable io "db2sge_use_bustaps" +#@ #group_variable io "db2sge_use_compound_names" +#@ #group_variable io "db2sge_bit_type" +#@ #group_variable io "db2sge_bit_vector_type" +#@ #group_variable io "db2sge_one_name" +#@ #group_variable io "db2sge_zero_name" +#@ #group_variable io "db2sge_unknown_name" +#@ #group_variable io "db2sge_target_xp" +#@ #group_variable io "db2sge_tcf_package_file" +#@ #group_variable io "db2sge_use_lib_section" +#@ #group_variable io "db2sge_script" +#@ #group_variable io "db2sge_command" +#@ +#@ # group_variable io "equationout_and_sign" +#@ # group_variable io "equationout_or_sign" +#@ # group_variable io "equationout_postfix_negation" +#@ +#@ # group_variable io "lsiin_net_name_prefix" +#@ # group_variable io "lsiout_inverter_cell" +#@ # group_variable io "lsiout_upcase" +#@ +#@ #group_variable io "mentor_bidirect_value" +#@ #group_variable io "mentor_do_path" +#@ #group_variable io "mentor_input_output_property_name" +#@ #group_variable io "mentor_input_value" +#@ #group_variable io "mentor_logic_one_value" +#@ #group_variable io "mentor_logic_zero_one_property_name" +#@ #group_variable io "mentor_logic_zero_value" +#@ #group_variable io "mentor_output_value" +#@ #group_variable io "mentor_primitive_property_name" +#@ #group_variable io "mentor_primitive_property_value" +#@ #group_variable io "mentor_reference_property_name" +#@ #group_variable io "mentor_search_path" +#@ #group_variable io "mentor_write_symbols" +#@ # group_variable io "pla_read_create_flip_flop" +#@ # group_variable io "tdlout_upcase" +#@ group_variable io "write_name_nets_same_as_ports" +#@ +#@ # # [wjchen] 2006/08/14: The following 4 variables are obsoleted for DC simpilification. +#@ +#@ # group_variable io "xnfout_constraints_per_endpoint" +#@ # group_variable io "xnfout_default_time_constraints" +#@ # group_variable io "xnfout_clock_attribute_style" +#@ # group_variable io "xnfout_library_version" +#@ +#@ # # [wjchen] 2006/08/11: The following 8 variables are obsoleted for DC simpilification. +#@ # group_variable io "xnfin_family" +#@ # group_variable io "xnfin_ignore_pins" +#@ # group_variable io "xnfin_dff_reset_pin_name" +#@ # group_variable io "xnfin_dff_set_pin_name" +#@ # group_variable io "xnfin_dff_clock_enable_pin_name" +#@ # group_variable io "xnfin_dff_data_pin_name" +#@ # group_variable io "xnfin_dff_clock_pin_name" ; +#@ # group_variable io "xnfin_dff_q_pin_name"; +#@ +#@ group_variable io "sdfin_min_rise_net_delay" ; +#@ group_variable io "sdfin_min_fall_net_delay" ; +#@ group_variable io "sdfin_min_rise_cell_delay" ; +#@ group_variable io "sdfin_min_fall_cell_delay" ; +#@ group_variable io "sdfin_rise_net_delay_type" ; +#@ group_variable io "sdfin_fall_net_delay_type" ; +#@ group_variable io "sdfin_rise_cell_delay_type" ; +#@ group_variable io "sdfin_fall_cell_delay_type" ; +#@ group_variable io "sdfin_top_instance_name" ; +#@ group_variable io "sdfout_time_scale" ; +#@ group_variable io "sdfout_write_to_output" ; +#@ group_variable io "sdfout_top_instance_name" ; +#@ group_variable io "sdfout_min_rise_net_delay" ; +#@ group_variable io "sdfout_min_fall_net_delay" ; +#@ group_variable io "sdfout_min_rise_cell_delay" ; +#@ group_variable io "sdfout_min_fall_cell_delay" ; +#@ group_variable io "read_db_lib_warnings" ; +#@ group_variable io "read_translate_msff" ; +#@ group_variable io "libgen_max_differences" ; +#@ +#@ # #[wjchen] 2006/08/22: The following variables are hidden for XG mode for DC simpilification. +#@ # group_variable io "read_name_mapping_nowarn_libraries" ; +#@ # group_variable io "write_name_mapping_nowarn_libraries" ; +#@ +#@ +#@ # "edif" variables are used by the EDIF format read, read_lib, write, +#@ # and write_lib commands +#@ # group_variable edif "bus_dimension_separator_style" ; +#@ # group_variable edif "bus_extraction_style" ; +#@ group_variable edif "bus_inference_descending_sort" ; +#@ group_variable edif "bus_inference_style" ; +#@ group_variable edif "bus_naming_style" ; +#@ group_variable edif "bus_range_separator_style" ; +#@ # group_variable edif "edifin_autoconnect_offpageconnectors" ; +#@ # group_variable edif "edifin_autoconnect_ports" ; +#@ # group_variable edif "edifin_delete_empty_cells" ; +#@ # group_variable edif "edifin_delete_ripper_cells" ; +#@ # group_variable edif "edifin_ground_net_name" ; +#@ # group_variable edif "edifin_ground_net_property_name" ; +#@ # group_variable edif "edifin_ground_net_property_value" ; +#@ # group_variable edif "edifin_ground_port_name" ; +#@ # group_variable edif "edifin_instance_property_name" ; +#@ # group_variable edif "edifin_portinstance_disabled_property_name" ; +#@ # group_variable edif "edifin_portinstance_disabled_property_value" ; +#@ # group_variable edif "edifin_portinstance_property_name" ; +#@ # group_variable edif "edifin_power_net_name" ; +#@ # group_variable edif "edifin_power_net_property_name" ; +#@ # group_variable edif "edifin_power_net_property_value" ; +#@ # group_variable edif "edifin_power_port_name" ; +#@ # group_variable edif "edifin_use_identifier_in_rename" ; +#@ # group_variable edif "edifin_view_identifier_property_name" ; +#@ # group_variable edif "edifin_dc_script_flag" ; +#@ # group_variable edif "edifin_lib_logic_1_symbol" ; +#@ # group_variable edif "edifin_lib_logic_0_symbol" ; +#@ # group_variable edif "edifin_lib_in_port_symbol" ; +#@ # group_variable edif "edifin_lib_out_port_symbol" ; +#@ # group_variable edif "edifin_lib_inout_port_symbol" ; +#@ # group_variable edif "edifin_lib_in_osc_symbol" ; +#@ # group_variable edif "edifin_lib_out_osc_symbol" ; +#@ # group_variable edif "edifin_lib_inout_osc_symbol" ; +#@ # group_variable edif "edifin_lib_mentor_netcon_symbol" ; +#@ # group_variable edif "edifin_lib_ripper_bits_property" ; +#@ # group_variable edif "edifin_lib_ripper_bus_end" ; +#@ # group_variable edif "edifin_lib_ripper_cell_name" ; +#@ # group_variable edif "edifin_lib_ripper_view_name" ; +#@ # group_variable edif "edifin_lib_route_grid" ; +#@ # group_variable edif "edifin_lib_templates" ; +#@ # group_variable edif "edifout_dc_script_flag" ; +#@ # group_variable edif "edifout_design_name" ; +#@ # group_variable edif "edifout_designs_library_name" ; +#@ # group_variable edif "edifout_display_instance_names" ; +#@ # group_variable edif "edifout_display_net_names" ; +#@ # group_variable edif "edifout_external" ; +#@ # group_variable edif "edifout_external_graphic_view_name" ; +#@ # group_variable edif "edifout_external_netlist_view_name" ; +#@ # group_variable edif "edifout_external_schematic_view_name" ; +#@ # group_variable edif "edifout_ground_name" ; +#@ # group_variable edif "edifout_ground_net_name" ; +#@ # group_variable edif "edifout_ground_net_property_name" ; +#@ # group_variable edif "edifout_ground_net_property_value" ; +#@ # group_variable edif "edifout_ground_pin_name" ; +#@ # group_variable edif "edifout_ground_port_name" ; +#@ # group_variable edif "edifout_instance_property_name" ; +#@ # group_variable edif "edifout_instantiate_ports" ; +#@ # group_variable edif "edifout_library_graphic_view_name" ; +#@ # group_variable edif "edifout_library_netlist_view_name" ; +#@ # group_variable edif "edifout_library_schematic_view_name" ; +#@ # group_variable edif "edifout_merge_libraries" ; +#@ # group_variable edif "edifout_multidimension_arrays" ; +#@ # group_variable edif "edifout_name_oscs_different_from_ports" ; +#@ # group_variable edif "edifout_name_rippers_same_as_wires" ; +#@ # group_variable edif "edifout_netlist_only" ; +#@ # group_variable edif "edifout_no_array" ; +#@ # group_variable edif "edifout_numerical_array_members" ; +#@ # group_variable edif "edifout_pin_direction_property_name" ; +#@ # group_variable edif "edifout_pin_direction_in_value" ; +#@ # group_variable edif "edifout_pin_direction_inout_value" ; +#@ # group_variable edif "edifout_pin_direction_out_value" ; +#@ # group_variable edif "edifout_pin_name_property_name" ; +#@ # group_variable edif "edifout_portinstance_disabled_property_name" ; +#@ # group_variable edif "edifout_portinstance_disabled_property_value" ; +#@ # group_variable edif "edifout_portinstance_property_name" +#@ # group_variable edif "edifout_power_and_ground_representation" +#@ # group_variable edif "edifout_power_name" +#@ # group_variable edif "edifout_power_net_name" +#@ # group_variable edif "edifout_power_net_property_name" +#@ # group_variable edif "edifout_power_net_property_value" +#@ # group_variable edif "edifout_power_pin_name" +#@ # group_variable edif "edifout_power_port_name" +#@ # group_variable edif "edifout_skip_port_implementations" +#@ # group_variable edif "edifout_target_system" +#@ # group_variable edif "edifout_top_level_symbol" +#@ # group_variable edif "edifout_translate_origin" +#@ # group_variable edif "edifout_unused_property_value" +#@ # group_variable edif "edifout_write_attributes" +#@ # group_variable edif "edifout_write_constraints" +#@ # group_variable edif "edifout_write_properties_list" +#@ # group_variable edif "write_name_nets_same_as_ports" +#@ +#@ # "hdl" variables are variables pertaining to hdl reading and optimizing +#@ group_variable hdl "bus_dimension_separator_style" +#@ group_variable hdl "bus_minus_style" +#@ group_variable hdl "bus_naming_style" +#@ group_variable hdl "hdlin_ignore_textio_constructs" +#@ group_variable hdl "hdlin_latch_always_async_set_reset" +#@ group_variable hdl "hdlin_ff_always_sync_set_reset" +#@ group_variable hdl "hdlin_ff_always_async_set_reset" +#@ group_variable hdl "hdlin_check_input_netlist" +#@ group_variable hdl "hdlin_check_no_latch" +#@ group_variable hdl "hdlin_reporting_level" +#@ group_variable hdl "hdlin_infer_mux" +#@ group_variable hdl "hdlin_mux_oversize_ratio" +#@ group_variable hdl "hdlin_mux_size_limit" +#@ group_variable hdl "hdlin_infer_multibit" +#@ group_variable hdl "hdl_preferred_license" +#@ group_variable hdl "hdl_keep_licenses" +#@ group_variable hdl "hlo_resource_allocation" +#@ group_variable hdl "template_naming_style" +#@ group_variable hdl "template_parameter_style" +#@ group_variable hdl "template_separator_style" +#@ group_variable hdl "verilogout_equation" +#@ group_variable hdl "verilogout_ignore_case" +#@ group_variable hdl "verilogout_no_tri" +#@ group_variable hdl "verilogout_inout_is_in" +#@ group_variable hdl "verilogout_single_bit" +#@ group_variable hdl "verilogout_higher_designs_first" +#@ # group_variable hdl "verilogout_levelize" +#@ group_variable hdl "verilogout_include_files" +#@ group_variable hdl "verilogout_unconnected_prefix" +#@ group_variable hdl "verilogout_show_unconnected_pins" +#@ group_variable hdl "verilogout_no_negative_index" +#@ group_variable hdl "hdlin_enable_rtldrc_info" +#@ group_variable hdl "hdlin_sv_blackbox_modules" +#@ group_variable hdl "hdlin_sv_enable_rtl_attributes" +#@ group_variable hdl "hdlin_enable_hier_map" +#@ group_variable hdl "hdlin_sv_interface_only_modules" +#@ group_variable hdl "hdlin_infer_function_local_latches" +#@ group_variable hdl "hdlin_module_arch_name_splitting" +#@ group_variable hdl "hdlin_mux_size_min" +#@ group_variable hdl "hdlin_prohibit_nontri_multiple_drivers" +#@ group_variable hdl "hdlin_subprogram_default_values" +#@ group_variable hdl "hdlin_upcase_names" +#@ group_variable hdl "hdlin_vhdl_std" +#@ group_variable hdl "hdlin_vhdl93_concat" +#@ group_variable hdl "hdlin_vhdl_syntax_extensions" +#@ group_variable hdl "hdlin_vrlg_std" +#@ group_variable hdl "hdlin_while_loop_iterations" +#@ group_variable hdl "hdlin_auto_save_templates" +#@ group_variable hdl "hdlin_elab_errors_deep" +#@ group_variable hdl "hdlin_enable_assertions" +#@ group_variable hdl "hdlin_enable_configurations" +#@ group_variable hdl "hdlin_field_naming_style" +#@ group_variable hdl "hdlin_generate_naming_style" +#@ group_variable hdl "hdlin_generate_separator_style" +#@ group_variable hdl "hdlin_enable_relative_placement" +#@ group_variable hdl "hdlin_mux_rp_limit" +#@ group_variable hdl "hdlin_keep_signal_name" +#@ group_variable hdl "hdlin_module_name_limit" +#@ group_variable hdl "hdlin_mux_size_only" +#@ group_variable hdl "hdlin_preserve_sequential" +#@ group_variable hdl "hdlin_presto_cell_name_prefix" +#@ group_variable hdl "hdlin_presto_net_name_prefix" +#@ group_variable hdl "hdlin_strict_verilog_reader" +#@ group_variable hdl "hdlin_shorten_long_module_name" +#@ group_variable hdl "hdlin_sv_packages" +#@ group_variable hdl "hdlin_sv_tokens" +#@ group_variable hdl "hdlin_enable_elaborate_ref_linking" +#@ group_variable hdl "hdlin_enable_hier_naming" +#@ group_variable hdl "hdlin_enable_elaborate_update" +#@ group_variable hdl "hdlin_autoread_verilog_extensions" +#@ group_variable hdl "hdlin_autoread_sverilog_extensions" +#@ group_variable hdl "hdlin_autoread_vhdl_extensions" +#@ group_variable hdl "hdlin_autoread_exclude_extensions" +#@ group_variable hdl "hdlin_enable_upf_compatible_naming" +#@ group_variable hdl "hdlin_report_sequential_pruning" +#@ group_variable hdl "hdlin_analyze_verbose_mode" +#@ +#@ # "vhdlio" variables are variables pertaining to VHDL generation +#@ group_variable vhdlio "vhdllib_timing_mesg" +#@ group_variable vhdlio "vhdllib_timing_xgen" +#@ group_variable vhdlio "vhdllib_timing_checks" +#@ group_variable vhdlio "vhdllib_negative_constraint" +#@ group_variable vhdlio "vhdllib_pulse_handle" +#@ group_variable vhdlio "vhdllib_glitch_handle" +#@ group_variable vhdlio "vhdllib_architecture" +#@ group_variable vhdlio "vhdllib_tb_compare" +#@ group_variable vhdlio "vhdllib_tb_x_eq_dontcare" +#@ group_variable vhdlio "vhdllib_logic_system" +#@ group_variable vhdlio "vhdllib_logical_name" +#@ +#@ # group_variable vhdlio "vhdlout_architecture_name" +#@ group_variable vhdlio "vhdlout_bit_type" +#@ # group_variable vhdlio "vhdlout_bit_type_resolved" +#@ group_variable vhdlio "vhdlout_bit_vector_type" +#@ # group_variable vhdlio "vhdlout_conversion_functions" +#@ # group_variable vhdlio "vhdlout_dont_write_types" +#@ group_variable vhdlio "vhdlout_equations" +#@ group_variable vhdlio "vhdlout_one_name" +#@ group_variable vhdlio "vhdlout_package_naming_style" +#@ group_variable vhdlio "vhdlout_preserve_hierarchical_types" +#@ group_variable vhdlio "vhdlout_separate_scan_in" +#@ group_variable vhdlio "vhdlout_single_bit" +#@ group_variable vhdlio "vhdlout_target_simulator" +#@ group_variable vhdlio "vhdlout_top_configuration_arch_name" +#@ group_variable vhdlio "vhdlout_top_configuration_entity_name" +#@ group_variable vhdlio "vhdlout_top_configuration_name" +#@ group_variable vhdlio "vhdlout_three_state_name" +#@ group_variable vhdlio "vhdlout_three_state_res_func" +#@ # group_variable vhdlio "vhdlout_time_scale" +#@ group_variable vhdlio "vhdlout_unknown_name" +#@ group_variable vhdlio "vhdlout_use_packages" +#@ group_variable vhdlio "vhdlout_wired_and_res_func" +#@ group_variable vhdlio "vhdlout_wired_or_res_func" +#@ group_variable vhdlio "vhdlout_write_architecture" +#@ group_variable vhdlio "vhdlout_write_entity" +#@ group_variable vhdlio "vhdlout_write_top_configuration" +#@ # group_variable vhdlio "vhdlout_synthesis_off" +#@ group_variable vhdlio "vhdlout_write_components" +#@ group_variable vhdlio "vhdlout_zero_name" +#@ # group_variable vhdlio "vhdlout_levelize" +#@ group_variable vhdlio "vhdlout_dont_create_dummy_nets" +#@ group_variable vhdlio "vhdlout_follow_vector_direction" +#@ +#@ # "suffix" variables are used to find the suffixes of different file types +#@ group_variable suffix "view_execute_script_suffix" +#@ group_variable suffix "view_read_file_suffix" +#@ group_variable suffix "view_analyze_file_suffix" +#@ group_variable suffix "view_write_file_suffix" +#@ +#@ # Meenakshi: Added new group scc (for SystemC compiler) +#@ group_variable scc {systemcout_levelize} +#@ group_variable scc {systemcout_debug_mode} +#@ +#@ # "power" variables are for power-analysis. +#@ group_variable power {power_keep_license_after_power_commands} +#@ group_variable power {power_preserve_rtl_hier_names} +#@ group_variable power {power_do_not_size_icg_cells} +#@ group_variable power {power_hdlc_do_not_split_cg_cells} +#@ group_variable power {power_rtl_saif_file} +#@ group_variable power {power_sdpd_saif_file} +#@ group_variable power {power_cg_flatten} +#@ group_variable power {power_opto_extra_high_dynamic_power_effort} +#@ group_variable power {power_default_static_probability} +#@ group_variable power {power_default_toggle_rate} +#@ group_variable power {power_default_toggle_rate_type} +#@ group_variable power {power_model_preference} +#@ group_variable power {power_sa_propagation_effort} +#@ group_variable power {power_sa_propagation_verbose} +#@ group_variable power {power_fix_sdpd_annotation} +#@ group_variable power {power_fix_sdpd_annotation_verbose} +#@ group_variable power {power_sdpd_message_tolerance} +#@ group_variable power {power_rclock_use_asynch_inputs} +#@ group_variable power {power_rclock_inputs_use_clocks_fanout} +#@ group_variable power {power_rclock_unrelated_use_fastest} +#@ group_variable power {power_lib2saif_rise_fall_pd} +#@ group_variable power {power_min_internal_power_threshold} +#@ group_variable power {power_cg_module_naming_style} +#@ group_variable power {power_cg_cell_naming_style} +#@ group_variable power {power_cg_gated_clock_net_naming_style} +#@ group_variable power {do_operand_isolation} +#@ +#@ # dpcm variables are used by DPCM lib and controllong DC when using DPCM +#@ +#@ if { [info exists dpcm_debuglevel] } { +#@ group_variable dpcm "dpcm_debuglevel" +#@ group_variable dpcm "dpcm_rulespath" +#@ group_variable dpcm "dpcm_rulepath" +#@ group_variable dpcm "dpcm_tablepath" +#@ group_variable dpcm "dpcm_libraries" +#@ group_variable dpcm "dpcm_version" +#@ group_variable dpcm "dpcm_level" +#@ group_variable dpcm "dpcm_temperaturescope" +#@ group_variable dpcm "dpcm_voltagescope" +#@ group_variable dpcm "dpcm_functionscope" +#@ group_variable dpcm "dpcm_wireloadscope" +#@ group_variable dpcm "dpcm_slewlimit" +#@ group_variable dpcm "dpcm_arc_sense_mapping" +#@ +#@ } +#@ +#@ set dpcm_slewlimit "TRUE" +#@ +#@ # executable to fire off RTLA/BCV +#@ group_variable hdl {xterm_executable} +#@ +#@ # Variable group for Chip Compiler +#@ if {[info exists acs_work_dir]} { +#@ group_variable acs acs_area_report_suffix +#@ group_variable acs acs_autopart_max_area +#@ group_variable acs acs_autopart_max_percent +#@ group_variable acs acs_budgeted_cstr_suffix +#@ group_variable acs acs_compile_script_suffix +#@ group_variable acs acs_constraint_file_suffix +#@ group_variable acs acs_cstr_report_suffix +#@ group_variable acs acs_db_suffix +#@ group_variable acs acs_dc_exec +#@ group_variable acs acs_default_pass_name +#@ group_variable acs acs_exclude_extensions +#@ group_variable acs acs_exclude_list +#@ group_variable acs acs_global_user_compile_strategy_script +#@ group_variable acs acs_hdl_verilog_define_list +#@ group_variable acs acs_hdl_source +#@ group_variable acs acs_lic_wait +#@ group_variable acs acs_log_file_suffix +#@ group_variable acs acs_make_args +#@ group_variable acs acs_make_exec +#@ group_variable acs acs_makefile_name +#@ group_variable acs acs_num_parallel_jobs +#@ group_variable acs acs_override_report_suffix +#@ group_variable acs acs_override_script_suffix +#@ group_variable acs acs_qor_report_suffix +#@ group_variable acs acs_timing_report_suffix +#@ group_variable acs acs_use_autopartition +#@ group_variable acs acs_use_default_delays +#@ group_variable acs acs_user_budgeting_script +#@ group_variable acs acs_user_compile_strategy_script_suffix +#@ group_variable acs acs_verilog_extensions +#@ group_variable acs acs_vhdl_extensions +#@ group_variable acs acs_work_dir +#@ group_variable acs check_error_list +#@ group_variable acs ilm_preserve_core_constraints +#@ +#@ } +#@ +#@ # +#@ # DesignTime Variable Group timing +#@ # +#@ +#@ group_variable timing case_analysis_log_file +#@ group_variable timing case_analysis_sequential_propagate +#@ group_variable timing case_analysis_with_logic_constants +#@ group_variable timing create_clock_no_input_delay +#@ group_variable timing disable_auto_time_borrow +#@ group_variable timing disable_case_analysis +#@ group_variable timing disable_conditional_mode_analysis +#@ group_variable timing disable_library_transition_degradation +#@ group_variable timing dont_bind_unused_pins_to_logic_constant +#@ group_variable timing enable_slew_degradation +#@ group_variable timing high_fanout_net_pin_capacitance +#@ group_variable timing high_fanout_net_threshold +#@ group_variable timing lib_thresholds_per_lib +#@ group_variable timing rc_adjust_rd_when_less_than_rnet +#@ group_variable timing rc_ceff_delay_min_diff_ps +#@ group_variable timing rc_degrade_min_slew_when_rd_less_than_rnet +#@ group_variable timing rc_driver_model_max_error_pct +#@ group_variable timing rc_filter_rd_less_than_rnet +#@ group_variable timing rc_input_threshold_pct_fall +#@ group_variable timing rc_input_threshold_pct_rise +#@ group_variable timing rc_output_threshold_pct_fall +#@ group_variable timing rc_output_threshold_pct_rise +#@ group_variable timing rc_rd_less_than_rnet_threshold +#@ group_variable timing rc_slew_derate_from_library +#@ group_variable timing rc_slew_lower_threshold_pct_fall +#@ group_variable timing rc_slew_lower_threshold_pct_rise +#@ group_variable timing rc_slew_upper_threshold_pct_fall +#@ group_variable timing rc_slew_upper_threshold_pct_rise +#@ group_variable timing timing_disable_cond_default_arcs +#@ # group_variable timing timing_enable_multiple_clocks_per_reg +#@ group_variable timing timing_report_attributes +#@ group_variable timing timing_self_loops_no_skew +#@ group_variable timing when_analysis_permitted +#@ group_variable timing when_analysis_without_case_analysis +#@ +#@ } ;# $synopsys_program_name != "ptxr" +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ # +#@ # IC Compile Variable Group: +#@ # +#@ # These variables affect the designs created by the route_opt command. +#@ # +#@ group_variable routeopt routeopt_checkpoint +#@ group_variable routeopt routeopt_disable_cpulimit +#@ } +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ # +#@ # IC Compiler Variable Group: MCMM +#@ # +#@ # These variables affect Multi-Corner/Multi-Mode. Currently, MCMM is +#@ # only supported in ICC--hence the "icc_shell" qualification, above +#@ # +#@ group_variable MCMM mcmm_enable_high_capacity_flow +#@ } +#@ +#@ # Aliases for backwards compatibility or other reasons +#@ group_variable compile {compile_log_format} +#@ alias view_cursor_number x11_set_cursor_number +#@ alias set_internal_load set_load +#@ alias set_internal_arrival set_arrival +#@ alias set_connect_delay "set_annotated_delay -net" +#@ alias create_test_vectors create_test_patterns +#@ alias compile_test insert_test +#@ alias check_clocks check_timing +#@ alias lint check_design +#@ # gen removed; alias gen create_schematic +#@ alias free remove_design +#@ alias group_bus create_bus +#@ alias ungroup_bus remove_bus +#@ alias groupvar group_variable +#@ alias report_constraints report_constraint +#@ alias report_attributes report_attribute +#@ alias fsm_reduce reduce_fsm +#@ alias fsm_minimize minimize_fsm +#@ alias disable_timing set_disable_timing +#@ alias dont_touch set_dont_touch +#@ alias dont_touch_network set_dont_touch_network +#@ alias dont_use set_dont_use +#@ alias fix_hold set_fix_hold +#@ alias prefer set_prefer +#@ alias remove_package "echo remove_package command is obsolete: packages are stored on disk not in-memory:" +#@ alias analyze_scan preview_scan +#@ alias get_clock get_clocks +#@ alias dc_shell_is_in_incr_mode shell_is_in_xg_mode +#@ alias set_vh_module_options set_dps_module_options +#@ alias set_vh_physopt_options set_dps_options +#@ alias update_vh_design update_dps_design +#@ alias vh_start dps_start +#@ alias vh_end dps_end +#@ alias all_vh_modules all_dps_modules +#@ alias all_designs_of_vh all_designs_of_dps +#@ alias vh_use_auto_partitioning dps_auto_partitioning +#@ alias vh_write_changes dps_write_changes +#@ alias vh_read_changes dps_read_changes +#@ alias vh_write_module_clock dps_write_module_clock +#@ alias get_lib get_libs +#@ +#@ # Enable unsupported psyn commands +#@ if { $synopsys_program_name == "psyn_shell" || $synopsys_program_name == "icc_shell"} { +#@ proc enable_unsupported_commands { { arg "default" } } { +#@ global cgpi_use_new_wire_factors +#@ global cgpi_use_relative_wire_factors +#@ global cgpi_use_new_path_factors +#@ global pwlm_use_new_wire_factors +#@ global pwlm_use_relative_wire_factors +#@ global pwlm_use_new_path_factors +#@ global psyn_unsupported_commands_dir +#@ global synopsys_root +#@ if {![info exists psyn_unsupported_commands_dir]} { +#@ set psyn_unsupported_commands_dir $synopsys_root/auxx/syn/psyn/unsupported_commands +#@ } +#@ set psyn_unsupported_commands_option1 $arg +#@ if {[file readable $psyn_unsupported_commands_dir/setup.tcl]} { +#@ source $psyn_unsupported_commands_dir/setup.tcl +#@ } else { +#@ source -encrypted $psyn_unsupported_commands_dir/setup.tcl.e +#@ } +#@ } +#@ } +#@ # For Intel +#@ if { $synopsys_program_name == "icc_shell"} { +#@ set psyn_unsupported_commands_dir $synopsys_root/auxx/syn/psyn/unsupported_commands +#@ source -encrypted $psyn_unsupported_commands_dir/max_dist.tcl.e +#@ } +#@ +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ # to enable CLE readline-ish terminal by default for ICC +#@ set sh_enable_line_editing true +#@ +#@ # Astro forms create an enormous number of new variables which are +#@ # very annoying for users to see, so the default of this variable +#@ # for ICC is false +#@ set sh_new_variable_message false +#@ } +#@ +#@ if { $synopsys_program_name == "icc_shell" || (($synopsys_program_name == "dc_shell") && ([shell_is_in_topographical_mode])) } { +#@ source $synopsys_root/auxx/syn/psyn/verify_ilm.tcl +#@ } +#@ +#@ # Enable vh psyn commands +#@ if { $synopsys_program_name == "psyn_shell" } { +#@ proc enable_vh_flow { } { +#@ global VH_SCRIPT_FILE +#@ global synopsys_root +#@ global suppress_errors +#@ set suppress_errors "$suppress_errors CMD-041 UID-95 SEL-003 SEL-005" +#@ if {![info exists VH_SCRIPT_FILE]} { +#@ set VH_SCRIPT_FILE $synopsys_root/auxx/syn/psyn/vh_pc.tcl.e +#@ } +#@ if {[file readable $VH_SCRIPT_FILE]} { +#@ if {[string match *.tcl $VH_SCRIPT_FILE]} { +#@ source $VH_SCRIPT_FILE +#@ } else { +#@ source -encrypted $VH_SCRIPT_FILE +#@ } +#@ } else { +#@ puts "Error: VH script file $VH_SCRIPT_FILE not found." +#@ } +#@ } +#@ } +#@ +#@ +#@ #Turn on enable_netl_view to true by default. +#@ set enable_netl_view "TRUE" +#@ +#@ +#@ #Turn on physopt_bypass_multiple_plib_check by default +#@ if { $synopsys_program_name == "psyn_shell" } { +#@ set physopt_bypass_multiple_plib_check TRUE +#@ } +#@ +#@ # The ls command is gone, now it is just an alias for dc_shell eqn mode +#@ +#@ if { [string compare $dc_shell_mode "default"] == 0 } { +#@ if { ( $sh_arch == {mips}) && ( ( $synopsys_program_name == {design_analyzer}) || ( $isatty == 0)) } { +#@ alias ls "sh ls -a " +#@ } else { +#@ if { ( $sh_arch == {mips}) || ( $sh_arch == {necmips}) } { +#@ alias ls "sh ls -aC " +#@ } else { +#@ alias ls "sh ls -aC " +#@ } +#@ } +#@ } +#@ +#@ # Aliases for RouteCompiler +#@ alias run_rodeo_router route66 +#@ +#@ # Removing route_global from the code. Earlier it was hidden. --Mukesh +#@ #proc route_global {} { +#@ # global route_global_keep_tmp_data +#@ # global rt66_dont_lock_dir +#@ # +#@ # set rt66_dont_lock_dir TRUE +#@ # +#@ # for { set i 0} {1==1} {incr i} { +#@ # set wdir [file join [pwd] ".route_global.$i"] +#@ # if {[file exist $wdir] == 0} { +#@ # break; +#@ # } +#@ # } +#@ # +#@ # set_routing_options -cut_out_covered_port CORE_ONLY +#@ # set_routing_options -internal_routing FALSE +#@ # set_routing_options -stick_routing FALSE +#@ # +#@ # ###puts "wdir = $wdir" +#@ # +#@ # set success [route66 -global -dontstop -dir $wdir] +#@ # +#@ # #clean tmp data if required: +#@ # if { $success == 1 } { +#@ # if [catch {string toupper $route_global_keep_tmp_data} result] { +#@ # #variable is not defined +#@ # ###puts "result_1 = $result => removing dir ..." +#@ # catch { file delete -force $wdir } +#@ # } else { +#@ # #variable is set to FALSE +#@ # if { [string compare $result "TRUE"] != 0} { +#@ # ###puts "result_2 = $result => removing dir ..." +#@ # catch { file delete -force $wdir } +#@ # } +#@ # } +#@ # } +#@ # +#@ # set rt66_dont_lock_dir FALSE +#@ # return 1 +#@ #} +#@ #define_proc_attributes route_global -hidden +#@ +#@ #/* Aliases added for report command */ +#@ alias report_clock_constraint "report_timing -path end -to all_registers(-data_pins)" +#@ alias report_clock_fanout "report_transitive_fanout -clock_tree" +#@ alias report_clocks report_clock +#@ alias report_synthetic report_cell +#@ +#@ # Alias added for Ultra backward compatibility mode +#@ alias set_ultra_mode set_ultra_optimization +#@ +#@ # alias for write_sge and menu item in DA for db2sge +#@ +#@ #if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ # set db2sge_script ${synopsys_root}/admin/setup/.dc_write_sge.tcl +#@ #} else { +#@ # set db2sge_script ${synopsys_root}/admin/setup/.dc_write_sge +#@ #} +#@ +#@ #set db2sge_command ${synopsys_root}/${sh_arch}/syn/bin/db2sge +#@ set view_script_submenu_items "\"DA to SGE Transfer\" write_sge" +#@ +#@ +#@ if { $synopsys_program_name != "lc_shell"} { +#@ # read schematic annotation setup file +#@ #source ${synopsys_root}/admin/setup/.dc_annotate +#@ +#@ # setup the default layer settings +#@ #source ${synopsys_root}/admin/setup/.dc_layers +#@ +#@ if {$synopsys_program_name != "dc_sms_shell"} { +#@ source ${synopsys_root}/admin/setup/.dc_name_rules +#@ } +#@ } else { +#@ #for read_lib -html +#@ source ${synopsys_root}/auxx/syn/lc/read_lib_html_msg_list.tcl +#@ } +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/admin/setup/.dc_name_rules + +#@ # +#@ +#@ # .dc_name_rules Initialization file for +#@ +#@ # Dc_Shell and Design_Analyzer +#@ +#@ # This files defines name rules for target systems. Change_names +#@ # will use this rules to fix the object names. +#@ +#@ #*/ +#@ +#@ +#@ define_name_rules sverilog -type net -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules sverilog -type port -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules sverilog -type cell -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ define_name_rules sverilog -reserved { "always" "always_comb" "always_ff" "always_latch" "and" "assert" "assert_strobe" "assign" "automatic" "begin" "bit" "break" "buf" "bufif0" "bufif1" "byte" "case" "casex" "casez" "cell" "changed" "char" "cmos" "config" "const" "continue" "deassign" "default" "defparam" "design" "disable" "do" "edge" "else" "end" "endcase" "endconfig" "endfunction" "endgenerate" "endinterface" "endmodule" "endprimitive" "endspecify" "endtable" "endtask" "endtransition" "enum" "event" "export" "extern" "for" "force" "forever" "fork" "forkjoin" "function" "generate" "genvar" "highz0" "highz1" "if" "iff" "ifnone" "import" "incdir" "include" "initial" "inout" "input" "instance" "int" "integer" "interface" "join" "large" "liblist" "library" "localparam" "logic" "longint" "longreal" "macromodule" "medium" "modport" "module" "nand" "negedge" "nmos" "nor" "noshowcancelled" "not" "notif0" "notif1" "or" "output" "packed" "parameter" "pmos" "posedge" "primitive" "process" "priority" "pull0" "pull1" "pullup" "pulldown" "pulsestyle_onevent" "pulsestyle_ondetect" "rcmos" "real" "realtime" "reg" "release" "repeat" "return" "rnmos" "rpmos" "rtran" "rtranif0" "rtranif1" "scalared" "shortint" "shortreal" "showcancelled" "signed" "small" "specify" "specparam" "static" "strong0" "strong1" "struct" "supply0" "supply1" "table" "task" "time" "timeprecision" "timeunit" "tran" "tranif0" "tranif1" "transition" "tri" "tri0" "tri1" "triand" "trior" "trireg" "type" "typedef" "union" "unique" "use" "unsigned" "vectored" "void" "wait" "wand" "weak0" "weak1" "while" "wire" "wor" "xor" "xnor" } -special verilog -target_bus_naming_style {%s[%d]} -flatten_multi_dimension_busses -check_internal_net_name -check_bus_indexing +#@ +#@ define_name_rules verilog -type net -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules verilog -type port -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules verilog -type cell -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ define_name_rules verilog -reserved { "always" "and" "assign" "automatic" "begin" "buf" "bufif0" "bufif1" "case" "casex" "casez" "cell" "cmos" "config" "deassign" "default" "defparam" "design" "disable" "edge" "else" "end" "endcase" "endconfig" "endfunction" "endgenerate" "endmodule" "endprimitive" "endspecify" "endtable" "endtask" "event" "for" "force" "forever" "fork" "function" "generate" "genvar" "highz0" "highz1" "if" "ifnone" "incdir" "include" "initial" "inout" "input" "instance" "integer" "join" "large" "liblist" "library" "localparam" "macromodule" "medium" "module" "nand" "negedge" "nmos" "nor" "noshowcancelled" "not" "notif0" "notif1" "or" "output" "parameter" "pmos" "posedge" "primitive" "pull0" "pull1" "pullup" "pulldown" "pulsestyle_onevent" "pulsestyle_ondetect" "rcmos" "real" "realtime" "reg" "release" "repeat" "rnmos" "rpmos" "rtran" "rtranif0" "rtranif1" "scalared" "showcancelled" "signed" "small" "specify" "specparam" "strong0" "strong1" "supply0" "supply1" "table" "task" "time" "tran" "tranif0" "tranif1" "tri" "tri0" "tri1" "triand" "trior" "trireg" "unsigned" "use" "vectored" "wait" "wand" "weak0" "weak1" "while" "wire" "wor" "xor" "xnor" } -special verilog -target_bus_naming_style {%s[%d]} -flatten_multi_dimension_busses -check_internal_net_name -check_bus_indexing +#@ +#@ define_name_rules verilog_1995 -type net -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules verilog_1995 -type port -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ +#@ define_name_rules verilog_1995 -type cell -allow "a-z A-Z 0-9 _ " -first_restrict "_ 0-9" +#@ define_name_rules verilog_1995 -reserved { "always" "and" "assign" "begin" "buf" "bufif0" "bufif1" "case" "casex" "casez" "cell" "cmos" "deassign" "default" "defparam" "design" "disable" "edge" "else" "end" "endcase" "endfunction" "endmodule" "endprimitive" "endspecify" "endtable" "endtask" "event" "for" "force" "forever" "fork" "function" "highz0" "highz1" "if" "ifnone" "initial" "inout" "input" "integer" "join" "large" "macromodule" "medium" "module" "nand" "negedge" "nmos" "nor" "notif0" "notif1" "or" "output" "parameter" "pmos" "posedge" "primitive" "pull0" "pull1" "pullup" "pulldown" "rcmos" "real" "realtime" "reg" "release" "repeat" "rnmos" "rpmos" "rtran" "rtranif0" "rtranif1" "scalared" "small" "specify" "specparam" "strong0" "strong1" "supply0" "supply1" "table" "task" "time" "tran" "tranif0" "tranif1" "tri" "tri0" "tri1" "triand" "trior" "trireg" "vectored" "wait" "wand" "weak0" "weak1" "while" "wire" "wor" "xor" "xnor" } -special verilog -target_bus_naming_style {%s[%d]} -flatten_multi_dimension_busses -check_internal_net_name -check_bus_indexing +#@ +#@ +#@ ####/* Name rule for VHDL */ +#@ +#@ ####/* Name rule for VHDL */ +#@ +#@ ####/* Name rule for VHDL */ +#@ +#@ define_name_rules vhdl -reserved_words { "abs" "access" "after" "alias" "all" "and" "architecture" "array" "assert" "attribute" \ +#@ "begin" "block" "body" "buffer" "bus" "case" "component" "configuration" "constant" "disconnect" "downto" "else" "elsif" "end" "entity" "exit" "file" "for" "function" "generate" "generic" "group" "guarded" "if" "impure" "in" "inertial" "inout" "is" "label" "library" "linkage" "literal" "loop" "map" "mod" "nand" "new" "next" "nor" "not" "null" "of" "on" "open" "or" "others" "out" "package" "port" "postponed" "procedure" "process" "pure" "range" "record" "register" "reject" "rem" "report" "return" "rol" "ror" "select" "severity" "signal" "shared" "sla" "sll" "sra" "srl" "subtype" "then" "to" "transport" "type" "unaffected" "units" "until" "use" "variable" "wait" "when" "while" "with" "xnor" "xor"} -case_insensitive -target_bus_naming_style "%s(%d)" -replacement_char "x" -special vhdl +#@ define_name_rules vhdl -type net -allowed "A-Z a-z _ 0-9 " -first_restricted "0-9 _" -last_restricted "_" +#@ define_name_rules vhdl -type port -allowed "A-Z a-z _ 0-9 " -first_restricted "0-9 _" -last_restricted "_" +#@ define_name_rules vhdl -type cell -allowed "A-Z a-z _ 0-9" -first_restricted "0-9 _" -last_restricted "_" +#@ define_name_rules vhdl -map { {{"__","_"},{"_$",""}} } +#@ +#@ ####/* Name rule for VHDL */ +#@ # -- End source /EDA/Synopsys/syn/O-2018.06-SP1/admin/setup/.dc_name_rules + +#@ +#@ if { $synopsys_program_name == "psyn_gui"} { +#@ # read RouteCompiler GUI file for timing critical pathes. +#@ source ${synopsys_root}/auxx/syn/route_gui/write_route_timing_path.tcl +#@ } +#@ +#@ # Set physopt_dw_opto to false +#@ if { [string match -nocase {*icc_shell*} $synopsys_program_name] } { +#@ set physopt_dw_opto FALSE +#@ } +#@ +#@ #/* Read budgeting setup script */ +#@ +#@ if { [string compare $dc_shell_mode "default"] == 0 } { +#@ +#@ # Need a encrypted file in Tcl format for budget.setup.et +#@ if { $sh_arch != "msvc50" && $sh_arch != "alpha_nt" } { +#@ # source -e synopsys_root + "/admin/setup/budget.setup.et" +#@ } +#@ } +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ source $synopsys_root/auxx/syn/.icc_procs.tcl +#@ source -encrypted $synopsys_root/auxx/syn/cts/fast_atomic_cts.tcl.e +#@ } +#@ +#@ if { $synopsys_program_name == "icc_shell"} { +#@ alias report_scenario report_scenarios +#@ } +#@ +#@ # floorplanning preferences globals +#@ global fp_snap_type +#@ +#@ set fp_snap_type(port) wiretrack +#@ set fp_snap_type(cell) litho +#@ set fp_snap_type(pin) wiretrack +#@ set fp_snap_type(movebound) litho +#@ set fp_snap_type(port_shape) wiretrack +#@ set fp_snap_type(wiring_keepout) wiretrack +#@ set fp_snap_type(placement_keepout) litho +#@ set fp_snap_type(net_shape) wiretrack +#@ set fp_snap_type(route_shape) wiretrack +#@ set fp_snap_type(none) litho +#@ +#@ # STAR 9000615813. PWR-18 is no longer internally suppressed. +#@ # Instead call tcl suppress_message so that it can be unsuppressed by users in +#@ # command line if needed +#@ suppress_message PWR-18 +#@ +#@ # alias for write_sge is always the last line of the setup file +#@ #if { [string compare $dc_shell_mode "tcl"] == 0 } { +#@ # alias write_sge "source db2sge_script" +#@ #} else { +#@ # alias write_sge "include db2sge_script" +#@ #} +#@ +#@ if { $dc_shell_mode == "tcl" } { +#@ # Configure Execute script dialog to display .tcl files +#@ set view_execute_script_suffix "$view_execute_script_suffix .tcl" +#@ } +#@ +#@ # +#@ # Shirley Lu 5/15/2007 +#@ # +#@ # Invoke NCX validation/correlation/fomatter from lc_shell: +#@ # +#@ # UNIX shell: +#@ # setenv SYNOPSYS_NCX_ROOT /mydisk/ncx_2007.06 +#@ # +#@ +#@ if {[info exists env(SYNOPSYS_NCX_ROOT)]} { +#@ +#@ set ncx_path $env(SYNOPSYS_NCX_ROOT)/ncx/${sh_arch}/bin +#@ +#@ # +#@ # check_ccs_lib +#@ # use libchecker under $ncx_path defined above +#@ # Disable this command since 2010.12-SP3 (should be done in 2010.12 release) +#@ #proc check_ccs_lib {args} { +#@ # global ncx_path +#@ # set cmdStr [linsert $args 0 ${ncx_path}/libchecker -lc_shell] +#@ # set cmd [open "| $cmdStr 2>@ stdout"] +#@ # catch { +#@ # while {[gets $cmd info] >= 0} { +#@ # echo $info +#@ # } +#@ # } +#@ # if {[catch {close $cmd} msg]} { +#@ # } +#@ #} +#@ +#@ # +#@ # format_lib +#@ # use ncx under $ncx_path defined above +#@ # Disable format_lib command in 2014.09 release -- xwwang, 7/25/2014 +#@ #proc format_lib {args} { +#@ # global ncx_path +#@ # echo "Warning: format_lib command is scheduled to become obsolete in a future production release." +#@ # set cmdStr [linsert $args 0 ${ncx_path}/ncx -lc_shell] +#@ # set cmd [open "| $cmdStr 2>@ stdout"] +#@ # catch { +#@ # while {[gets $cmd info] >= 0} { +#@ # echo $info +#@ # } +#@ # } +#@ # if {[catch {close $cmd} msg]} { +#@ # } +#@ #} +#@ +#@ } +#@ +#@ proc valias {v_orig v_alias} { +#@ uplevel 1 "upvar 0 $v_orig $v_alias" +#@ } +#@ +#@ set lc_run_from_legacy_library_compiler "true" +#@ +#@ set lc_enable_legacy_library_compiler "false" +#@ +#@ valias lc_enable_legacy_library_compiler lc_enable_common_shell_lc +#@ +#@ if {[info exists ::env(SYNOPSYS_LC_ROOT)] && [file exists $::env(SYNOPSYS_LC_ROOT)/$::sh_arch/lc/bin/lc_shell_exec]} { +#@ # make lc man pages search path override the default man page search path +#@ set man_path [linsert $man_path 0 $::env(SYNOPSYS_LC_ROOT)/doc/lc/man] +#@ } else { +#@ set lc_link "$::synopsys_root/$::sh_arch/syn/bin/lc_shell_exec" +#@ while { [file exists $lc_link] && [file type $lc_link] == "link"} { +#@ set lc_link [file readlink $lc_link] +#@ } +#@ # resolve symbol-link to get $exec_path of lc_shell_exec +#@ if { [file exists $lc_link] } { +#@ set LC_ROOT [file dirname [file dirname [file dirname [file dirname $lc_link]]]] +#@ set man_path [linsert $man_path 0 $LC_ROOT/doc/lc/man] +#@ } +#@ } +#@ +#@ source ${synopsys_root}/auxx/syn/lc_commands.tbc +#@ # -- Starting source /EDA/Synopsys/syn/O-2018.06-SP1/auxx/syn/lc_commands.tbc + +#@ ############################################################################## +#@ # Author : Liping Zhao +#@ # History: 2016/11/21 created +#@ # Description: This is the source tcl file of run_nglc.tbc. +#@ # The procs are all for run library compiler under the hood. +#@ # These procs are exracted from .synopsys_dc.setup +#@ ############################################################################## +#@ # TclPro::Compiler::Include +#@ +#@ if {[catch {package require tbcload 1.6} err] == 1} { +#@ return -code error "[info script]: The TclPro ByteCode Loader is not available or does not support the correct version -- $err" +#@ } +#@ tbcload::bceval { +#@ TclPro ByteCode 2 0 1.7 8.5 +#@ 44 0 426 61 0 0 312 0 12 44 44 -1 -1 +#@ 426 +#@ `:G,f=!CM1qv2&|=!A8#>!*BEKs!6#o9v.EW< +#@ !E;kpvJSapvQXxOwI1IOwI1IOwI1IOwI1IOwI1IOwI1IOwI1IOw +#@ 44 +#@ I%%n#;c(;v0g>a'?qwn#I%%n#I%%n#I%%n#I%%n#I%%n#I%%n#Hq^R# +#@ 61 +#@ x +#@ 4 +#@ ,CHr@ +#@ x +#@ 23 +#@ lj|Z?!aiaEw>m#H8&Z)F5mNaEt-E- +#@ x +#@ 1 +#@ A! +#@ p +#@ 5 0 29 3 0 0 20 0 9 5 5 -1 -1 +#@ 29 +#@ w0EpvQks6#;>fv!E*<!8^w!!a9)!!&E&s +#@ !18:3w4Ki!8^w!!KJv!!&E&s!1rA=!;Yq9-C^w +#@ !!+?!!!1;l!,A^w!!+?!!!fqlwv5v!!!D!!!!gF#!!&E&s!:8B=!4,tl#,eN48;I%!!'BWMe`BJ>'0.#3WW!0#>6#3# +#@ Ts!TG;I/m&3,!/uJv!#0EMe`BLP|f.#3WW!0#>6#82Ts!TG;I/o,3,!1,|v!#0EMe`BJ +#@ >'0.#3WW!0#>6#:8Ts!TG;I/m&3,!/uJv!#0E!^KnMe`BJ>'0.#3WW!0#>6#<>Ts!TG;I/m&3,!/uJv!#0E!_KnMe`BJ>'0.#3 +#@ WW!0#>6#>DTs!TG;I/m&3,!/uJv!#0Em#HvdM +#@ e`BBKMT+#3WW!w0EMe`BBKMT+#3WW!w0EMe`BBKMT+#3WW!w0EMe`BBKMT+#3WW!w0Em#HvdKv +#@ x +#@ 3 +#@ g'i- +#@ 0 +#@ 0 +#@ 1 2 +#@ 1 +#@ ?v +#@ 0 0 256 +#@ 3 +#@ g'i- +#@ 1 0 0 +#@ x +#@ 13 +#@ qd,r@dIa:@e-%lB.v +#@ x +#@ 6 +#@ 'E%6B_-v +#@ p +#@ 1 0 7 1 0 0 4 0 2 1 1 -1 -1 +#@ 7 +#@ ,|&v!)'!! +#@ 1 +#@ z +#@ 1 +#@ '! +#@ 1 +#@ x +#@ 21 +#@ w3F/D'gi'FrZ!iCdIa:@e-%lB.v +#@ 0 +#@ 0 +#@ 1 1 +#@ 4 +#@ %N|(F +#@ 0 0 256 +#@ x +#@ 21 +#@ w3F/D'gi'FrZ!iCdIa:@e-%lB.v +#@ x +#@ 5 +#@ %N|(FA! +#@ p +#@ 10 0 92 13 0 0 40 0 5 10 10 -1 -1 +#@ 92 +#@ )NrUNw,?WcEh7|7An1g+ +#@ x +#@ 5 +#@ )lP)F1v +#@ x +#@ 19 +#@ ,v(Z?!aiaEmo3mBm+BRAyOl, +#@ x +#@ 21 +#@ w3F/D'gi'FrZ!iCdIa:@VhrU@?v +#@ x +#@ 18 +#@ #k|Z?(FuSAhaBq@c^CkBHSw +#@ 0 +#@ 0 +#@ 1 3 +#@ 4 +#@ %N|(F +#@ 0 0 256 +#@ 8 +#@ o4jY?m'cSA +#@ 1 0 0 +#@ 4 +#@ g3IID +#@ 2 0 0 +#@ x +#@ 14 +#@ #k|Z?r0H8Aw9fwGJ%% +#@ p +#@ 7 0 70 13 0 0 28 0 6 7 7 -1 -1 +#@ 70 +#@ )Nre`B;a9?)v*<N%Je|v +#@ 13 +#@ x +#@ 3 +#@ _e|+ +#@ x +#@ 15 +#@ kaT5BgxUgCr6m*E_I-, +#@ x +#@ 6 +#@ sT2TAIPw +#@ x +#@ 8 +#@ m'cSANjkSA +#@ x +#@ 1 +#@ +v +#@ x +#@ 5 +#@ n0Hr@7v +#@ x +#@ 12 +#@ #graEv_Bq@,0B(F +#@ x +#@ 4 +#@ m'cSA +#@ x +#@ 6 +#@ gpbSAPSw +#@ x +#@ 6 +#@ AP5cE?Sw +#@ x +#@ 18 +#@ kaT5Bmv +#@ 0 +#@ 0 +#@ 0 1 +#@ 8 +#@ m'cSANjkSA +#@ 0 0 0 +#@ x +#@ 14 +#@ 4rBfD1-0CFq&fwGJ%% +#@ x +#@ 10 +#@ (KxhCN1-.DQ-v +#@ p +#@ 17 0 213 23 2 1 88 2 10 17 21 -1 -1 +#@ 213 +#@ w0E!8^w!!2V'!!*i=6#4;tl#=MGY!g@#!!ee6(!H,FN-gE +#@ EfR8SUNw

    :v8P60%.EW - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/login1.jpg b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/login1.jpg deleted file mode 100644 index e9faa80895abbf60d56eb871bd1e8a2b49d4a1e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25789 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 Vw=tPSLox1l`AKeZ%~vTW|JfiVbr}Ev diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/modem.png b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/modem.png deleted file mode 100644 index be5a2eb2fc48a8f16681b591f4ef74888ee09c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1633 zcmV-n2A=teP)DSXo(n z6%-WGq@<)6*xA{^2Ei8OFVPRn@pc;RG z0K(}2kU_v;uacIQE|igxVPIil0lOU8LJ$V2gBcFvgF+DKL$KN}U%tQ{3j&`%e`fgj z@gvL=d;kH2(*Zz33V;^3sH&=hEe8c1aykKFkQgk@fP4zVAcH}^2L(OIK_D>@4RRES ze)sMj*gUAC{s9CKRtErm69G(cJz`>Fj2}LHfCnwe5SVX(p#$bKGczNn7qEqVe0*Tb zKx$wP1gU%b_AT5|K=waih<*VGAQtps2Pz2H)YP1#tEdz1LA-G{v90jAo(|M-Y{Iec=5@nPoJ&=1Q2>IaFvsjn`>!l$t@@-2(}dD z0GK0?EkXud!iJNWd(GMH9%!pb!uh6=itz=n=!YbLZ{?6XRZ>k+%Q> zhy`Q`&;nIpmRY8(tSkWx7KUffo-s&DO2QK#$WmB3Ko0?!SPXU#m1Z4_<00M=8Jg|USYhq#|2XZmU!j~^!g0l-ZH#ay%!+e4s0^qV7 zCl zzk}l%xnx6*cces$;#;tKkUTJDgZV%`;9LP^gB$_!J;-ce!utdC{SlxvDE_~K)Byw# z3oyP-K}9Sx5VA6|Gca)cV_^9Y%36#J|Cs)QM1f48BN)Nn1tk_xApwc!e}BRC+4mpc z86F%z4whpB71y9L1E@wA=qY;#2Zjsh&of-Ue3{|QnKSo*QNADMdk_E!AQqr6xn4eh z#qi+MGlt6_&NBGR1u$ z0{{Yu<Cx%1A~kt11BpmeSi!CrWZyY9!TmJ7G?m2;TK>OdVJl%92G$?!48NGZF}SmPF>w9nW%&C26N4Xf z00ZYQUWPA1Um5-f1~UBq_k)2IR52MCGQ4~95>y1jif%}W2lO#BFiL>+E&~^z05CCs zVmN;M_>U(~p6rME{s*!H00M|*&z?PPz=SkSTvS{D7-$Skj7;G4z`*hXOoI&m$Mlkc znS+yo>HT}K&zO058JK{<%mPXaz!VNj<)Add07`g3`se1&48M$w7?`+u!SR3g?Afcp z#0yIKkI;*KfB*tHn;DoBY=PJr$mRzc!~(>uKtn+^3nLRF3ou86#ef(n%*@Kf$jA&< z2T=p$g5`mpXJG*;`2Fr3Gnc3+Gb50H=l1Ql4<9~U4~&|{K=YrVI{+Yn7?GN0TtLhY zauAfygvLh4gw(;r{y;5$3@UKZ9RLtOj04>>0tlc1Z!hq!(QaR^6>_B54Jn1#~Jije3o~(=`7H5>`;cz1${9F%W##sAI~(r1scHM>FVdQ I&MBb@08~pNrT_o{ diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/pda.png b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/pda.png deleted file mode 100644 index 1458d9bfa4ef7d27c2434177c8d54294ba9f4028..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 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 A&;S4c diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/tablet.png b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/images/tablet.png deleted file mode 100644 index fa871f54035fcd0bb0f7f2068d2b2ed4e5e0e0cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 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 NumberSpinner - jQuery EasyUI Mobile Demo

    NumberSpinner
    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/input/textbox.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/input/textbox.html deleted file mode 100644 index a03bf1e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/input/textbox.html +++ /dev/null @@ -1 +0,0 @@ - TextBox - jQuery EasyUI Mobile Demo
    TextBox
    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/layout/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/layout/basic.html deleted file mode 100644 index 3f4c00d..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/layout/basic.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Basic Layout - jQuery EasyUI Mobile Demo - - - - - - - - -
    -
    -
    -
    Layout
    -
    - Back -
    -
    - Search -
    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/menu/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/menu/basic.html deleted file mode 100644 index 1697ede..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/menu/basic.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Basic Menu - jQuery EasyUI Mobile Demo - - - - - - - - -
    -
    -
    -
    Menu
    -
    - - -
    -
    -
    -
    -
    -
    Undo
    -
    Redo
    - -
    Cut
    -
    Copy
    -
    Paste
    - -
    Toolbar
    -
    Delete
    -
    Select All
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/menu/menubar.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/menu/menubar.html deleted file mode 100644 index 488963f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/menu/menubar.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Menubar - jQuery EasyUI Mobile Demo - - - - - - - - -
    -
    -
    -
    - Home - Edit - Help - About -
    -
    -
    -
    -
    -
    Undo
    -
    Redo
    - -
    Cut
    -
    Copy
    -
    Paste
    - -
    Toolbar
    -
    Delete
    -
    Select All
    -
    -
    -
    Help
    -
    Update
    -
    About
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/_content.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/_content.html deleted file mode 100644 index f7b8e2e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

    Here is the content loaded via AJAX.

    -
      -
    • easyui is a collection of user-interface plugin based on jQuery.
    • -
    • easyui provides essential functionality for building modern, interactive, javascript applications.
    • -
    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
    • -
    • complete framework for HTML5 web page.
    • -
    • easyui save your time and scales while developing your products.
    • -
    • easyui is very easy but powerful.
    • -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/ajax.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/ajax.html deleted file mode 100644 index e4b4f2d..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/ajax.html +++ /dev/null @@ -1 +0,0 @@ - Ajax Panel - jQuery EasyUI Mobile Demo
    Ajax Panel
    Panel Footer
    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/basic.html deleted file mode 100644 index 407a2f3..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic Panel - jQuery EasyUI Mobile Demo
    Panel Header
    Panel Footer
    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/nav.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/nav.html deleted file mode 100644 index 52ee902..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/panel/nav.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Navigation Panel - jQuery EasyUI Mobile Demo - - - - - - - - -
    -
    -
    -
    Navigation
    -
    -
    - -
    -
    -
    -
    -
    Panel2
    -
    - Back -
    -
    -
    -
    - Go Back -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/basic.html deleted file mode 100644 index 906d942..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/basic.html +++ /dev/null @@ -1 +0,0 @@ - Simple List - jQuery EasyUI Mobile Demo
    Simple List
    • Large
    • Spotted Adult Female
    • Venomless
    • Rattleless
    • Green Adult
    • Tailless
    • With tail
    • Adult Female
    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/button.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/button.html deleted file mode 100644 index f326ba9..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/button.html +++ /dev/null @@ -1 +0,0 @@ - Button on List - jQuery EasyUI Mobile Demo
    Button on List
    • HP Deskjet 1000 Printer
      Add
    • Epson WorkForce 845
      Add
    • Logitech Keyboard K120
      Add
    • Nikon COOLPIX L26 16.1 MP
      Add
    • SanDisk Sansa Clip Zip 4GB
      Add
    • BLUE MP3 Metal Mini Clip Player
      Add
    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/group.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/group.html deleted file mode 100644 index e64c2e4..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/group.html +++ /dev/null @@ -1 +0,0 @@ - Group List - jQuery EasyUI Mobile Demo
    Detail
    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/image.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/image.html deleted file mode 100644 index ddf79e5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/image.html +++ /dev/null @@ -1 +0,0 @@ - List with Image - jQuery EasyUI Mobile Demo
    List with Image
    • modem
      modulates an analog carrier signal to encode digital information.
    • scanner
      scans images, printed text, handwriting, or an object.
    • pda
      A personal digital assistant.
    • tablet
      one-piece mobile computer.
    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/link.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/link.html deleted file mode 100644 index c630576..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/simplelist/link.html +++ /dev/null @@ -1 +0,0 @@ - Link List - jQuery EasyUI Mobile Demo
    Detail
    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/basic.html deleted file mode 100644 index 4654e12..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic Tabs - jQuery EasyUI Mobile Demo

    Java is a general-purpose, concurrent, class-based, object-oriented computer programming language that is specifically designed to have as few implementation dependencies as possible.

    Java applications are typically compiled to bytecode (class file) that can run on any Java virtual machine (JVM) regardless of computer architecture.

    Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing. Originally developed by IBM at their campus in south San Jose, California[1] in the 1950s for scientific and engineering applications.

    Perl is a family of high-level, general-purpose, interpreted, dynamic programming languages. The languages in this family include Perl 5 and Perl 6.

    Though Perl is not officially an acronym, there are various backronyms in use, such as: Practical Extraction and Reporting Language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. Since then, it has undergone many changes and revisions.

    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/nav.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/nav.html deleted file mode 100644 index 061218f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/nav.html +++ /dev/null @@ -1 +0,0 @@ - Navigation Tabs - jQuery EasyUI Mobile Demo
    Devices

    Modem

    A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.


    Scanner

    In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.


    Pda

    A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.


    Pda

    A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/pill.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/pill.html deleted file mode 100644 index ead2863..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tabs/pill.html +++ /dev/null @@ -1 +0,0 @@ - Pill Tabs - jQuery EasyUI Mobile Demo

    Java is a general-purpose, concurrent, class-based, object-oriented computer programming language that is specifically designed to have as few implementation dependencies as possible.

    Java applications are typically compiled to bytecode (class file) that can run on any Java virtual machine (JVM) regardless of computer architecture.

    Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing. Originally developed by IBM at their campus in south San Jose, California[1] in the 1950s for scientific and engineering applications.

    Perl is a family of high-level, general-purpose, interpreted, dynamic programming languages. The languages in this family include Perl 5 and Perl 6.

    Though Perl is not officially an acronym, there are various backronyms in use, such as: Practical Extraction and Reporting Language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. Since then, it has undergone many changes and revisions.

    \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/basic.html deleted file mode 100644 index 34b7cd8..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/basic.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Basic Toolbar - jQuery EasyUI Mobile Demo - - - - - - - - -
    -
    -
    -
    Basic Toolbar
    -
    - Back -
    -
    - Next -
    -
    -
    -
      -
    • Large
    • -
    • Spotted Adult Female
    • -
    • Venomless
    • -
    • Rattleless
    • -
    • Green Adult
    • -
    • Tailless
    • -
    • With tail
    • -
    • Adult Female
    • -
    -
    -
    -
    -
    - Detail -
    - Back -
    -
    -
    -
    - Go Back -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/button.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/button.html deleted file mode 100644 index 14366a6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/button.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Toolbar Button - jQuery EasyUI Mobile Demo - - - - - - - - -
    -
    -
    -
    Toolbar Button
    -
    -
    - -
      -
    • Large
    • -
    • Spotted Adult Female
    • -
    • Venomless
    • -
    • Rattleless
    • -
    • Green Adult
    • -
    • Tailless
    • -
    • With tail
    • -
    • Adult Female
    • -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/menu.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/menu.html deleted file mode 100644 index 6bd5631..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/toolbar/menu.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - Menu on Toolbar - jQuery EasyUI Mobile Demo - - - - - - - - -
    -
    -
    -
    Menu on Toolbar
    -
    - -
    -
    - - -
    -
    -
    -
    -
    Undo
    -
    Redo
    - -
    Cut
    -
    Copy
    -
    Paste
    - -
    Toolbar
    -
    Delete
    -
    Select All
    -
    -
      -
    • Large
    • -
    • Spotted Adult Female
    • -
    • Venomless
    • -
    • Rattleless
    • -
    • Green Adult
    • -
    • Tailless
    • -
    • With tail
    • -
    • Adult Female
    • -
    -
    -
    -
    -
    - Detail -
    - Back -
    -
    -
    -
    - Go Back -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tree/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tree/basic.html deleted file mode 100644 index 7561c08..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tree/basic.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Basic Tree - jQuery EasyUI Mobile Demo - - - - - - - - -
    -
    -
    -
    Basic Tree
    -
    -
    -
      -
    • - My Documents -
        -
      • - Photos -
          -
        • - Friend -
        • -
        • - Wife -
        • -
        • - Company -
        • -
        -
      • -
      • - Program Files -
          -
        • Intel
        • -
        • Java
        • -
        • Microsoft Office
        • -
        • Games
        • -
        -
      • -
      • index.html
      • -
      • about.html
      • -
      • welcome.html
      • -
      -
    • -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tree/dnd.html b/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tree/dnd.html deleted file mode 100644 index 91f9860..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo-mobile/tree/dnd.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Drag Drop Tree Nodes - jQuery EasyUI Mobile Demo - - - - - - - - -
    -
    -
    -
    Drag Drop Tree Nodes
    -
    -
    -
      -
    • - My Documents -
        -
      • - Photos -
          -
        • - Friend -
        • -
        • - Wife -
        • -
        • - Company -
        • -
        -
      • -
      • - Program Files -
          -
        • Intel
        • -
        • Java
        • -
        • Microsoft Office
        • -
        • Games
        • -
        -
      • -
      • index.html
      • -
      • about.html
      • -
      • welcome.html
      • -
      -
    • -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/_content.html b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/_content.html deleted file mode 100644 index f7b8e2e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

    Here is the content loaded via AJAX.

    -
      -
    • easyui is a collection of user-interface plugin based on jQuery.
    • -
    • easyui provides essential functionality for building modern, interactive, javascript applications.
    • -
    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
    • -
    • complete framework for HTML5 web page.
    • -
    • easyui save your time and scales while developing your products.
    • -
    • easyui is very easy but powerful.
    • -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/actions.html b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/actions.html deleted file mode 100644 index 28935d7..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/actions.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - Accordion Actions - jQuery EasyUI Demo - - - - - - - -

    Accordion Actions

    -

    Click the buttons below to add or remove accordion items.

    -
    - Select - Add - Remove -
    -
    -
    -

    Accordion for jQuery

    -

    Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/ajax.html b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/ajax.html deleted file mode 100644 index 87c1a01..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/ajax.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Loading Accordion Content with AJAX - jQuery EasyUI Demo - - - - - - - -

    Loading Accordion Content with AJAX

    -

    Click AJAX panel header to load content via AJAX.

    -
    -
    -
    -

    Accordion for jQuery

    -

    Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

    -
    -
    -

    The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/basic.html deleted file mode 100644 index 37eba32..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/basic.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Basic Accordion - jQuery EasyUI Demo - - - - - - - -

    Basic Accordion

    -

    Click on panel header to show its content.

    -
    -
    -
    -

    Accordion for jQuery

    -

    Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

    -
    -
    -

    The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

    -
    -
    -
      -
    • - Foods -
        -
      • - Fruits -
          -
        • apple
        • -
        • orange
        • -
        -
      • -
      • - Vegetables -
          -
        • tomato
        • -
        • carrot
        • -
        • cabbage
        • -
        • potato
        • -
        • lettuce
        • -
        -
      • -
      -
    • -
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/datagrid_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/datagrid_data1.json deleted file mode 100644 index e9a5be2..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/datagrid_data1.json +++ /dev/null @@ -1,12 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, - {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} -]} diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/expandable.html b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/expandable.html deleted file mode 100644 index 74bc036..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/expandable.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Keep Expandable Panel in Accordion - jQuery EasyUI Demo - - - - - - - -

    Keep Expandable Panel in Accordion

    -

    Keep a expandable panel and prevent it from collapsing.

    -
    -
    -
    - -
    -
    -

    Accordion for jQuery

    -

    Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

    -
    -
    -

    Content1

    -
    -
    -

    Content2

    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/fluid.html deleted file mode 100644 index aaeb994..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/fluid.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Fluid Accordion - jQuery EasyUI Demo - - - - - - - -

    Fluid Accordion

    -

    This example shows how to set the width of accordion to a percentage of its parent container.

    -
    -
    -
    -

    width: 100%

    -
    -
    -
    -
    -
    - -
    -
    -

    width: 50%

    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/horizontal.html b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/horizontal.html deleted file mode 100644 index 23c795a..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/horizontal.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Horizontal Accordion - jQuery EasyUI Demo - - - - - - - -

    Horizontal Accordion

    -

    You can easily set the 'halign' property to create a horizontal accordion.

    -
    -
    -
    -

    Accordion for jQuery

    -

    Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

    -
    -
    -

    The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

    -
    -
    -
      -
    • - Foods -
        -
      • - Fruits -
          -
        • apple
        • -
        • orange
        • -
        -
      • -
      • - Vegetables -
          -
        • tomato
        • -
        • carrot
        • -
        • cabbage
        • -
        • potato
        • -
        • lettuce
        • -
        -
      • -
      -
    • -
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/multiple.html b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/multiple.html deleted file mode 100644 index 8477bc0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/multiple.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Multiple Accordion Panels - jQuery EasyUI Demo - - - - - - - -

    Multiple Accordion Panels

    -

    Enable 'multiple' mode to expand multiple panels at one time.

    -
    -
    -
    -

    A programming language is a formal language designed to communicate instructions to a machine, particularly a computer. Programming languages can be used to create programs that control the behavior of a machine and/or to express algorithms precisely.

    -
    -
    -

    Java (Indonesian: Jawa) is an island of Indonesia. With a population of 135 million (excluding the 3.6 million on the island of Madura which is administered as part of the provinces of Java), Java is the world's most populous island, and one of the most densely populated places in the world.

    -
    -
    -

    C# is a multi-paradigm programming language encompassing strong typing, imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.

    -
    -
    -

    A dynamic, reflective, general-purpose object-oriented programming language.

    -
    -
    -

    Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing.

    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/tools.html b/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/tools.html deleted file mode 100644 index 6351a91..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/accordion/tools.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Accordion Tools - jQuery EasyUI Demo - - - - - - - -

    Accordion Tools

    -

    Click the tools on top right of panel to perform actions.

    -
    -
    -
    -

    Accordion for jQuery

    -

    Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

    -
    -
    -

    The accordion allows you to provide multiple panels and display one ore more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

    -
    -
    - - - - - - - - - - - -
    Item IDProduct IDList PriceUnit CostAttributeStatus
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/basic.html deleted file mode 100644 index 9d0d672..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/basic.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Basic Calendar - jQuery EasyUI Demo - - - - - - - -

    Basic Calendar

    -

    Click to select date.

    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/custom.html b/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/custom.html deleted file mode 100644 index 7c570e6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/custom.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Custom Calendar - jQuery EasyUI Demo - - - - - - - -

    Custom Calendar

    -

    This example shows how to custom the calendar date by using 'formatter' function.

    -
    - -
    - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/disabledate.html b/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/disabledate.html deleted file mode 100644 index 0b1edeb..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/disabledate.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Disable Calendar Date - jQuery EasyUI Demo - - - - - - - -

    Disable Calendar Date

    -

    This example shows how to disable specified dates, only allows the user to select Mondays.

    -
    - -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/firstday.html b/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/firstday.html deleted file mode 100644 index dd414c5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/firstday.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - First Day of Week - jQuery EasyUI Demo - - - - - - - -

    First Day of Week

    -

    Choose the first day of the week.

    - -
    - -
    - -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/fluid.html deleted file mode 100644 index 3ca0fae..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/fluid.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Fluid Calendar - jQuery EasyUI Demo - - - - - - - -

    Fluid Calendar

    -

    This example shows how to set the width of calendar to a percentage of its parent container.

    -
    -
    -

    width: 50%, height: 250px

    -
    -

    width: 30%, height: 40%

    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/weeknumber.html b/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/weeknumber.html deleted file mode 100644 index 3330b61..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/calendar/weeknumber.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Week Number on Calendar - jQuery EasyUI Demo - - - - - - - -

    Week Number on Calendar

    -

    This example shows how to display the week number on calendar.

    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/checkbox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/checkbox/basic.html deleted file mode 100644 index 62eff8b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/checkbox/basic.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Basic CheckBox - jQuery EasyUI Demo - - - - - - - -

    Basic CheckBox

    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/checkgroup/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/checkgroup/basic.html deleted file mode 100644 index 2202ff0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/checkgroup/basic.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Basic CheckGroup - jQuery EasyUI Demo - - - - - - - -

    Basic CheckGroup

    -
    -
    -
    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combo/animation.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combo/animation.html deleted file mode 100644 index 9c0aacf..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combo/animation.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Combo Animation - jQuery EasyUI Demo - - - - - - - -

    Combo Animation

    -

    Change the animation type when open & close the drop-down panel.

    -
    - Animation Type: - -
    -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combo/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combo/basic.html deleted file mode 100644 index 5843258..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combo/basic.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Basic Combo - jQuery EasyUI Demo - - - - - - - -

    Basic Combo

    -

    Click the right arrow button to show drop down panel that can be filled with any content.

    -
    -
    -
    - -
    -
    -
    -
    Select a language
    -
    - Java
    - C#
    - Ruby
    - Basic
    - Fortran -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/actions.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/actions.html deleted file mode 100644 index 12d74d2..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/actions.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - ComboBox Actions - jQuery EasyUI Demo - - - - - - - -

    ComboBox

    -

    Click the buttons below to perform actions.

    - - -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/basic.html deleted file mode 100644 index 39cd934..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/basic.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Basic ComboBox - jQuery EasyUI Demo - - - - - - - -

    Basic ComboBox

    -

    Type in ComboBox to try auto complete.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/combobox_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/combobox_data1.json deleted file mode 100644 index 8bfba76..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/combobox_data1.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "id":1, - "text":"Java", - "desc":"Write once, run anywhere" -},{ - "id":2, - "text":"C#", - "desc":"One of the programming languages designed for the Common Language Infrastructure" -},{ - "id":3, - "text":"Ruby", - "selected":true, - "desc":"A dynamic, reflective, general-purpose object-oriented programming language" -},{ - "id":4, - "text":"Perl", - "desc":"A high-level, general-purpose, interpreted, dynamic programming language" -},{ - "id":5, - "text":"Basic", - "desc":"A family of general-purpose, high-level programming languages" -}] \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/combobox_data2.json b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/combobox_data2.json deleted file mode 100644 index fcaca4f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/combobox_data2.json +++ /dev/null @@ -1,47 +0,0 @@ -[{ - "value":"f20", - "text":"Firefox 2.0 or higher", - "group":"Firefox" -},{ - "value":"f15", - "text":"Firefox 1.5.x", - "group":"Firefox" -},{ - "value":"f10", - "text":"Firefox 1.0.x", - "group":"Firefox" -},{ - "value":"ie7", - "text":"Microsoft Internet Explorer 7.0 or higher", - "group":"Microsoft Internet Explorer" -},{ - "value":"ie6", - "text":"Microsoft Internet Explorer 6.x", - "group":"Microsoft Internet Explorer" -},{ - "value":"ie5", - "text":"Microsoft Internet Explorer 5.x", - "group":"Microsoft Internet Explorer" -},{ - "value":"ie4", - "text":"Microsoft Internet Explorer 4.x", - "group":"Microsoft Internet Explorer" -},{ - "value":"op9", - "text":"Opera 9.0 or higher", - "group":"Opera" -},{ - "value":"op8", - "text":"Opera 8.x", - "group":"Opera" -},{ - "value":"op7", - "text":"Opera 7.x", - "group":"Opera" -},{ - "value":"Safari", - "text":"Safari" -},{ - "value":"Other", - "text":"Other" -}] \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/customformat.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/customformat.html deleted file mode 100644 index ccecf67..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/customformat.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Custom Format in ComboBox - jQuery EasyUI Demo - - - - - - - -

    Custom Format in ComboBox

    -

    This sample shows how to custom the format of list item.

    -
    -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/dynamicdata.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/dynamicdata.html deleted file mode 100644 index c7c8b18..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/dynamicdata.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Load Dynamic ComboBox Data - jQuery EasyUI Demo - - - - - - - -

    Load Dynamic ComboBox Data

    -

    Click the button below to load data.

    - -
    - LoadData -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/fluid.html deleted file mode 100644 index d72d25d..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/fluid.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Fluid ComboBox - jQuery EasyUI Demo - - - - - - - -

    Fluid ComboBox

    -

    This example shows how to set the width of combobox to a percentage of its parent container.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/group.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/group.html deleted file mode 100644 index 4ee5e91..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/group.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Group ComboBox - jQuery EasyUI Demo - - - - - - - -

    Group ComboBox

    -

    This example shows how to display combobox items in groups.

    -
    - - Sticky Group -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/icons.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/icons.html deleted file mode 100644 index 04629c8..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/icons.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - ComboBox with Extra Icons- jQuery EasyUI Demo - - - - - - - -

    ComboBox with Extra Icons

    -

    The user can attach extra icons to the ComboBox.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/itemicon.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/itemicon.html deleted file mode 100644 index 6a81819..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/itemicon.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Show Item Icon in ComboBox - jQuery EasyUI Demo - - - - - - - -

    Show Item Icon in ComboBox

    -

    This example shows how to display item icon in ComboBox.

    -
    -
    -
    - -
    -
    - diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/multiline.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/multiline.html deleted file mode 100644 index eaa4d06..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/multiline.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Multiline ComboBox - jQuery EasyUI Demo - - - - - - - -

    Multiline ComboBox

    -

    This example shows how to create a multiline ComboBox.

    -
    -
    -
    - -
    -
    - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/multiple.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/multiple.html deleted file mode 100644 index d735237..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/multiple.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Multiple Select - jQuery EasyUI Demo - - - - - - - -

    Load Dynamic ComboBox Data

    -

    Drop down the panel and select multiple items.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/navigation.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/navigation.html deleted file mode 100644 index f995c34..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/navigation.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - Navigate ComboBox - jQuery EasyUI Demo - - - - - - - -

    Navigate ComboBox

    -

    Navigate through combobox items width keyboard to select an item.

    -
    - - SelectOnNavigation -
    -
    -
    - -
    -
    - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/remotedata.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/remotedata.html deleted file mode 100644 index 8fa7eff..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/remotedata.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Binding to Remote Data - jQuery EasyUI Demo - - - - - - - -

    Binding to Remote Data

    -

    The ComboBox is bound to a remote data.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/remotejsonp.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/remotejsonp.html deleted file mode 100644 index d416d88..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combobox/remotejsonp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Remote JSONP - jQuery EasyUI Demo - - - - - - - -

    Remote JSONP

    -

    This sample shows how to use JSONP to retrieve data from a remote site.

    -
    -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/actions.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/actions.html deleted file mode 100644 index af3b22b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/actions.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - ComboGrid Actions - jQuery EasyUI Demo - - - - - - - -

    ComboGrid Actions

    -

    Click the buttons below to perform actions.

    - -
    -
    - -
    -
    - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/basic.html deleted file mode 100644 index f54726c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/basic.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Basic ComboGrid - jQuery EasyUI Demo - - - - - - - -

    Basic ComboGrid

    -

    Click the right arrow button to show the DataGrid.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/datagrid_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/datagrid_data1.json deleted file mode 100644 index 3a62a71..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/datagrid_data1.json +++ /dev/null @@ -1,12 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, - {"selected":true,"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} -]} diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/fluid.html deleted file mode 100644 index 02de027..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/fluid.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - Fluid ComboGrid - jQuery EasyUI Demo - - - - - - - -

    Fluid ComboGrid

    -

    This example shows how to set the width of ComboGrid to a percentage of its parent container.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/initvalue.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/initvalue.html deleted file mode 100644 index bab3053..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/initvalue.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Initialize Value for ComboGrid - jQuery EasyUI Demo - - - - - - - -

    Initialize Value for ComboGrid

    -

    Initialize value when ComboGrid is created.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/multiple.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/multiple.html deleted file mode 100644 index bf6e9e0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/multiple.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Multiple ComboGrid - jQuery EasyUI Demo - - - - - - - -

    Multiple ComboGrid

    -

    Click the right arrow button to show the DataGrid and select items.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/navigation.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/navigation.html deleted file mode 100644 index 331b4d7..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/navigation.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Navigate ComboGrid - jQuery EasyUI Demo - - - - - - - -

    Navigate ComboGrid

    -

    Navigate through grid items with keyboard to select an item.

    -
    - - SelectOnNavigation -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/setvalue.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/setvalue.html deleted file mode 100644 index 254acf4..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combogrid/setvalue.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Set Value for ComboGrid - jQuery EasyUI Demo - - - - - - - -

    Set Value for ComboGrid

    -

    Click the buttons below to perform actions.

    - -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/actions.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/actions.html deleted file mode 100644 index d7b853d..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/actions.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - ComboTree Actions - jQuery EasyUI Demo - - - - - - - -

    ComboTree Actions

    -

    Click the buttons below to perform actions

    - -
    -
    - -
    -
    - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/basic.html deleted file mode 100644 index 2213f12..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/basic.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Basic ComboTree - jQuery EasyUI Demo - - - - - - - -

    Basic ComboTree

    -

    Click the right arrow button to show the tree panel.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/fluid.html deleted file mode 100644 index 7fe885a..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid ComboTree - jQuery EasyUI Demo - - - - - - - -

    Fluid ComboTree

    -

    This example shows how to set the width of ComboTree to a percentage of its parent container.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/initvalue.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/initvalue.html deleted file mode 100644 index 15e4cc5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/initvalue.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Initialize Value for ComboTree - jQuery EasyUI Demo - - - - - - - -

    Initialize Value for ComboTree

    -

    Initialize Value when ComboTree is created.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/multiple.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/multiple.html deleted file mode 100644 index e429063..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/multiple.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Multiple ComboTree - jQuery EasyUI Demo - - - - - - - -

    Multiple ComboTree

    -

    Click the right arrow button to show the tree panel and select multiple nodes.

    -
    - Cascade Check: - -
    -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/test.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/test.html deleted file mode 100644 index f9c4f00..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/test.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Basic ComboTree - jQuery EasyUI Demo - - - - - - - - - - - -

    Basic ComboTree

    -

    Click the right arrow button to show the tree panel.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/tree_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/tree_data1.json deleted file mode 100644 index 83fb0d6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotree/tree_data1.json +++ /dev/null @@ -1,49 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java", - "attributes":{ - "p1":"Custom Attribute1", - "p2":"Custom Attribute2" - } - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games", - "checked":true - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/basic.html deleted file mode 100644 index ed3c755..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/basic.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Basic ComboTreeGrid - jQuery EasyUI Demo - - - - - - - -

    Basic ComboTreeGrid

    -

    Click the right arrow button to show the TreeGrid.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/multiple.html b/src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/multiple.html deleted file mode 100644 index 2f34f7c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/multiple.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - Multiple ComboTreeGrid - jQuery EasyUI Demo - - - - - - - -

    Multiple ComboTreeGrid

    -

    Click the right arrow button to show the TreeGrid and select items.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/treegrid_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/treegrid_data1.json deleted file mode 100644 index 0313d46..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/combotreegrid/treegrid_data1.json +++ /dev/null @@ -1,73 +0,0 @@ -[{ - "id":1, - "name":"C", - "size":"", - "date":"02/19/2010", - "children":[{ - "id":2, - "name":"Program Files", - "size":"120 MB", - "date":"03/20/2010", - "children":[{ - "id":21, - "name":"Java", - "size":"", - "date":"01/13/2010", - "state":"closed", - "children":[{ - "id":211, - "name":"java.exe", - "size":"142 KB", - "date":"01/13/2010" - },{ - "id":212, - "name":"jawt.dll", - "size":"5 KB", - "date":"01/13/2010" - }] - },{ - "id":22, - "name":"MySQL", - "size":"", - "date":"01/13/2010", - "state":"closed", - "children":[{ - "id":221, - "name":"my.ini", - "size":"10 KB", - "date":"02/26/2009" - },{ - "id":222, - "name":"my-huge.ini", - "size":"5 KB", - "date":"02/26/2009" - },{ - "id":223, - "name":"my-large.ini", - "size":"5 KB", - "date":"02/26/2009" - }] - }] - },{ - "id":3, - "name":"eclipse", - "size":"", - "date":"01/20/2010", - "children":[{ - "id":31, - "name":"eclipse.exe", - "size":"56 KB", - "date":"05/19/2009" - },{ - "id":32, - "name":"eclipse.ini", - "size":"1 KB", - "date":"04/20/2010" - },{ - "id":33, - "name":"notice.html", - "size":"7 KB", - "date":"03/17/2005" - }] - }] -}] \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/aligncolumns.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/aligncolumns.html deleted file mode 100644 index cc86de6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/aligncolumns.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Aligning Columns in DataGrid - jQuery EasyUI Demo - - - - - - - -

    Aligning Columns in DataGrid

    -

    Use align and halign properties to set the alignment of the columns and their header.

    -
    - - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/basic.html deleted file mode 100644 index 8dcc2f3..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/basic.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Basic DataGrid - jQuery EasyUI Demo - - - - - - - -

    Basic DataGrid

    -

    The DataGrid is created from markup, no JavaScript code needed.

    -
    - - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cacheeditor.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cacheeditor.html deleted file mode 100644 index 66aee2f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cacheeditor.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - Cache Editor for DataGrid - jQuery EasyUI Demo - - - - - - - -

    Cache Editor for DataGrid

    -

    This example shows how to cache the editors for datagrid to improve the editing speed.

    -
    - - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cellediting.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cellediting.html deleted file mode 100644 index c06ec57..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cellediting.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - Cell Editing in DataGrid - jQuery EasyUI Demo - - - - - - - -

    Cell Editing in DataGrid

    -

    Click a cell to start editing.

    -
    - - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cellstyle.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cellstyle.html deleted file mode 100644 index 3140fa3..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/cellstyle.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - DataGrid Cell Style - jQuery EasyUI Demo - - - - - - - -

    DataGrid Cell Style

    -

    The cells which listprice value is less than 30 are highlighted.

    -
    - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/checkbox.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/checkbox.html deleted file mode 100644 index 3ea251d..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/checkbox.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - CheckBox Selection on DataGrid - jQuery EasyUI Demo - - - - - - - -

    CheckBox Selection on DataGrid

    -

    Click the checkbox on header to select or unselect all selections.

    -
    - - - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    -
    - Selection Mode: -
    - SelectOnCheck:
    - CheckOnSelect: -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/clientpagination.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/clientpagination.html deleted file mode 100644 index 7b63b78..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/clientpagination.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - Client Side Pagination in DataGrid - jQuery EasyUI Demo - - - - - - - -

    Client Side Pagination in DataGrid

    -

    This sample shows how to implement client side pagination in DataGrid.

    -
    - - - - - - - - - - - - - -
    Inv NoDateNameAmountPriceCostNote
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/columngroup.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/columngroup.html deleted file mode 100644 index af8f0f9..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/columngroup.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Column Group - jQuery EasyUI Demo - - - - - - - -

    Column Group

    -

    The header cells can be merged. Useful to group columns under a category.

    -
    - - - - - - - - - - - - - - -
    Item IDProductItem Details
    List PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/complextoolbar.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/complextoolbar.html deleted file mode 100644 index 2ee44a5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/complextoolbar.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - DataGrid Complex Toolbar - jQuery EasyUI Demo - - - - - - - -

    DataGrid Complex Toolbar

    -

    The DataGrid toolbar can be defined from a <div> markup, so you can define the layout of toolbar easily.

    -
    - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    -
    - Date From: - To: - Language: - - Search -
    -
    - - - - - -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/contextmenu.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/contextmenu.html deleted file mode 100644 index 51539ce..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/contextmenu.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Context Menu on DataGrid - jQuery EasyUI Demo - - - - - - - -

    Context Menu on DataGrid

    -

    Right click on the header of DataGrid to display context menu.

    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/custompager.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/custompager.html deleted file mode 100644 index baa66a4..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/custompager.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Custom DataGrid Pager - jQuery EasyUI Demo - - - - - - - -

    Custom DataGrid Pager

    -

    You can append some buttons to the standard datagrid pager bar.

    -
    - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/datagrid_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/datagrid_data1.json deleted file mode 100644 index 07bf7cb..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/datagrid_data1.json +++ /dev/null @@ -1,12 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","productname":"Koi","unitcost":"10.00","status":"P","listprice":"36.50","attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","productname":"Dalmation","unitcost":"12.00","status":"P","listprice":"18.50","attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":"12.00","status":"P","listprice":"38.50","attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":"12.00","status":"P","listprice":"26.50","attr1":"Rattleless","itemid":"EST-12"}, - {"productid":"RP-LI-02","productname":"Iguana","unitcost":"12.00","status":"P","listprice":"35.50","attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":"12.00","status":"P","listprice":"158.50","attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":"12.00","status":"P","listprice":"83.50","attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":"12.00","status":"P","listprice":"23.50","attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":"12.00","status":"P","listprice":"89.50","attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":"92.00","status":"P","listprice":"63.50","attr1":"Adult Male","itemid":"EST-18"} -]} diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/datagrid_data2.json b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/datagrid_data2.json deleted file mode 100644 index 4a27e14..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/datagrid_data2.json +++ /dev/null @@ -1,15 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":28.50,"attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, - {"productid":"RP-LI-02","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":63.50,"attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} -],"footer":[ - {"unitcost":19.80,"listprice":60.40,"productid":"Average:"}, - {"unitcost":198.00,"listprice":604.00,"productid":"Total:"} -]} diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/fluid.html deleted file mode 100644 index b67e9ca..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/fluid.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Fluid DataGrid - jQuery EasyUI Demo - - - - - - - -

    Fluid DataGrid

    -

    This example shows how to assign percentage width to a column in DataGrid.

    -
    - - - - - - - - - - - - -
    Item ID(15%)Product(15%)List Price(15%)Unit Cost(15%)Attribute(25%)Status(15%)
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/footer.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/footer.html deleted file mode 100644 index 53a3fbd..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/footer.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - Footer Rows in DataGrid - jQuery EasyUI Demo - - - - - - - -

    Footer Rows in DataGrid

    -

    The summary informations can be displayed in footer rows.

    -
    - - - - - - - - - - - -
    Item IDProduct IDList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/formatcolumns.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/formatcolumns.html deleted file mode 100644 index c2b0076..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/formatcolumns.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Format DataGrid Columns - jQuery EasyUI Demo - - - - - - - -

    Format DataGrid Columns

    -

    The list price value will show red color when less than 30.

    -
    - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/frozencolumns.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/frozencolumns.html deleted file mode 100644 index 2bc21b1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/frozencolumns.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Frozen Columns in DataGrid - jQuery EasyUI Demo - - - - - - - -

    Frozen Columns in DataGrid

    -

    You can freeze some columns that can't scroll out of view.

    -
    - - - - - - - - - - - - - - - -
    Item IDProduct
    List PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/frozenrows.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/frozenrows.html deleted file mode 100644 index 72310dd..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/frozenrows.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Frozen Rows in DataGrid - jQuery EasyUI Demo - - - - - - - -

    Frozen Rows in DataGrid

    -

    This sample shows how to freeze some rows that will always be displayed at the top when the datagrid is scrolled down.

    -
    - - - - - - - - - - - - - - - -
    Item IDProduct
    List PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/mergecells.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/mergecells.html deleted file mode 100644 index a50f934..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/mergecells.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Merge Cells for DataGrid - jQuery EasyUI Demo - - - - - - - -

    Merge Cells for DataGrid

    -

    Cells in DataGrid body can be merged.

    -
    - - - - - - - - - - - -
    ProductItem IDList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/multisorting.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/multisorting.html deleted file mode 100644 index f41092a..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/multisorting.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Multiple Sorting - jQuery EasyUI Demo - - - - - - - -

    Multiple Sorting

    -

    Set 'multiSort' property to true to enable multiple column sorting.

    -
    - - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/products.json b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/products.json deleted file mode 100644 index 2c512bc..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/products.json +++ /dev/null @@ -1,9 +0,0 @@ -[ -{"productid":"FI-SW-01","productname":"Koi"}, -{"productid":"K9-DL-01","productname":"Dalmation"}, -{"productid":"RP-SN-01","productname":"Rattlesnake"}, -{"productid":"RP-LI-02","productname":"Iguana"}, -{"productid":"FL-DSH-01","productname":"Manx"}, -{"productid":"FL-DLH-02","productname":"Persian"}, -{"productid":"AV-CB-01","productname":"Amazon Parrot"} -] diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowborder.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowborder.html deleted file mode 100644 index 24a18b7..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowborder.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - Row Border in DataGrid - jQuery EasyUI Demo - - - - - - - -

    Row Border in DataGrid

    -

    This sample shows how to change the row border style of datagrid.

    -
    - Border: - - Striped: - -
    - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowediting.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowediting.html deleted file mode 100644 index 418dd2a..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowediting.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - Row Editing in DataGrid - jQuery EasyUI Demo - - - - - - - -

    Row Editing in DataGrid

    -

    Click the row to start editing.

    -
    - - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowstyle.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowstyle.html deleted file mode 100644 index d65a5c8..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/rowstyle.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - DataGrid Row Style - jQuery EasyUI Demo - - - - - - - -

    DataGrid Row Style

    -

    The rows which listprice value is less than 30 are highlighted.

    -
    - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/selection.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/selection.html deleted file mode 100644 index 1118561..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/selection.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - DataGrid Selection - jQuery EasyUI Demo - - - - - - - -

    DataGrid Selection

    -

    Choose a selection mode and select one or more rows.

    - - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    -
    - Selection Mode: - -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/simpletoolbar.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/simpletoolbar.html deleted file mode 100644 index cbb918b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/simpletoolbar.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - DataGrid with Toolbar - jQuery EasyUI Demo - - - - - - - -

    DataGrid with Toolbar

    -

    Put buttons on top toolbar of DataGrid.

    -
    - - - - - - - - - - - -
    Item IDProductList PriceUnit CostAttributeStatus
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/transform.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/transform.html deleted file mode 100644 index ddc3a30..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datagrid/transform.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Transform DataGrid from Table - jQuery EasyUI Demo - - - - - - - -

    Transform DataGrid from Table

    -

    Transform DataGrid from an existing, unformatted html table.

    -
    - Transform -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Item IDProductList PriceAttribute
    EST-1FI-SW-0136.50Large
    EST-10K9-DL-0118.50Spotted Adult Female
    EST-11RP-SN-0128.50Venomless
    EST-12RP-SN-0126.50Rattleless
    EST-13RP-LI-0235.50Green Adult
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/basic.html deleted file mode 100644 index 4910219..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/basic.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - Basic DataList - jQuery EasyUI Demo - - - - - - - -

    Basic DataList

    -

    The DataList can be created from the <ul> element.

    -
    -
      -
    • Alabama
    • -
    • Alaska
    • -
    • Arizona
    • -
    • Arkansas
    • -
    • California
    • -
    • Colorado
    • -
    • Connecticut
    • -
    • Delaware
    • -
    • Florida
    • -
    • Georgia
    • -
    • Hawaii
    • -
    • Idaho
    • -
    • Illinois
    • -
    • Indiana
    • -
    • Iowa
    • -
    • Kansas
    • -
    • Kentucky
    • -
    • Louisiana
    • -
    • Maine
    • -
    • Maryland
    • -
    • Massachusetts
    • -
    • Michigan
    • -
    • Minnesota
    • -
    • Mississippi
    • -
    • Missouri
    • -
    • Montana
    • -
    • Nebraska
    • -
    • Nevada
    • -
    • New Hampshire
    • -
    • New Jersey
    • -
    • New Mexico
    • -
    • New York
    • -
    • North Carolina
    • -
    • North Dakota
    • -
    • Ohio
    • -
    • Oklahoma
    • -
    • Oregon
    • -
    • Pennsylvania
    • -
    • Rhode Island
    • -
    • South Carolina
    • -
    • South Dakota
    • -
    • Tennessee
    • -
    • Texas
    • -
    • Utah
    • -
    • Vermont
    • -
    • Virginia
    • -
    • Washington
    • -
    • West Virginia
    • -
    • Wisconsin
    • -
    • Wyoming
    • -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/checkbox.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/checkbox.html deleted file mode 100644 index dd18f5b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/checkbox.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Checkbox in DataList - jQuery EasyUI Demo - - - - - - - -

    Checkbox in DataList

    -

    Each item in the DataList has a checkbox.

    -
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/datalist_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/datalist_data1.json deleted file mode 100644 index d53cf62..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/datalist_data1.json +++ /dev/null @@ -1,18 +0,0 @@ -[ -{"text":"Epson WorkForce 845","group":"Printer"}, -{"text":"Canon PIXMA MG5320","group":"Printer"}, -{"text":"HP Deskjet 1000 Printer","group":"Printer"}, -{"text":"Cisco RV110W-A-NA-K9","group":"Firewall"}, -{"text":"ZyXEL ZyWALL USG50","group":"Firewall"}, -{"text":"NETGEAR FVS318","group":"Firewall"}, -{"text":"Logitech Keyboard K120","group":"Keyboard"}, -{"text":"Microsoft Natural Ergonomic Keyboard 4000","group":"Keyboard"}, -{"text":"Logitech Wireless Touch Keyboard K400","group":"Keyboard"}, -{"text":"Logitech Gaming Keyboard G110","group":"Keyboard"}, -{"text":"Nikon COOLPIX L26 16.1 MP","group":"Camera"}, -{"text":"Canon PowerShot A1300","group":"Camera"}, -{"text":"Canon PowerShot A2300","group":"Camera"} - - - -] \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/group.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/group.html deleted file mode 100644 index bf22b6f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/group.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Group DataList - jQuery EasyUI Demo - - - - - - - -

    Group DataList

    -

    This example shows how to display items in groups.

    -
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/multiselect.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/multiselect.html deleted file mode 100644 index 704924c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/multiselect.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Multiple Selection DataList - jQuery EasyUI Demo - - - - - - - -

    Multiple Selection DataList

    -

    The multiple selection allows the user to select multiple items in a datalist.

    -
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/remotedata.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/remotedata.html deleted file mode 100644 index 0c71604..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datalist/remotedata.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Binding to Remote Data - jQuery EasyUI Demo - - - - - - - -

    Binding to Remote Data

    -

    The DataList is bound to a remote data.

    -
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/basic.html deleted file mode 100644 index ee82284..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic DateBox - jQuery EasyUI Demo - - - - - - - -

    Basic DateBox

    -

    Click the calendar image on the right side.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/buttons.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/buttons.html deleted file mode 100644 index c015a49..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/buttons.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - DateBox Buttons - jQuery EasyUI Demo - - - - - - - -

    DateBox Buttons

    -

    This example shows how to customize the datebox buttons underneath the calendar.

    -
    -
    -
    - -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/clone.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/clone.html deleted file mode 100644 index 68850f3..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/clone.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Clone DateBox - jQuery EasyUI Demo - - - - - - - -

    Clone DateBox

    -

    Click the 'Clone' button to clone datebox components from the exiting datebox.

    -
    - Clone -
    -
    -
    - -
    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/dateformat.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/dateformat.html deleted file mode 100644 index ab16879..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/dateformat.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Date Format - jQuery EasyUI Demo - - - - - - - -

    Date Format

    -

    Different date formats are applied to different DateBox components.

    -
    -
    -
    - -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/events.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/events.html deleted file mode 100644 index d8a9b00..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/events.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - DateBox Events - jQuery EasyUI Demo - - - - - - - -

    DateBox Events

    -

    Click the calendar image on the right side.

    -
    -
    -
    - -
    -
    - Selected Date: - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/fluid.html deleted file mode 100644 index 056b0b2..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid DateBox - jQuery EasyUI Demo - - - - - - - -

    Fluid DateBox

    -

    This example shows how to set the width of DateBox to a percentage of its parent container.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/restrict.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/restrict.html deleted file mode 100644 index 03ad76b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/restrict.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Restrict Date Range in DateBox - jQuery EasyUI Demo - - - - - - - -

    Restrict Date Range in DateBox

    -

    This example shows how to restrict the user to select only ten days from now.

    -
    -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/sharedcalendar.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/sharedcalendar.html deleted file mode 100644 index ca06eb8..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/sharedcalendar.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Shared Calendar in DateBox - jQuery EasyUI Demo - - - - - - - -

    Shared Calendar in DateBox

    -

    Multiple datebox components can share a calendar and use it to pick dates.

    -
    -
    -
    - -
    -
    - -
    -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/validate.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/validate.html deleted file mode 100644 index 2b55b34..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datebox/validate.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Validate DateBox - jQuery EasyUI Demo - - - - - - - -

    Validate DateBox

    -

    When the selected date is greater than specified date. The field validator will raise an error.

    -
    -
    -
    - -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/basic.html deleted file mode 100644 index 1299803..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic DateTimeBox - jQuery EasyUI Demo - - - - - - - -

    Basic DateTimeBox

    -

    Click the calendar image on the right side.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/fluid.html deleted file mode 100644 index efe7dbf..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid DateTimeBox - jQuery EasyUI Demo - - - - - - - -

    Fluid DateTimeBox

    -

    This example shows how to set the width of DateTimeBox to a percentage of its parent container.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/initvalue.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/initvalue.html deleted file mode 100644 index 9d9a231..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/initvalue.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Initialize Value for DateTime - jQuery EasyUI Demo - - - - - - - -

    Initialize Value for DateTime

    -

    The value is initialized when DateTimeBox has been created.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/showseconds.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/showseconds.html deleted file mode 100644 index 3736f38..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimebox/showseconds.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Display Seconds - jQuery EasyUI Demo - - - - - - - -

    Display Seconds

    -

    The user can decide to display seconds part or not.

    -
    - Show Seconds: - -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/basic.html deleted file mode 100644 index 8a00c41..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic DateTimeSpinner - jQuery EasyUI Demo - - - - - - - -

    Basic DateTimeSpinner

    -

    Click spin button to adjust date and time.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/clearicon.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/clearicon.html deleted file mode 100644 index 74e2795..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/clearicon.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - DateTimeSpinner with Clear Icon - jQuery EasyUI Demo - - - - - - - -

    DateTimeSpinner with Clear Icon

    -

    A clear icon can be attached to the datetimespinner. Click it to clear the entered value.

    -
    -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/fluid.html deleted file mode 100644 index e5e3f1f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid DateTimeSpinner - jQuery EasyUI Demo - - - - - - - -

    Fluid DateTimeSpinner

    -

    The width of datetimespinner is set in percentages.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/format.html b/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/format.html deleted file mode 100644 index f470c71..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/datetimespinner/format.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Format DateTimeSpinner - jQuery EasyUI Demo - - - - - - - -

    Format DateTimeSpinner

    -

    The DataTimeSpinner value can be formatted by specifying the 'formatter' and 'parser' functions.

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/demo.css b/src/UWE_projectCode/前后端信息交互引用库/demo/demo.css deleted file mode 100644 index 537e194..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/demo.css +++ /dev/null @@ -1,24 +0,0 @@ -body { - font-family:verdana,helvetica,arial,sans-serif; - padding:20px; - font-size:12px; - margin:0; -} -h2 { - font-size:18px; - font-weight:bold; - margin:0; - margin-bottom:15px; -} -.demo-info{ - padding:0 0 12px 0; -} -.demo-tip{ - display:none; -} -.label-top{ - display: block; - height: 22px; - line-height: 22px; - vertical-align: middle; -} \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/basic.html deleted file mode 100644 index e745b37..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/basic.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Basic Dialog - jQuery EasyUI Demo - - - - - - - -

    Basic Dialog

    -

    Click below button to open or close dialog.

    -
    - Open - Close -
    -
    - The dialog content. -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/complextoolbar.html b/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/complextoolbar.html deleted file mode 100644 index 175fa73..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/complextoolbar.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Complex Toolbar on Dialog - jQuery EasyUI Demo - - - - - - - -

    Complex Toolbar on Dialog

    -

    This sample shows how to create complex toolbar on dialog.

    -
    - Open - Close -
    -
    - The dialog content. -
    -
    - - - - - -
    - Edit - Help - - -
    -
    -
    - Save - Close -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/fluid.html deleted file mode 100644 index b9809f0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/fluid.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Fluid Dialog - jQuery EasyUI Demo - - - - - - - -

    Fluid Dialog

    -

    This example shows how to set the width of Dialog to a percentage of its parent container.

    -
    -
    -

    width: 80%; height: 200px

    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/toolbarbuttons.html b/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/toolbarbuttons.html deleted file mode 100644 index 35013a5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/dialog/toolbarbuttons.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Toolbar and Buttons - jQuery EasyUI Demo - - - - - - - -

    Toolbar and Buttons

    -

    The toolbar and buttons can be added to dialog.

    -
    - Open - Close -
    -
    - The dialog content. -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/draggable/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/draggable/basic.html deleted file mode 100644 index 0c96a05..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/draggable/basic.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Basic Draggable - jQuery EasyUI Demo - - - - - - - -

    Basic Draggable

    -

    Move the boxes below by clicking on it with mouse.

    -
    -
    -
    -
    Title
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/draggable/constrain.html b/src/UWE_projectCode/前后端信息交互引用库/demo/draggable/constrain.html deleted file mode 100644 index a2dfa6c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/draggable/constrain.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Constrain Draggable - jQuery EasyUI Demo - - - - - - - -

    Constrain Draggable

    -

    The draggable object can only be moved within its parent container.

    -
    -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/draggable/snap.html b/src/UWE_projectCode/前后端信息交互引用库/demo/draggable/snap.html deleted file mode 100644 index 5f0103a..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/draggable/snap.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Snap Draggable - jQuery EasyUI Demo - - - - - - - -

    Snap Draggable

    -

    This sample shows how to snap a draggable object to a 20x20 grid.

    -
    -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/drawer/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/drawer/basic.html deleted file mode 100644 index a62ea85..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/drawer/basic.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Basic Drawer - jQuery EasyUI Demo - - - - - - - -

    Basic Drawer

    - -
    -

    Drawer Content...

    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/drawer/headerfooter.html b/src/UWE_projectCode/前后端信息交互引用库/demo/drawer/headerfooter.html deleted file mode 100644 index 6b31f27..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/drawer/headerfooter.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Header and Footer - jQuery EasyUI Demo - - - - - - - -

    Header and Footer

    - -
    -
    Header Title
    -
    -

    Drawer Content...

    -
    -
    - Save - Cancel -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/drawer/region.html b/src/UWE_projectCode/前后端信息交互引用库/demo/drawer/region.html deleted file mode 100644 index cb520a4..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/drawer/region.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Region - jQuery EasyUI Demo - - - - - - - -

    Region

    -
    -
    - Change Region: - -
    - Expand Drawer -
    -
    -

    Drawer Content...

    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/droppable/accept.html b/src/UWE_projectCode/前后端信息交互引用库/demo/droppable/accept.html deleted file mode 100644 index cf56d08..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/droppable/accept.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - Accept a Drop - jQuery EasyUI Demo - - - - - - - -

    Accept a Drop

    -

    Some draggable object can not be accepted.

    -
    -
    - drag me! -
    Drag 1
    -
    Drag 2
    -
    Drag 3
    -
    -
    - drop here! -
    -
    - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/droppable/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/droppable/basic.html deleted file mode 100644 index ecf803a..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/droppable/basic.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - Basic Droppable - jQuery EasyUI Demo - - - - - - - -

    Basic Droppable

    -

    Drag the boxed on left to the target area on right.

    -
    -
    -
    Source
    -
    -
    Apple
    -
    Peach
    -
    Orange
    -
    -
    -
    -
    Target
    -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/droppable/sort.html b/src/UWE_projectCode/前后端信息交互引用库/demo/droppable/sort.html deleted file mode 100644 index 37c0d2f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/droppable/sort.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Change Items Order - jQuery EasyUI Demo - - - - - - - -

    Change Items Order

    -

    Drag the list items to change their order.

    -
    -
      -
    • Drag 1
    • -
    • Drag 2
    • -
    • Drag 3
    • -
    • Drag 4
    • -
    • Drag 5
    • -
    • Drag 6
    • -
    - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/easyloader/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/easyloader/basic.html deleted file mode 100644 index 44a09eb..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/easyloader/basic.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Basic EasyLoader - jQuery EasyUI Demo - - - - - - - -

    Basic EasyLoader

    -
    -
    -
    Click the buttons below to load components dynamically.
    -
    - -
    -
    -
    - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/filebox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/filebox/basic.html deleted file mode 100644 index 394dcf9..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/filebox/basic.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Basic FileBox - jQuery EasyUI Demo - - - - - - - -

    Basic FileBox

    -

    The filebox component represents a file field of the forms.

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - Upload -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/filebox/buttonalign.html b/src/UWE_projectCode/前后端信息交互引用库/demo/filebox/buttonalign.html deleted file mode 100644 index 072a406..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/filebox/buttonalign.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Button Align on FileBox - jQuery EasyUI Demo - - - - - - - -

    Button Align on FileBox

    -

    Change the button align to the left or right of filebox.

    -
    - Select Button Align: - -
    -
    - -
    - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/filebox/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/filebox/fluid.html deleted file mode 100644 index 67eaf1d..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/filebox/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid FileBox - jQuery EasyUI Demo - - - - - - - -

    Fluid FileBox

    -

    This example shows how to set the width of FileBox to a percentage of its parent container.

    -
    -
    -
    - -
    -
    - -
    -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/form/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/form/basic.html deleted file mode 100644 index fb6cdae..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/form/basic.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Basic Form - jQuery EasyUI Demo - - - - - - - -

    Basic Form

    -

    Fill the form and submit it.

    -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    - Submit - Clear -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/form/floatinglabel.html b/src/UWE_projectCode/前后端信息交互引用库/demo/form/floatinglabel.html deleted file mode 100644 index 52e0a97..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/form/floatinglabel.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Floating Label - jQuery EasyUI Demo - - - - - - - - - -

    Floating Label

    -

    This example shows how to create inspired text fields with animated floating labels.

    -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    - Submit - Clear -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/form/form_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/form/form_data1.json deleted file mode 100644 index bb82c7a..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/form/form_data1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name":"easyui", - "email":"easyui@gmail.com", - "subject":"Subject Title", - "message":"Message Content", - "language":"de", - "accept":"true" -} \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/form/load.html b/src/UWE_projectCode/前后端信息交互引用库/demo/form/load.html deleted file mode 100644 index aa2901b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/form/load.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Load Form Data - jQuery EasyUI Demo - - - - - - - -

    Load Form Data

    -

    Click the buttons below to load form data.

    - -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - - -
    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/form/validateonsubmit.html b/src/UWE_projectCode/前后端信息交互引用库/demo/form/validateonsubmit.html deleted file mode 100644 index e2926ed..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/form/validateonsubmit.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Validate Form on Submit - jQuery EasyUI Demo - - - - - - - -

    Validate Form on Submit

    -

    The form does not perform validation before being submitted.

    -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    - Submit - Clear -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/_content.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/_content.html deleted file mode 100644 index 66c1bd5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

    jQuery EasyUI framework help you build your web page easily.

    -
      -
    • easyui is a collection of user-interface plugin based on jQuery.
    • -
    • easyui provides essential functionality for building modern, interactive, javascript applications.
    • -
    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
    • -
    • complete framework for HTML5 web page.
    • -
    • easyui save your time and scales while developing your products.
    • -
    • easyui is very easy but powerful.
    • -
    - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/addremove.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/addremove.html deleted file mode 100644 index 34977c4..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/addremove.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Add and Remove Layout - jQuery EasyUI Demo - - - - - - - -

    Add and Remove Layout

    -

    Click the buttons below to add or remove region panel of layout.

    -
    - Select Region Panel: - - Add - Remove -
    -
    -
    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/autoheight.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/autoheight.html deleted file mode 100644 index 0c882f2..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/autoheight.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Auto Height for Layout - jQuery EasyUI Demo - - - - - - - -

    Auto Height for Layout

    -

    This example shows how to auto adjust layout height after dynamically adding items.

    - -
    -
    -
    -
    -
    -

    Panel Content.

    -

    Panel Content.

    -

    Panel Content.

    -

    Panel Content.

    -

    Panel Content.

    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/basic.html deleted file mode 100644 index 29e2c39..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/basic.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Basic Layout - jQuery EasyUI Demo - - - - - - - -

    Basic Layout

    -

    The layout contains north,south,west,east and center regions.

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - -
    Item IDProduct IDList PriceUnit CostAttributeStatus
    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/collapsetitle.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/collapsetitle.html deleted file mode 100644 index 2c8a597..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/collapsetitle.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Collapse Title in Layout - jQuery EasyUI Demo - - - - - - - -

    Collapse Title in Layout

    -

    The title bar will display while collapse a region panel.

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - -
    Item IDProduct IDList PriceUnit CostAttributeStatus
    -
    -
    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/complex.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/complex.html deleted file mode 100644 index 833eb09..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/complex.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Complex Layout - jQuery EasyUI Demo - - - - - - - -

    Complex Layout

    -

    This sample shows how to create a complex layout.

    -
    -
    -
    -
    -
    -
      -
      -
      -
      -
      - content1 -
      -
      - content2 -
      -
      - content3 -
      -
      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      Item IDProduct IDList PriceUnit CostAttributeStatus
      -
      -
      -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/customcollapsetitle.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/customcollapsetitle.html deleted file mode 100644 index 3a4517e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/customcollapsetitle.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - Custom Collapse Title in Layout - jQuery EasyUI Demo - - - - - - - -

      Custom Collapse Title in Layout

      -

      Any components can display on the title bar of a collapsed panel.

      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      Item IDProduct IDList PriceUnit CostAttributeStatus
      -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/datagrid_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/datagrid_data1.json deleted file mode 100644 index e9a5be2..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/datagrid_data1.json +++ /dev/null @@ -1,12 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, - {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} -]} diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/fluid.html deleted file mode 100644 index 42f8c55..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/fluid.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Fluid Layout - jQuery EasyUI Demo - - - - - - - -

      Fluid Layout

      -

      Percentage width of region panel in a layout.

      -
      -
      -
      -

      width: 30%

      -
      -
      -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/full.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/full.html deleted file mode 100644 index c83bf07..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/full.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Full Layout - jQuery EasyUI Demo - - - - - - - -
      north region
      -
      west content
      -
      east region
      -
      south region
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/nestedlayout.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/nestedlayout.html deleted file mode 100644 index 9a346b1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/nestedlayout.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Nested Layout - jQuery EasyUI Demo - - - - - - - -

      Nested Layout

      -

      The layout region panel contains another layout or other components.

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/nocollapsible.html b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/nocollapsible.html deleted file mode 100644 index a6914a0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/nocollapsible.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - No collapsible button in Layout - jQuery EasyUI Demo - - - - - - - -

      No collapsible button in Layout

      -

      The layout region panel has no collapsible button.

      -
      -
      -
      -
      -
      - -
      -
      -
      -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/propertygrid_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/propertygrid_data1.json deleted file mode 100644 index 12b2d00..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/propertygrid_data1.json +++ /dev/null @@ -1,20 +0,0 @@ -{"total":7,"rows":[ - {"name":"Name","value":"Bill Smith","group":"ID Settings","editor":"text"}, - {"name":"Address","value":"","group":"ID Settings","editor":"text"}, - {"name":"Age","value":"40","group":"ID Settings","editor":"numberbox"}, - {"name":"Birthday","value":"01/02/2012","group":"ID Settings","editor":"datebox"}, - {"name":"SSN","value":"123-456-7890","group":"ID Settings","editor":"text"}, - {"name":"Email","value":"bill@gmail.com","group":"Marketing Settings","editor":{ - "type":"validatebox", - "options":{ - "validType":"email" - } - }}, - {"name":"FrequentBuyer","value":"false","group":"Marketing Settings","editor":{ - "type":"checkbox", - "options":{ - "on":true, - "off":false - } - }} -]} \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/tree_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/layout/tree_data1.json deleted file mode 100644 index 83fb0d6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/layout/tree_data1.json +++ /dev/null @@ -1,49 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java", - "attributes":{ - "p1":"Custom Attribute1", - "p2":"Custom Attribute2" - } - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games", - "checked":true - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/basic.html deleted file mode 100644 index 741d68c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/basic.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Basic LinkButton - jQuery EasyUI Demo - - - - - - - -

      Basic LinkButton

      -

      Buttons can be created from <a> or <button> elements.

      -
      -

      Basic Buttons

      -
      - Add - Remove - Save - Cut - Text Button -
      -

      Fixed Width Buttons

      -
      - Search - Print - Reload - Help -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/fluid.html deleted file mode 100644 index b1027b9..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/fluid.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Fluid LinkButton - jQuery EasyUI Demo - - - - - - - -

      Fluid LinkButton

      -

      This example shows how to set the width of LinkButton to a percentage of its parent container.

      -
      -

      width: 15%

      -
      - Add - Remove - Save - Cut - Text Button -
      -

      width: 20%

      -
      - Search - Print - Reload - Help -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/group.html b/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/group.html deleted file mode 100644 index 852db67..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/group.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Button Group - jQuery EasyUI Demo - - - - - - - -

      Button Group

      -

      In a button group only one button can be selected.

      -
      - -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/iconalign.html b/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/iconalign.html deleted file mode 100644 index 99a8ec2..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/iconalign.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Icon Align on LinkButton - jQuery EasyUI Demo - - - - - - - -

      Icon Align on LinkButton

      -

      Change the icon align to place icon on left, right, top or bottom of button.

      -
      -
      - Select Icon Align: - -
      -
      - Add - Remove - Save - Cut -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/plain.html b/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/plain.html deleted file mode 100644 index 0143c20..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/plain.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Plain LinkButton - jQuery EasyUI Demo - - - - - - - -

      Plain LinkButton

      -

      The buttons with plain style have transparent background.

      -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/size.html b/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/size.html deleted file mode 100644 index 265ecb5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/size.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - LinkButton Size - jQuery EasyUI Demo - - - - - - - -

      LinkButton Size

      -

      This sample shows how to display small buttons and large buttons.

      -
      -

      Small Buttons

      -
      - Add - Remove - Save - Cut - Text Button -
      -

      Large Buttons

      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/style.html b/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/style.html deleted file mode 100644 index fd46c2b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/style.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Style LinkButton - jQuery EasyUI Demo - - - - - - - -

      Style LinkButton

      -

      This example shows how to style a linkbutton.

      -
      - - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/toggle.html b/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/toggle.html deleted file mode 100644 index ebab0d1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/linkbutton/toggle.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Toggle Button - jQuery EasyUI Demo - - - - - - - -

      Toggle Button

      -

      Click the button below to switch its selected state.

      -
      -
      - Add - Remove - Save - Cut - Text Button -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/maskedbox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/maskedbox/basic.html deleted file mode 100644 index 8bd9e96..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/maskedbox/basic.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Basic MaskedBox - jQuery EasyUI Demo - - - - - - - -

      Basic MaskedBox

      -

      The maskedbox enforces its structure as the user types.

      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/menu/basic.html deleted file mode 100644 index ac6e171..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/basic.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Basic Menu - jQuery EasyUI Demo - - - - - - - -

      Basic Menu

      -

      Right click on page to display menu.

      -
      - -
      -
      New
      -
      - Open -
      -
      Word
      -
      Excel
      -
      PowerPoint
      -
      - M1 -
      -
      sub1
      -
      sub2
      -
      - Sub -
      -
      sub21
      -
      sub22
      -
      sub23
      -
      -
      -
      sub3
      -
      -
      -
      - Window Demos -
      -
      Window
      -
      Dialog
      - -
      -
      -
      -
      -
      Save
      -
      Print
      - -
      Exit
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/customitem.html b/src/UWE_projectCode/前后端信息交互引用库/demo/menu/customitem.html deleted file mode 100644 index 729fe5e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/customitem.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - Custom Menu Item - jQuery EasyUI Demo - - - - - - - -

      Custom Menu Item

      -

      Right click on page to display menu, move to the 'Open' item to display its custom sub content.

      -
      -
      -
      New
      -
      - Open - -
      -
      Save
      -
      Print
      - -
      Exit
      -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/events.html b/src/UWE_projectCode/前后端信息交互引用库/demo/menu/events.html deleted file mode 100644 index 41f4b57..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/events.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Menu Events - jQuery EasyUI Demo - - - - - - - -

      Menu Events

      -

      Right click on page to display menu and click an item.

      -
      -
      -
      New
      -
      Save
      -
      Print
      - -
      Exit
      -
      -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/inline.html b/src/UWE_projectCode/前后端信息交互引用库/demo/menu/inline.html deleted file mode 100644 index 5fa0d99..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/inline.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Inline Menu - jQuery EasyUI Demo - - - - - - - -

      Inline Menu

      -

      The inline menu stays inside its parent container.

      -
      - -
      -
      -
      New
      -
      - Open -
      -
      Word
      -
      Excel
      -
      PowerPoint
      -
      - M1 -
      -
      sub1
      -
      sub2
      -
      - Sub -
      -
      sub21
      -
      sub22
      -
      sub23
      -
      -
      -
      sub3
      -
      -
      -
      - Window Demos -
      -
      Window
      -
      Dialog
      - -
      -
      -
      -
      -
      Save
      -
      Print
      - -
      Exit
      -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/nav.html b/src/UWE_projectCode/前后端信息交互引用库/demo/menu/nav.html deleted file mode 100644 index c638d7a..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/menu/nav.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - Keyboard Navigation in Menu - jQuery EasyUI Demo - - - - - - - -

      Keyboard Navigation in Menu

      -

      Press Alt+W to focus the menu. Once the menu get focus, you will be able to navigate menu using keyboard keys.

      -
      - -
      -
      -
      New
      -
      - Open -
      -
      Word
      -
      Excel
      -
      PowerPoint
      -
      - M1 -
      -
      sub1
      -
      sub2
      -
      - Sub -
      -
      sub21
      -
      sub22
      -
      sub23
      -
      -
      -
      sub3
      -
      -
      -
      - Window Demos -
      -
      Window
      -
      Dialog
      -
      EasyUI
      -
      -
      -
      -
      -
      Save
      -
      Print
      - -
      Exit
      -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/actions.html b/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/actions.html deleted file mode 100644 index 6623d3d..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/actions.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - MenuButton Actions - jQuery EasyUI Demo - - - - - - - -

      MenuButton Actions

      -

      Click the buttons below to perform actions.

      - -
      - Home - Edit - Help - About -
      -
      -
      Undo
      -
      Redo
      - -
      Cut
      -
      Copy
      -
      Paste
      - -
      - Toolbar -
      -
      Address
      -
      Link
      -
      Navigation Toolbar
      -
      Bookmark Toolbar
      - -
      New Toolbar...
      -
      -
      -
      Delete
      -
      Select All
      -
      -
      -
      Help
      -
      Update
      -
      About
      -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/alignment.html b/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/alignment.html deleted file mode 100644 index 5362745..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/alignment.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - Menu Alignment on MenuButton - jQuery EasyUI Demo - - - - - - - -

      Menu Alignment on MenuButton

      -

      This example shows how to change the alignment of the top level menu.

      -
      - Change Alignment: - -
      -
      - Home - Edit - Help - About - -
      -
      -
      Undo
      -
      Redo
      - -
      Cut
      -
      Copy
      -
      Paste
      - -
      - Toolbar -
      -
      Address
      -
      Link
      -
      Navigation Toolbar
      -
      Bookmark Toolbar
      - -
      New Toolbar...
      -
      -
      -
      Delete
      -
      Select All
      -
      -
      -
      Help
      -
      Update
      -
      About
      -
      -
      -
      History
      -
      Faq
      -
      Our Team
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/basic.html deleted file mode 100644 index e277296..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/basic.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Basic MenuButton - jQuery EasyUI Demo - - - - - - - -

      Basic MenuButton

      -

      Move mouse over the button to drop down menu.

      -
      -
      - Home - Edit - Help - About -
      -
      -
      Undo
      -
      Redo
      - -
      Cut
      -
      Copy
      -
      Paste
      - -
      - Toolbar -
      -
      Address
      -
      Link
      -
      Navigation Toolbar
      -
      Bookmark Toolbar
      - -
      New Toolbar...
      -
      -
      -
      Delete
      -
      Select All
      -
      -
      -
      Help
      -
      Update
      -
      About
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/nav.html b/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/nav.html deleted file mode 100644 index 353041c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/menubutton/nav.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - Keyboard Navigation in MenuButton - jQuery EasyUI Demo - - - - - - - -

      Keyboard Navigation in MenuButton

      -

      Press Alt+W to focus the menubutton. Once the menubutton get focus, you will be able to navigate menubutton using keyboard keys.

      -
      -
      - Home - Edit - Help - About -
      -
      -
      Undo
      -
      Redo
      - -
      Cut
      -
      Copy
      -
      Paste
      - -
      - Toolbar -
      -
      Address
      -
      Link
      -
      Navigation Toolbar
      -
      Bookmark Toolbar
      - -
      New Toolbar...
      -
      -
      -
      Delete
      -
      Select All
      -
      -
      -
      Help
      -
      Update
      -
      About
      -
      - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/alert.html b/src/UWE_projectCode/前后端信息交互引用库/demo/messager/alert.html deleted file mode 100644 index ff7129d..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/alert.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Alert Messager - jQuery EasyUI Demo - - - - - - - -

      Alert Messager

      -

      Click on each button to display different alert message box.

      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/messager/basic.html deleted file mode 100644 index 373c7ca..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/basic.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - Basic Messager - jQuery EasyUI Demo - - - - - - - -

      Basic Messager

      -

      Click on each button to see a distinct message box.

      -
      - Show - Slide - Fade - Progress -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/interactive.html b/src/UWE_projectCode/前后端信息交互引用库/demo/messager/interactive.html deleted file mode 100644 index 9ba70bf..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/interactive.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - Interactive Messager - jQuery EasyUI Demo - - - - - - - -

      Interactive Messager

      -

      Click on each button to display interactive message box.

      -
      - Confirm - Prompt -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/position.html b/src/UWE_projectCode/前后端信息交互引用库/demo/messager/position.html deleted file mode 100644 index 58886f1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/position.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - Message Box Position - jQuery EasyUI Demo - - - - - - - -

      Message Box Position

      -

      Click the buttons below to display message box on different position.

      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/tip.html b/src/UWE_projectCode/前后端信息交互引用库/demo/messager/tip.html deleted file mode 100644 index b5a821c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/messager/tip.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - Tip Messager - jQuery EasyUI Demo - - - - - - - -

      Tip Messager

      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/basic.html deleted file mode 100644 index 1bd72ec..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/basic.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Basic NumberBox - jQuery EasyUI Demo - - - - - - - -

      Basic NumberBox

      -

      The NumberBox can only accept inputing numbers.

      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/fluid.html deleted file mode 100644 index 1c10a81..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/fluid.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Fluid NumberBox - jQuery EasyUI Demo - - - - - - - -

      Fluid NumberBox

      -

      This example shows how to set the width of NumberBox to a percentage of its parent container.

      -
      -
      -
      - -
      -
      - -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/format.html b/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/format.html deleted file mode 100644 index d4dadb9..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/format.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Format NumberBox - jQuery EasyUI Demo - - - - - - - -

      Format NumberBox

      -

      Number formatting is the ability to control how a number is displayed.

      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/range.html b/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/range.html deleted file mode 100644 index 30be312..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/numberbox/range.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Number Range - jQuery EasyUI Demo - - - - - - - -

      Number Range

      -

      The value is constrained to a specified range.

      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/align.html b/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/align.html deleted file mode 100644 index 5323b0e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/align.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Number Spin Alignment - jQuery EasyUI Demo - - - - - - - -

      Number Spin Alignment

      -

      This example shows how to set different spin alignments on numberspinner.

      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/basic.html deleted file mode 100644 index e50660c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/basic.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Basic NumberSpinner - jQuery EasyUI Demo - - - - - - - -

      Basic NumberSpinner

      -

      Click spinner button to change value.

      -
      -
      - -
      - Value: -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/fluid.html deleted file mode 100644 index a1d436c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid NumberSpinner - jQuery EasyUI Demo - - - - - - - -

      Fluid NumberSpinner

      -

      This example shows how to set the width of NumberSpinner to a percentage of its parent container.

      -
      -
      -
      - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/increment.html b/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/increment.html deleted file mode 100644 index ea30ba3..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/increment.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Increment Number - jQuery EasyUI Demo - - - - - - - -

      Increment Number

      -

      The sample shows how to set the increment step.

      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/range.html b/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/range.html deleted file mode 100644 index 1345a38..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/numberspinner/range.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Number Range - jQuery EasyUI Demo - - - - - - - -

      Number Range

      -

      The value is constrained to a range between 10 and 100.

      -
      -
      -
      - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/attaching.html b/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/attaching.html deleted file mode 100644 index 5c87427..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/attaching.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Attaching Other Components - jQuery EasyUI Demo - - - - - - - -

      Attaching Other Components

      -

      Any other components can be attached to page bar.

      -
      -
      -
      -
      -
      - - - - - -
      - - - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/basic.html deleted file mode 100644 index 98f7c49..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/basic.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Basic Pagination - jQuery EasyUI Demo - - - - - - - -

      Basic Pagination

      -

      The user can change page number and page size on page bar.

      -
      -
      -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/custombuttons.html b/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/custombuttons.html deleted file mode 100644 index 2a75b88..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/custombuttons.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - Custom Pagination Buttons - jQuery EasyUI Demo - - - - - - - -

      Custom Pagination Buttons

      -

      The customized buttons can be appended to page bar.

      -
      -
      -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/layout.html b/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/layout.html deleted file mode 100644 index 58125ae..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/layout.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Pagination Layout - jQuery EasyUI Demo - - - - - - - -

      Pagination Layout

      -

      The pagination layout supports various types of pages which you can choose.

      -
      -
      -
      -
      -
      - -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/links.html b/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/links.html deleted file mode 100644 index 7702f91..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/links.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Pagination Links - jQuery EasyUI Demo - - - - - - - -

      Pagination Links

      -

      The example shows how to customize numbered pagination links.

      -
      -
      -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/simple.html b/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/simple.html deleted file mode 100644 index 478d094..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/pagination/simple.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Simplify Pagination - jQuery EasyUI Demo - - - - - - - -

      Simplify Pagination

      -

      The sample shows how to simplify pagination.

      -
      -
      -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/_content.html b/src/UWE_projectCode/前后端信息交互引用库/demo/panel/_content.html deleted file mode 100644 index f7b8e2e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

      Here is the content loaded via AJAX.

      -
        -
      • easyui is a collection of user-interface plugin based on jQuery.
      • -
      • easyui provides essential functionality for building modern, interactive, javascript applications.
      • -
      • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
      • -
      • complete framework for HTML5 web page.
      • -
      • easyui save your time and scales while developing your products.
      • -
      • easyui is very easy but powerful.
      • -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/panel/basic.html deleted file mode 100644 index e2220df..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/basic.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Basic Panel - jQuery EasyUI Demo - - - - - - - -

      Basic Panel

      -

      The panel is a container for other components or elements.

      -
      - Open - Close -
      -
      -

      jQuery EasyUI framework helps you build your web pages easily.

      -
        -
      • easyui is a collection of user-interface plugin based on jQuery.
      • -
      • easyui provides essential functionality for building modem, interactive, javascript applications.
      • -
      • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
      • -
      • complete framework for HTML5 web page.
      • -
      • easyui save your time and scales while developing your products.
      • -
      • easyui is very easy but powerful.
      • -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/customtools.html b/src/UWE_projectCode/前后端信息交互引用库/demo/panel/customtools.html deleted file mode 100644 index 299b7fa..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/customtools.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Custom Panel Tools - jQuery EasyUI Demo - - - - - - - -

      Custom Panel Tools

      -

      Click the right top buttons to perform actions with panel.

      -
      -
      -

      jQuery EasyUI framework helps you build your web pages easily.

      -
        -
      • easyui is a collection of user-interface plugin based on jQuery.
      • -
      • easyui provides essential functionality for building modem, interactive, javascript applications.
      • -
      • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
      • -
      • complete framework for HTML5 web page.
      • -
      • easyui save your time and scales while developing your products.
      • -
      • easyui is very easy but powerful.
      • -
      -
      -
      - - - - -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/panel/fluid.html deleted file mode 100644 index ff2be88..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/fluid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Fluid Panel - jQuery EasyUI Demo - - - - - - - -

      Fluid Panel

      -

      This example shows how to set the width of Panel to a percentage of its parent container.

      -
      -
      -
      -

      The panel has a width of 100%.

      -

      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/footer.html b/src/UWE_projectCode/前后端信息交互引用库/demo/panel/footer.html deleted file mode 100644 index e04a87b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/footer.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Panel Footer - jQuery EasyUI Demo - - - - - - - -

      Panel Footer

      -

      The panel footer is displayed at the bottom of the panel and can consist of any other components.

      -
      -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/halign.html b/src/UWE_projectCode/前后端信息交互引用库/demo/panel/halign.html deleted file mode 100644 index 6bdfc9f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/halign.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Panel Header Alignment - jQuery EasyUI Demo - - - - - - - -

      Panel Header Alignment

      -

      The panel header can be aligned horizontally or vertically.

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/loadcontent.html b/src/UWE_projectCode/前后端信息交互引用库/demo/panel/loadcontent.html deleted file mode 100644 index c4b1417..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/loadcontent.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Load Panel Content - jQuery EasyUI Demo - - - - - - - -

      Load Panel Content

      -

      Click the refresh button on top right of panel to load content.

      -
      -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/nestedpanel.html b/src/UWE_projectCode/前后端信息交互引用库/demo/panel/nestedpanel.html deleted file mode 100644 index a2c1320..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/nestedpanel.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Nested Panel - jQuery EasyUI Demo - - - - - - - -

      Nested Panel

      -

      The panel can be placed inside containers and can contain other components.

      -
      -
      -
      -
      - Left Content -
      -
      - Right Content -
      -
      - Center Content -
      -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/paneltools.html b/src/UWE_projectCode/前后端信息交互引用库/demo/panel/paneltools.html deleted file mode 100644 index eb0d87f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/panel/paneltools.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Panel Tools - jQuery EasyUI Demo - - - - - - - -

      Panel Tools

      -

      Click the right top buttons to perform actions with panel.

      - -
      -
      -

      jQuery EasyUI framework helps you build your web pages easily.

      -
        -
      • easyui is a collection of user-interface plugin based on jQuery.
      • -
      • easyui provides essential functionality for building modem, interactive, javascript applications.
      • -
      • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
      • -
      • complete framework for HTML5 web page.
      • -
      • easyui save your time and scales while developing your products.
      • -
      • easyui is very easy but powerful.
      • -
      -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/basic.html deleted file mode 100644 index f725bc0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic PasswordBox - jQuery EasyUI Demo - - - - - - - -

      Basic PasswordBox

      -

      The passwordbox allows a user to enter passwords.

      -
      -
      -
      - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/flash.html b/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/flash.html deleted file mode 100644 index 391a09c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/flash.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Flash PasswordBox Letters - jQuery EasyUI Demo - - - - - - - -

      Flash PasswordBox Letters

      -

      This example shows how to flash the entered password letter by letter.

      -
      -
      -
      - -
      -
      - -
      -
      -
      - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/test.html b/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/test.html deleted file mode 100644 index 61164e0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/test.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Basic PasswordBox - jQuery EasyUI Demo - - - - - - - - - -

      Basic PasswordBox

      -

      The passwordbox allows a user to enter passwords.

      -
      -
      -
      - -
      -
      - - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/validatepassword.html b/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/validatepassword.html deleted file mode 100644 index 630dbc7..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/passwordbox/validatepassword.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Validate Password - jQuery EasyUI Demo - - - - - - - -

      Validate Password

      -

      This example shows how to validate whether a user enters the same password.

      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/progressbar/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/progressbar/basic.html deleted file mode 100644 index 910777b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/progressbar/basic.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Basic ProgressBar - jQuery EasyUI Demo - - - - - - - -

      Basic ProgressBar

      -

      Click the button below to show progress information.

      -
      - Start -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/progressbar/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/progressbar/fluid.html deleted file mode 100644 index de88af2..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/progressbar/fluid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Fluid ProgressBar - jQuery EasyUI Demo - - - - - - - -

      Fluid ProgressBar

      -

      This example shows how to set the width of ProgressBar to a percentage of its parent container.

      -
      -

      width: 50%

      -
      -

      width: 30%

      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/basic.html deleted file mode 100644 index a7c3cb5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/basic.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Basic PropertyGrid - jQuery EasyUI Demo - - - - - - - -

      Basic PropertyGrid

      -

      Click on row to change each property value.

      - - -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/customcolumns.html b/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/customcolumns.html deleted file mode 100644 index a8aabd3..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/customcolumns.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Customize Columns of PropertyGrid - jQuery EasyUI Demo - - - - - - - -

      Customize Columns of PropertyGrid

      -

      The columns of PropertyGrid can be changed.

      -
      - -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/groupformat.html b/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/groupformat.html deleted file mode 100644 index 27cc305..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/groupformat.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Group Format - jQuery EasyUI Demo - - - - - - - -

      Group Format

      -

      The user can change the group information.

      -
      - -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/propertygrid_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/propertygrid_data1.json deleted file mode 100644 index 12b2d00..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/propertygrid/propertygrid_data1.json +++ /dev/null @@ -1,20 +0,0 @@ -{"total":7,"rows":[ - {"name":"Name","value":"Bill Smith","group":"ID Settings","editor":"text"}, - {"name":"Address","value":"","group":"ID Settings","editor":"text"}, - {"name":"Age","value":"40","group":"ID Settings","editor":"numberbox"}, - {"name":"Birthday","value":"01/02/2012","group":"ID Settings","editor":"datebox"}, - {"name":"SSN","value":"123-456-7890","group":"ID Settings","editor":"text"}, - {"name":"Email","value":"bill@gmail.com","group":"Marketing Settings","editor":{ - "type":"validatebox", - "options":{ - "validType":"email" - } - }}, - {"name":"FrequentBuyer","value":"false","group":"Marketing Settings","editor":{ - "type":"checkbox", - "options":{ - "on":true, - "off":false - } - }} -]} \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/radiobutton/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/radiobutton/basic.html deleted file mode 100644 index 13dd623..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/radiobutton/basic.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Basic RadioButton - jQuery EasyUI Demo - - - - - - - -

      Basic RadioButton

      -
      -
      - -
      -
      - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/radiogroup/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/radiogroup/basic.html deleted file mode 100644 index dd7881c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/radiogroup/basic.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Basic RadioGroup - jQuery EasyUI Demo - - - - - - - -

      Basic RadioGroup

      -
      -
      -
      -
      -
      -
      -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/resizable/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/resizable/basic.html deleted file mode 100644 index a4d5a61..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/resizable/basic.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Basic Resizable - jQuery EasyUI Demo - - - - - - - -

      Basic Resizable

      -

      Click on the edge of box and move the edge to resize the box.

      -
      -
      -
      Resize Me
      -
      -
      -
      Title
      -
      Drag and Resize Me
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/basic.html deleted file mode 100644 index 5566cc4..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic SearchBox - jQuery EasyUI Demo - - - - - - - -

      Basic SearchBox

      -

      Click search button or press enter key in input box to do searching.

      -
      -
      - -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/category.html b/src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/category.html deleted file mode 100644 index 740fcd5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/category.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Search Category - jQuery EasyUI Demo - - - - - - - -

      Search Category

      -

      Select a category and click search button or press enter key in input box to do searching.

      -
      -
      - -
      -
      -
      All News
      -
      Sports News
      -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/fluid.html deleted file mode 100644 index c8d0e39..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/searchbox/fluid.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Fluid SearchBox - jQuery EasyUI Demo - - - - - - - -

      Fluid SearchBox

      -

      This example shows how to set the width of SearchBox to a percentage of its parent container.

      -
      -
      -
      - -
      -
      - -
      -
      -
      -
      All News
      -
      Sports News
      -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/basic.html deleted file mode 100644 index 747170a..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/basic.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Basic SideMenu - jQuery EasyUI Demo - - - - - - - -

      Basic SideMenu

      -

      Collapse the side menu to display the main icon.

      -
      - Toggle -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/sidemenu_style.css b/src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/sidemenu_style.css deleted file mode 100644 index 6ae84e1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/sidemenu_style.css +++ /dev/null @@ -1,63 +0,0 @@ -@import 'http://netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'; - -.sidemenu .accordion .panel-title{ - color: #b8c7ce; -} -.sidemenu .accordion .accordion-header{ - background: #222d32; - color: #b8c7ce; -} -.sidemenu .accordion .accordion-body{ - background: #2c3b41; - color: #8aa4af; -} -.sidemenu .accordion .accordion-header-selected{ - background: #1e282c; -} -.sidemenu .accordion .accordion-collapse{ - background: transparent; -} -.sidemenu .tree-node-hover{ - background: #2c3b41; - color: #fff; -} -.sidemenu .tree-node-selected{ - background: #2c3b41; - color: #fff; -} -.sidemenu .accordion-header .panel-icon{ - font-size: 16px; -} -.sidemenu .accordion-header .panel-tool{ - display: none; -} -.sidemenu .accordion-header::after, -.sidemenu .tree-node-nonleaf::after{ - display: inline-block; - vertical-align: top; - border-style: solid; - transform:rotate(45deg); - width: 4px; - height: 4px; - content: ''; - position: absolute; - right: 10px; - top: 50%; - margin-top: -3px; - border-width: 0 1px 1px 0; -} -.sidemenu .accordion-header-selected::after{ - transform:rotate(-135deg); -} -.sidemenu .tree-node-nonleaf::after{ - transform:rotate(-135deg); -} -.sidemenu .tree-node-nonleaf-collapsed::after{ - transform:rotate(45deg); -} -.sidemenu-collapsed .accordion-header::after{ - display: none; -} -.sidemenu-tooltip .accordion{ - border-color: #1e282c; -} \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/style.html b/src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/style.html deleted file mode 100644 index cc68ffa..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/sidemenu/style.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - SideMenu Style - jQuery EasyUI Demo - - - - - - - -

      SideMenu Style

      -

      Collapse the side menu to display the main icon.

      -
      - Toggle -
      -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/slider/basic.html deleted file mode 100644 index e2a0f59..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/basic.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - Basic Slider - jQuery EasyUI Demo - - - - - - - -

      Basic Slider

      -

      Drag the slider to change value.

      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/slider/fluid.html deleted file mode 100644 index 17ff2dd..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/fluid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Fluid Slider - jQuery EasyUI Demo - - - - - - - -

      Fluid Slider

      -

      This example shows how to set the width of Slider to a percentage of its parent container.

      -
      -

      width: 50%

      - -

      width: 30%

      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/formattip.html b/src/UWE_projectCode/前后端信息交互引用库/demo/slider/formattip.html deleted file mode 100644 index f0d666b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/formattip.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Format Tip Information - jQuery EasyUI Demo - - - - - - - -

      Format Tip Information

      -

      This sample shows how to format tip information.

      -
      - -
      jQuery EasyUI
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/nonlinear.html b/src/UWE_projectCode/前后端信息交互引用库/demo/slider/nonlinear.html deleted file mode 100644 index 7570833..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/nonlinear.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Non Linear Slider - jQuery EasyUI Demo - - - - - - - -

      Non Linear Slider

      -

      This example shows how to create a slider with a non-linear scale.

      -
      -
      - -
      -
      -
      -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/range.html b/src/UWE_projectCode/前后端信息交互引用库/demo/slider/range.html deleted file mode 100644 index a994e57..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/range.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Range Slider - jQuery EasyUI Demo - - - - - - - -

      Range Slider

      -

      This sample shows how to define a range slider.

      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/rule.html b/src/UWE_projectCode/前后端信息交互引用库/demo/slider/rule.html deleted file mode 100644 index 6f0e08c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/rule.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Slider Rule - jQuery EasyUI Demo - - - - - - - -

      Slider Rule

      -

      This sample shows how to define slider rule.

      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/vertical.html b/src/UWE_projectCode/前后端信息交互引用库/demo/slider/vertical.html deleted file mode 100644 index 6bc8b59..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/slider/vertical.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Vertical Slider - jQuery EasyUI Demo - - - - - - - -

      Vertical Slider

      -

      This sample shows how to create a vertical slider.

      -
      -
      - -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/splitbutton/actions.html b/src/UWE_projectCode/前后端信息交互引用库/demo/splitbutton/actions.html deleted file mode 100644 index 0fa343e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/splitbutton/actions.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - SplitButton Actions - jQuery EasyUI Demo - - - - - - - -

      SplitButton Actions

      -

      Click the buttons below to perform actions.

      - -
      - Home - Edit - Ok - Help -
      -
      -
      Undo
      -
      Redo
      - -
      Cut
      -
      Copy
      -
      Paste
      - -
      - Toolbar -
      -
      Address
      -
      Link
      -
      Navigation Toolbar
      -
      Bookmark Toolbar
      - -
      New Toolbar...
      -
      -
      -
      Delete
      -
      Select All
      -
      -
      -
      Ok
      -
      Cancel
      -
      -
      -
      Help
      -
      Update
      -
      - About - -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/splitbutton/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/splitbutton/basic.html deleted file mode 100644 index 2f31ec1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/splitbutton/basic.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Basic SplitButton - jQuery EasyUI Demo - - - - - - - -

      Basic SplitButton

      -

      Move mouse over the arrow area of button to drop down menu.

      -
      -
      - Home - Edit - Ok - Help -
      -
      -
      Undo
      -
      Redo
      - -
      Cut
      -
      Copy
      -
      Paste
      - -
      - Toolbar -
      -
      Address
      -
      Link
      -
      Navigation Toolbar
      -
      Bookmark Toolbar
      - -
      New Toolbar...
      -
      -
      -
      Delete
      -
      Select All
      -
      -
      -
      Ok
      -
      Cancel
      -
      -
      -
      Help
      -
      Update
      -
      - About - -
      -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/switchbutton/action.html b/src/UWE_projectCode/前后端信息交互引用库/demo/switchbutton/action.html deleted file mode 100644 index 0a6e197..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/switchbutton/action.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - SwitchButton Actions - jQuery EasyUI Demo - - - - - - - -

      SwitchButton Actions

      -

      Click the buttons below to perform actions.

      -
      - -
      - Disable - Enable -
      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/switchbutton/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/switchbutton/basic.html deleted file mode 100644 index 7aa304e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/switchbutton/basic.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Basic SwitchButton - jQuery EasyUI Demo - - - - - - - -

      Basic SwitchButton

      -

      Click the switchbutton to change its state.

      -
      -
      - -
      -
      - -
      -
      - -
      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/_content.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/_content.html deleted file mode 100644 index f7b8e2e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

      Here is the content loaded via AJAX.

      -
        -
      • easyui is a collection of user-interface plugin based on jQuery.
      • -
      • easyui provides essential functionality for building modern, interactive, javascript applications.
      • -
      • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
      • -
      • complete framework for HTML5 web page.
      • -
      • easyui save your time and scales while developing your products.
      • -
      • easyui is very easy but powerful.
      • -
      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/autoheight.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/autoheight.html deleted file mode 100644 index e34a3dc..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/autoheight.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - Auto Height for Tabs - jQuery EasyUI Demo - - - - - - - -

      Auto Height for Tabs

      -

      The tabs height is auto adjusted according to tab panel content.

      -
      -
      -
      -

      jQuery EasyUI framework helps you build your web pages easily.

      -
        -
      • easyui is a collection of user-interface plugin based on jQuery.
      • -
      • easyui provides essential functionality for building modem, interactive, javascript applications.
      • -
      • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
      • -
      • complete framework for HTML5 web page.
      • -
      • easyui save your time and scales while developing your products.
      • -
      • easyui is very easy but powerful.
      • -
      -
      -
      -
        -
        -
        - This is the help content. -
        -
        - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/basic.html deleted file mode 100644 index 293b91c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/basic.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - Basic Tabs - jQuery EasyUI Demo - - - - - - - -

        Basic Tabs

        -

        Click tab strip to swap tab panel content.

        -
        -
        -
        -

        jQuery EasyUI framework helps you build your web pages easily.

        -
          -
        • easyui is a collection of user-interface plugin based on jQuery.
        • -
        • easyui provides essential functionality for building modem, interactive, javascript applications.
        • -
        • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
        • -
        • complete framework for HTML5 web page.
        • -
        • easyui save your time and scales while developing your products.
        • -
        • easyui is very easy but powerful.
        • -
        -
        -
        -
          -
          -
          - This is the help content. -
          -
          - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/dropdown.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/dropdown.html deleted file mode 100644 index ed4ceb1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/dropdown.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Tabs with DropDown - jQuery EasyUI Demo - - - - - - - -

          Tabs with DropDown

          -

          This sample shows how to add a dropdown menu over a tab strip.

          -
          -
          -
          -

          jQuery EasyUI framework helps you build your web pages easily.

          -
            -
          • easyui is a collection of user-interface plugin based on jQuery.
          • -
          • easyui provides essential functionality for building modem, interactive, javascript applications.
          • -
          • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
          • -
          • complete framework for HTML5 web page.
          • -
          • easyui save your time and scales while developing your products.
          • -
          • easyui is very easy but powerful.
          • -
          -
          -
          -
            -
            -
            - This is the help content. -
            -
            -
            -
            Welcome
            -
            Help Contents
            -
            Search
            -
            Dynamic Help
            -
            - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/fixedwidth.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/fixedwidth.html deleted file mode 100644 index 390e987..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/fixedwidth.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Fixed Tab Width - jQuery EasyUI Demo - - - - - - - -

            Fixed Tab Width

            -

            The tab strips have fixed width and height.

            -
            -
            -
            -

            Home Content.

            -
            -
            -

            Maps Content.

            -
            -
            -

            Journal Content.

            -
            -
            -

            History Content.

            -
            -
            -

            References Content.

            -
            -
            -

            Contact Content.

            -
            -
            - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/fluid.html deleted file mode 100644 index d31d6fb..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/fluid.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Fluid Tabs - jQuery EasyUI Demo - - - - - - - -

            Fluid Tabs

            -

            This example shows how to set the width of Tabs to a percentage of its parent container.

            -
            -
            -
            -

            The tabs has a width of 100%.

            -
            -
            -
            -
            - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/hover.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/hover.html deleted file mode 100644 index 5b62ac9..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/hover.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Hover Tabs - jQuery EasyUI Demo - - - - - - - -

            Hover Tabs

            -

            Move mouse over the tab strip to open the tab panel.

            -
            -
            -
            -

            jQuery EasyUI framework helps you build your web pages easily.

            -
              -
            • easyui is a collection of user-interface plugin based on jQuery.
            • -
            • easyui provides essential functionality for building modem, interactive, javascript applications.
            • -
            • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
            • -
            • complete framework for HTML5 web page.
            • -
            • easyui save your time and scales while developing your products.
            • -
            • easyui is very easy but powerful.
            • -
            -
            -
            -
              -
              -
              - This is the help content. -
              -
              - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/images/modem.png b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/images/modem.png deleted file mode 100644 index be5a2eb2fc48a8f16681b591f4ef74888ee09c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1633 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 A&;S4c diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/images/tablet.png b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/images/tablet.png deleted file mode 100644 index fa871f54035fcd0bb0f7f2068d2b2ed4e5e0e0cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 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 - - - - Nested Tabs - jQuery EasyUI Demo - - - - - - - -

              Nested Tabs

              -

              The tab panel can contain sub tabs or other components.

              -
              -
              -
              -
              -
              Content 1
              -
              Content 2
              -
              Content 3
              -
              -
              -
              -
              - -
              -
              - - - - - - - - - - - - - - - - - - - - -
              Title1Title2Title3
              d11d12d13
              d21d22d23
              -
              -
              - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/striptools.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/striptools.html deleted file mode 100644 index 83e6ba0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/striptools.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Tabs Strip Tools - jQuery EasyUI Demo - - - - - - - -

              Tabs Strip Tools

              -

              Click the mini-buttons on the tab strip to perform actions.

              -
              -
              -
              -

              jQuery EasyUI framework helps you build your web pages easily.

              -
                -
              • easyui is a collection of user-interface plugin based on jQuery.
              • -
              • easyui provides essential functionality for building modem, interactive, javascript applications.
              • -
              • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
              • -
              • complete framework for HTML5 web page.
              • -
              • easyui save your time and scales while developing your products.
              • -
              • easyui is very easy but powerful.
              • -
              -
              -
              - This is the help content. -
              -
              -
              - - - -
              - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/style.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/style.html deleted file mode 100644 index f27eae1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/style.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - Tabs Style - jQuery EasyUI Demo - - - - - - - -

              Tabs Style

              -

              Click the options below to change the tabs style.

              -
              - plain
              - narrow
              - pill
              - justified -
              -
              -
              -

              jQuery EasyUI framework helps you build your web pages easily.

              -
                -
              • easyui is a collection of user-interface plugin based on jQuery.
              • -
              • easyui provides essential functionality for building modem, interactive, javascript applications.
              • -
              • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
              • -
              • complete framework for HTML5 web page.
              • -
              • easyui save your time and scales while developing your products.
              • -
              • easyui is very easy but powerful.
              • -
              -
              -
              -
                -
                -
                - This is the help content. -
                -
                - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabimage.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabimage.html deleted file mode 100644 index e9df65d..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabimage.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Tabs with Images - jQuery EasyUI Demo - - - - - - - -

                Tabs with Images

                -

                The tab strip can display big images.

                -
                -
                -
                -

                A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.

                -
                -
                -

                In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.

                -
                -
                -

                A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.

                -
                -
                -

                A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

                -
                -
                - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabposition.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabposition.html deleted file mode 100644 index 9f1bc19..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabposition.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Tab Position - jQuery EasyUI Demo - - - - - - - -

                Tab Position

                -

                Click the 'position' drop-down list and select an item to change the tab position.

                -
                - Position: - -
                -
                -
                -

                jQuery EasyUI framework helps you build your web pages easily.

                -
                  -
                • easyui is a collection of user-interface plugin based on jQuery.
                • -
                • easyui provides essential functionality for building modem, interactive, javascript applications.
                • -
                • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                • -
                • complete framework for HTML5 web page.
                • -
                • easyui save your time and scales while developing your products.
                • -
                • easyui is very easy but powerful.
                • -
                -
                -
                -
                  -
                  -
                  - This is the help content. -
                  -
                  - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabstools.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabstools.html deleted file mode 100644 index 48bdda8..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tabstools.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Tabs Tools - jQuery EasyUI Demo - - - - - - - -

                  Tabs Tools

                  -

                  Click the buttons on the top right of tabs header to add or remove tab panel.

                  -
                  -
                  -
                  -
                  - - -
                  - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tree_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tree_data1.json deleted file mode 100644 index 83fb0d6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tabs/tree_data1.json +++ /dev/null @@ -1,49 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java", - "attributes":{ - "p1":"Custom Attribute1", - "p2":"Custom Attribute2" - } - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games", - "checked":true - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/autocomplete.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/autocomplete.html deleted file mode 100644 index 95295e5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/autocomplete.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - TagBox with Autocomplete - jQuery EasyUI Demo - - - - - - - -

                  TagBox with Autocomplete

                  -

                  The autocomplete is the built-in feature that allows the user to select a value from the drop-down list.

                  -
                  -
                  - -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/basic.html deleted file mode 100644 index 376bdb0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/basic.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Basic TagBox - jQuery EasyUI Demo - - - - - - - -

                  Basic TagBox

                  -

                  The TagBox is created from a simple input element.

                  -
                  -
                  - -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/button.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/button.html deleted file mode 100644 index c7d0c88..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/button.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - TagBox with Button - jQuery EasyUI Demo - - - - - - - -

                  TagBox with Button

                  -

                  The button can be attached to a tagbox.

                  -
                  -
                  - -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/format.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/format.html deleted file mode 100644 index 0a441bd..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/format.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Format TagBox - jQuery EasyUI Demo - - - - - - - -

                  Format TagBox

                  -

                  This example shows how to format the tagbox values.

                  -
                  -
                  - -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/style.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/style.html deleted file mode 100644 index 51fcc66..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/style.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Custom TagBox Style - jQuery EasyUI Demo - - - - - - - -

                  Custom TagBox Style

                  -

                  This example shows how to apply different CSS styles to different tags.

                  -
                  -
                  - -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/tagbox_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/tagbox_data1.json deleted file mode 100644 index b026b62..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/tagbox_data1.json +++ /dev/null @@ -1,21 +0,0 @@ -[{ - "id":"1", - "text":"Java", - "desc":"Write once, run anywhere" -},{ - "id":"2", - "text":"C#", - "desc":"One of the programming languages designed for the Common Language Infrastructure" -},{ - "id":"3", - "text":"Ruby", - "desc":"A dynamic, reflective, general-purpose object-oriented programming language" -},{ - "id":"4", - "text":"Perl", - "desc":"A high-level, general-purpose, interpreted, dynamic programming language" -},{ - "id":"5", - "text":"Basic", - "desc":"A family of general-purpose, high-level programming languages" -}] \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/validate.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/validate.html deleted file mode 100644 index 1a56e56..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tagbox/validate.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Validate TagBox - jQuery EasyUI Demo - - - - - - - -

                  Validate TagBox

                  -

                  This example shows how to validate the tagbox values.

                  -
                  -
                  - -
                  - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/basic.html deleted file mode 100644 index d7f9332..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/basic.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Basic TextBox - jQuery EasyUI Demo - - - - - - - -

                  Basic TextBox

                  -

                  The textbox allows a user to enter information.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - -
                  -
                  - -
                  - -
                  - Register -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/button.html b/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/button.html deleted file mode 100644 index bc78b1f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/button.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - TextBox with Button - jQuery EasyUI Demo - - - - - - - -

                  TextBox with Button

                  -

                  The button can be attached to a textbox.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/clearicon.html b/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/clearicon.html deleted file mode 100644 index 94a0ee1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/clearicon.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - TextBox with Clear Icon - jQuery EasyUI Demo - - - - - - - -

                  TextBox with Clear Icon

                  -

                  This example shows how to create an textbox with an icon to clear the input element itself.

                  -
                  -
                  -
                  - -
                  -
                  - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/custom.html b/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/custom.html deleted file mode 100644 index b4cf182..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/custom.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Custom TextBox - jQuery EasyUI Demo - - - - - - - -

                  Custom TextBox

                  -

                  This example shows how to custom a login form.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - - Remember me -
                  - -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/fluid.html deleted file mode 100644 index 1c62dc2..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid TextBox - jQuery EasyUI Demo - - - - - - - -

                  Fluid TextBox

                  -

                  This example shows how to set the width of TextBox to a percentage of its parent container.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/icons.html b/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/icons.html deleted file mode 100644 index 10a9653..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/icons.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - TextBox with Icons - jQuery EasyUI Demo - - - - - - - -

                  TextBox with Icons

                  -

                  Click the icons on textbox to perform actions.

                  -
                  -
                  - Select Icon Align: - -
                  -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/multiline.html b/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/multiline.html deleted file mode 100644 index f56b4e5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/multiline.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Multiline TextBox - jQuery EasyUI Demo - - - - - - - -

                  Multiline TextBox

                  -

                  This example shows how to define a textbox for the user to enter multi-line text input.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/size.html b/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/size.html deleted file mode 100644 index 12e17dc..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/textbox/size.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - TextBox Size - jQuery EasyUI Demo - - - - - - - -

                  TextBox Size

                  -

                  The textbox can vary in size.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/timepicker/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/timepicker/basic.html deleted file mode 100644 index 72ac065..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/timepicker/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic TimePicker - jQuery EasyUI Demo - - - - - - - -

                  Basic TimePicker

                  -

                  Click drop-down button to choose time on a clock.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/timepicker/hour24.html b/src/UWE_projectCode/前后端信息交互引用库/demo/timepicker/hour24.html deleted file mode 100644 index d98743c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/timepicker/hour24.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - TimePicker 24 Hour Format - jQuery EasyUI Demo - - - - - - - - -

                  TimePicker 24 Hour Format

                  -

                  Click drop-down button to choose time on a clock.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/actions.html b/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/actions.html deleted file mode 100644 index 79b0755..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/actions.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - TimeSpinner Actions - jQuery EasyUI Demo - - - - - - - -

                  TimeSpinner Actions

                  -

                  Click the buttons below to perform actions.

                  - -
                  -
                  - -
                  -
                  - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/basic.html deleted file mode 100644 index 2a3601b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic TimeSpinner - jQuery EasyUI Demo - - - - - - - -

                  Basic TimeSpinner

                  -

                  Click spin button to adjust time.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/fluid.html deleted file mode 100644 index 6317491..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid TimeSpinner - jQuery EasyUI Demo - - - - - - - -

                  Fluid TimeSpinner

                  -

                  This example shows how to set the width of TimeSpinner to a percentage of its parent container.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/hour12.html b/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/hour12.html deleted file mode 100644 index 8901851..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/hour12.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - 12 Hour Format - jQuery EasyUI Demo - - - - - - - -

                  12 Hour Format

                  -

                  Displays in a 12 hour format.

                  -
                  -
                  -
                  - -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/range.html b/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/range.html deleted file mode 100644 index 02a1338..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/timespinner/range.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Time Range - jQuery EasyUI Demo - - - - - - - -

                  Time Range

                  -

                  The time value is constrained in specified range.

                  -
                  - From 08:30 to 18:00 -
                  -
                  -
                  - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/_content.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/_content.html deleted file mode 100644 index f7b8e2e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

                  Here is the content loaded via AJAX.

                  -
                    -
                  • easyui is a collection of user-interface plugin based on jQuery.
                  • -
                  • easyui provides essential functionality for building modern, interactive, javascript applications.
                  • -
                  • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                  • -
                  • complete framework for HTML5 web page.
                  • -
                  • easyui save your time and scales while developing your products.
                  • -
                  • easyui is very easy but powerful.
                  • -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/_dialog.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/_dialog.html deleted file mode 100644 index 2c1b464..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/_dialog.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Dialog Content - - -
                  -
                  -
                  User Name:
                  - -
                  -
                  -
                  Password:
                  - -
                  -
                  - Login - Cancel -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/ajax.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/ajax.html deleted file mode 100644 index 2de45de..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/ajax.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Ajax Tooltip - jQuery EasyUI Demo - - - - - - - -

                  Ajax Tooltip

                  -

                  The tooltip content can be loaded via AJAX.

                  -
                  - Hove me to display tooltip content via AJAX. - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/basic.html deleted file mode 100644 index b9ad0e0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/basic.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Basic Tooltip - jQuery EasyUI Demo - - - - - - - -

                  Basic Tooltip

                  -

                  Hover the links to display tooltip message.

                  -
                  -

                  The tooltip can use each elements title attribute. - Hover me to display tooltip. -

                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/customcontent.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/customcontent.html deleted file mode 100644 index 3e1ce97..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/customcontent.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Custom Tooltip Content - jQuery EasyUI Demo - - - - - - - -

                  Custom Tooltip Content

                  -

                  Access to each elements attribute to get the tooltip content.

                  -
                  -
                  -
                  -
                  - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/customstyle.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/customstyle.html deleted file mode 100644 index b5c8f3e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/customstyle.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Custom Tooltip Style - jQuery EasyUI Demo - - - - - - - -

                  Custom Tooltip Style

                  -

                  This sample shows how to change the tooltip style.

                  -
                  -
                  -
                  Hover Me
                  -
                  -
                  -
                  Hover Me
                  -
                  - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/position.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/position.html deleted file mode 100644 index ac97d67..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/position.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Tooltip Position - jQuery EasyUI Demo - - - - - - - -

                  Tooltip Position

                  -

                  Click the drop-down list below to change where the tooltip appears.

                  -
                  - Select position: - -
                  -
                  Hover Me
                  -
                  - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/toolbar.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/toolbar.html deleted file mode 100644 index ac1dff7..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/toolbar.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Tooltip as Toolbar - jQuery EasyUI Demo - - - - - - - -

                  Tooltip as Toolbar

                  -

                  This sample shows how to create a tooltip style toolbar.

                  -
                  -
                  -

                  Hover me to display toolbar.

                  -
                  -
                  -
                  - - - - - -
                  -
                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/tooltipdialog.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/tooltipdialog.html deleted file mode 100644 index caee524..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tooltip/tooltipdialog.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Tooltip Dialog - jQuery EasyUI Demo - - - - - - - -

                  Tooltip Dialog

                  -

                  This sample shows how to create a tooltip dialog.

                  -
                  -
                  -

                  Click here to see the tooltip dialog. -

                  - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/actions.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/actions.html deleted file mode 100644 index b5e2d4b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/actions.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - Tree Actions - jQuery EasyUI Demo - - - - - - - -

                  Tree Actions

                  -

                  Click the buttons below to perform actions.

                  - -
                  -
                    -
                    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/animation.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/animation.html deleted file mode 100644 index d7ea6cc..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/animation.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Animation Tree - jQuery EasyUI Demo - - - - - - - -

                    Animation Tree

                    -

                    Apply 'animate' property to true to enable animation effect.

                    -
                    -
                    -
                      -
                      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/basic.html deleted file mode 100644 index 9d937a7..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/basic.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Basic Tree - jQuery EasyUI Demo - - - - - - - -

                      Basic Tree

                      -

                      Click the arrow on the left to expand or collapse nodes.

                      -
                      -
                      -
                        -
                      • - My Documents -
                          -
                        • - Photos -
                            -
                          • - Friend -
                          • -
                          • - Wife -
                          • -
                          • - Company -
                          • -
                          -
                        • -
                        • - Program Files -
                            -
                          • Intel
                          • -
                          • Java
                          • -
                          • Microsoft Office
                          • -
                          • Games
                          • -
                          -
                        • -
                        • index.html
                        • -
                        • about.html
                        • -
                        • welcome.html
                        • -
                        -
                      • -
                      -
                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/checkbox.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/checkbox.html deleted file mode 100644 index 734266e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/checkbox.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - CheckBox Tree - jQuery EasyUI Demo - - - - - - - -

                      CheckBox Tree

                      -

                      Tree nodes with check boxes.

                      - -
                      - CascadeCheck - OnlyLeafCheck -
                      -
                      -
                        -
                        - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/contextmenu.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/contextmenu.html deleted file mode 100644 index 67f14d0..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/contextmenu.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Tree Context Menu - jQuery EasyUI Demo - - - - - - - -

                        Tree Context Menu

                        -

                        Right click on a node to display context menu.

                        -
                        -
                        -
                          -
                          -
                          -
                          Append
                          -
                          Remove
                          - -
                          Expand
                          -
                          Collapse
                          -
                          - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/customcheckbox.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/customcheckbox.html deleted file mode 100644 index dc9a99b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/customcheckbox.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Custom CheckBox Tree - jQuery EasyUI Demo - - - - - - - -

                          Custom CheckBox Tree

                          -

                          Tree nodes with customized check boxes.

                          -
                          -
                          -
                            -
                            - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/dnd.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/dnd.html deleted file mode 100644 index fdf4c1f..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/dnd.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Drag Drop Tree Nodes - jQuery EasyUI Demo - - - - - - - -

                            Drag Drop Tree Nodes

                            -

                            Press mouse down and drag a node to another position.

                            -
                            -
                            -
                              -
                              - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/editable.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/editable.html deleted file mode 100644 index afbb8c6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/editable.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Editable Tree - jQuery EasyUI Demo - - - - - - - -

                              Editable Tree

                              -

                              Click the node to begin edit, press enter key to stop edit or esc key to cancel edit.

                              -
                              -
                              -
                                -
                                - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/formatting.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/formatting.html deleted file mode 100644 index e83d180..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/formatting.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Formatting Tree Nodes - jQuery EasyUI Demo - - - - - - - -

                                Formatting Tree Nodes

                                -

                                This example shows how to display extra information on nodes.

                                -
                                -
                                -
                                  -
                                -
                                - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/icons.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/icons.html deleted file mode 100644 index c50df79..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/icons.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Tree Node Icons - jQuery EasyUI Demo - - - - - - - -

                                Tree Node Icons

                                -

                                This sample illustrates how to add icons to tree node.

                                -
                                -
                                -
                                  -
                                  - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/lazyload.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/lazyload.html deleted file mode 100644 index 014b255..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/lazyload.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - Lazy Load Tree Nodes - jQuery EasyUI Demo - - - - - - - -

                                  Lazy Load Tree Nodes

                                  -

                                  Get full hierarchical tree data but lazy load nodes level by level.

                                  -
                                  -
                                  -
                                    -
                                    - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/lines.html b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/lines.html deleted file mode 100644 index 820ac44..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/lines.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Tree Lines - jQuery EasyUI Demo - - - - - - - -

                                    Tree Lines

                                    -

                                    This sample shows how to show tree lines.

                                    -
                                    -
                                    -
                                      -
                                      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/tree_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/tree_data1.json deleted file mode 100644 index 83fb0d6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/tree_data1.json +++ /dev/null @@ -1,49 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java", - "attributes":{ - "p1":"Custom Attribute1", - "p2":"Custom Attribute2" - } - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games", - "checked":true - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/tree_data2.json b/src/UWE_projectCode/前后端信息交互引用库/demo/tree/tree_data2.json deleted file mode 100644 index 14e3429..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/tree/tree_data2.json +++ /dev/null @@ -1,61 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "state":"closed", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java" - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games" - }] - },{ - "id":16, - "text":"Actions", - "children":[{ - "text":"Add", - "iconCls":"icon-add" - },{ - "text":"Remove", - "iconCls":"icon-remove" - },{ - "text":"Save", - "iconCls":"icon-save" - },{ - "text":"Search", - "iconCls":"icon-search" - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/actions.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/actions.html deleted file mode 100644 index 31430a5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/actions.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - TreeGrid Actions - jQuery EasyUI Demo - - - - - - - -

                                      TreeGrid Actions

                                      -

                                      Click the buttons below to perform actions.

                                      - - - - - - - - - - - -
                                      Task NamePersonsBegin DateEnd DateProgress
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/basic.html deleted file mode 100644 index 7daefeb..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/basic.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Basic TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                      Basic TreeGrid

                                      -

                                      TreeGrid allows you to expand or collapse group rows.

                                      -
                                      - - - - - - - - -
                                      NameSizeModified Date
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/checkbox.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/checkbox.html deleted file mode 100644 index 26f3754..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/checkbox.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Cascade CheckBox in TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                      Cascade CheckBox in TreeGrid

                                      -

                                      TreeGrid nodes with cascade check boxes.

                                      -
                                      - - - - - - - - -
                                      NameSizeModified Date
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/clientpagination.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/clientpagination.html deleted file mode 100644 index 7e6a500..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/clientpagination.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - Client Side Pagination in TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                      Client Side Pagination in TreeGrid

                                      -

                                      This sample shows how to implement client side pagination in TreeGrid.

                                      -
                                      - - - - - - - - - - -
                                      Task NamePersonsBegin DateEnd DateProgress
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/contextmenu.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/contextmenu.html deleted file mode 100644 index 7bc92ed..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/contextmenu.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - TreeGrid ContextMenu - jQuery EasyUI Demo - - - - - - - -

                                      TreeGrid ContextMenu

                                      -

                                      Right click to display the context menu.

                                      -
                                      - - - - - - - - - - -
                                      Task NamePersonsBegin DateEnd DateProgress
                                      -
                                      -
                                      Append
                                      -
                                      Remove
                                      - -
                                      Collapse
                                      -
                                      Expand
                                      -
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/customcheckbox.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/customcheckbox.html deleted file mode 100644 index 7ba6363..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/customcheckbox.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Custom CheckBox in TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                      Custom CheckBox in TreeGrid

                                      -

                                      TreeGrid nodes with customized check boxes.

                                      -
                                      - - - - - - - - -
                                      NameSizeModified Date
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/editable.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/editable.html deleted file mode 100644 index 30713e6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/editable.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - Editable TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                      Editable TreeGrid

                                      -

                                      Select one node and click edit button to perform editing.

                                      -
                                      - Edit - Save - Cancel -
                                      - - - - - - - - - - -
                                      Task NamePersonsBegin DateEnd DateProgress
                                      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/fluid.html deleted file mode 100644 index e0c8c0e..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/fluid.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Fluid TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                      Fluid TreeGrid

                                      -

                                      This example shows how to assign percentage width to a column in TreeGrid.

                                      -
                                      - - - - - - - - -
                                      Name(50%)Size(20%)Modified Date(30%)
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/footer.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/footer.html deleted file mode 100644 index 5d1cff9..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/footer.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - TreeGrid with Footer - jQuery EasyUI Demo - - - - - - - -

                                      TreeGrid with Footer

                                      -

                                      Show summary information on TreeGrid footer.

                                      -
                                      -
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/lines.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/lines.html deleted file mode 100644 index 78cf623..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/lines.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - TreeGrid Lines - jQuery EasyUI Demo - - - - - - - -

                                      TreeGrid Lines

                                      -

                                      This example shows how to show treegrid lines.

                                      -
                                      - - - - - - - - -
                                      NameSizeModified Date
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/reports.html b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/reports.html deleted file mode 100644 index 94f27f4..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/reports.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - Reports using TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                      Reports using TreeGrid

                                      -

                                      Using TreeGrid to show complex reports.

                                      -
                                      - - - - - - - - - - - - - - - - - - - - - - -
                                      Region
                                      20092010
                                      1st qrt.2st qrt.3st qrt.4st qrt.1st qrt.2st qrt.3st qrt.4st qrt.
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data1.json b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data1.json deleted file mode 100644 index 0313d46..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data1.json +++ /dev/null @@ -1,73 +0,0 @@ -[{ - "id":1, - "name":"C", - "size":"", - "date":"02/19/2010", - "children":[{ - "id":2, - "name":"Program Files", - "size":"120 MB", - "date":"03/20/2010", - "children":[{ - "id":21, - "name":"Java", - "size":"", - "date":"01/13/2010", - "state":"closed", - "children":[{ - "id":211, - "name":"java.exe", - "size":"142 KB", - "date":"01/13/2010" - },{ - "id":212, - "name":"jawt.dll", - "size":"5 KB", - "date":"01/13/2010" - }] - },{ - "id":22, - "name":"MySQL", - "size":"", - "date":"01/13/2010", - "state":"closed", - "children":[{ - "id":221, - "name":"my.ini", - "size":"10 KB", - "date":"02/26/2009" - },{ - "id":222, - "name":"my-huge.ini", - "size":"5 KB", - "date":"02/26/2009" - },{ - "id":223, - "name":"my-large.ini", - "size":"5 KB", - "date":"02/26/2009" - }] - }] - },{ - "id":3, - "name":"eclipse", - "size":"", - "date":"01/20/2010", - "children":[{ - "id":31, - "name":"eclipse.exe", - "size":"56 KB", - "date":"05/19/2009" - },{ - "id":32, - "name":"eclipse.ini", - "size":"1 KB", - "date":"04/20/2010" - },{ - "id":33, - "name":"notice.html", - "size":"7 KB", - "date":"03/17/2005" - }] - }] -}] \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data2.json b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data2.json deleted file mode 100644 index f917507..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data2.json +++ /dev/null @@ -1,11 +0,0 @@ -{"total":7,"rows":[ - {"id":1,"name":"All Tasks","begin":"3/4/2010","end":"3/20/2010","progress":60,"iconCls":"icon-ok"}, - {"id":2,"name":"Designing","begin":"3/4/2010","end":"3/10/2010","progress":100,"_parentId":1,"state":"closed"}, - {"id":21,"name":"Database","persons":2,"begin":"3/4/2010","end":"3/6/2010","progress":100,"_parentId":2}, - {"id":22,"name":"UML","persons":1,"begin":"3/7/2010","end":"3/8/2010","progress":100,"_parentId":2}, - {"id":23,"name":"Export Document","persons":1,"begin":"3/9/2010","end":"3/10/2010","progress":100,"_parentId":2}, - {"id":3,"name":"Coding","persons":2,"begin":"3/11/2010","end":"3/18/2010","progress":80}, - {"id":4,"name":"Testing","persons":1,"begin":"3/19/2010","end":"3/20/2010","progress":20} -],"footer":[ - {"name":"Total Persons:","persons":7,"iconCls":"icon-sum"} -]} diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data3.json b/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data3.json deleted file mode 100644 index 0475c38..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/treegrid/treegrid_data3.json +++ /dev/null @@ -1,13 +0,0 @@ -{"total":9,"rows":[ - {"id":1,"region":"Wyoming"}, - {"id":11,"region":"Albin","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, - {"id":12,"region":"Canon","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, - {"id":13,"region":"Egbert","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, - {"id":2,"region":"Washington"}, - {"id":21,"region":"Bellingham","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, - {"id":22,"region":"Chehalis","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, - {"id":23,"region":"Ellensburg","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, - {"id":24,"region":"Monroe","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2} -],"footer":[ - {"region":"Total","f1":14000,"f2":12600,"f3":13321,"f4":15281,"f5":14931,"f6":13461,"f7":14126,"f8":12866} -]} \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/basic.html deleted file mode 100644 index a08fc1c..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/basic.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Basic ValidateBox - jQuery EasyUI Demo - - - - - - - -

                                      Basic ValidateBox

                                      -

                                      It's easy to add validate logic to a input box.

                                      -
                                      -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/customtooltip.html b/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/customtooltip.html deleted file mode 100644 index dd2c440..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/customtooltip.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - Custom ValidateBox Tooltip - jQuery EasyUI Demo - - - - - - - -

                                      Custom ValidateBox Tooltip

                                      -

                                      This sample shows how to display another tooltip message on a valid textbox.

                                      -
                                      -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/errorplacement.html b/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/errorplacement.html deleted file mode 100644 index 57d1bd8..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/errorplacement.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Error Placement in ValidateBox - jQuery EasyUI Demo - - - - - - - -

                                      Error Placement in ValidateBox

                                      -

                                      This example shows how to display the error message below the field.

                                      -
                                      -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/validateonblur.html b/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/validateonblur.html deleted file mode 100644 index 39c99f5..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/validatebox/validateonblur.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Validate On Blur - jQuery EasyUI Demo - - - - - - - -

                                      Validate On Blur

                                      -

                                      Active validation on first blur event.

                                      -
                                      -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - -
                                      -
                                      - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/window/basic.html b/src/UWE_projectCode/前后端信息交互引用库/demo/window/basic.html deleted file mode 100644 index 4c3c551..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/window/basic.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Basic Window - jQuery EasyUI Demo - - - - - - - -

                                      Basic Window

                                      -

                                      Window can be dragged freely on screen.

                                      -
                                      - Open - Close -
                                      -
                                      - The window content. -
                                      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/window/borderstyle.html b/src/UWE_projectCode/前后端信息交互引用库/demo/window/borderstyle.html deleted file mode 100644 index 12e6625..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/window/borderstyle.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Window Border Style - jQuery EasyUI Demo - - - - - - - - -

                                      Window Border Style

                                      -

                                      This example shows how to set the different border style.

                                      -
                                      -
                                      -
                                      -
                                      -

                                      Window content

                                      -
                                      -
                                      -

                                      Window content

                                      -
                                      -
                                      -

                                      Window content

                                      -
                                      -
                                      -

                                      Window content

                                      -
                                      -
                                      -

                                      Window content

                                      -
                                      -
                                      -

                                      Window content

                                      -
                                      -
                                      - - - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/window/customtools.html b/src/UWE_projectCode/前后端信息交互引用库/demo/window/customtools.html deleted file mode 100644 index 1a22ad1..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/window/customtools.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Custom Window Tools - jQuery EasyUI Demo - - - - - - - -

                                      Custom Window Tools

                                      -

                                      Click the right top buttons to perform actions.

                                      -
                                      - Open - Close -
                                      -
                                      - The window content. -
                                      -
                                      - - - - -
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/window/fluid.html b/src/UWE_projectCode/前后端信息交互引用库/demo/window/fluid.html deleted file mode 100644 index 11b3967..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/window/fluid.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Fluid Window - jQuery EasyUI Demo - - - - - - - -

                                      Fluid Window

                                      -

                                      This example shows how to set the width of Window to a percentage of its parent container.

                                      -
                                      -
                                      -

                                      The window has a width of 80%.

                                      -
                                      - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/window/footer.html b/src/UWE_projectCode/前后端信息交互引用库/demo/window/footer.html deleted file mode 100644 index ba29d53..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/window/footer.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Window with a Footer - jQuery EasyUI Demo - - - - - - - -

                                      Window with a Footer

                                      -

                                      This example shows how to attach a footer bar to the window.

                                      -
                                      - Open - Close -
                                      -
                                      - The window content. -
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/window/inlinewindow.html b/src/UWE_projectCode/前后端信息交互引用库/demo/window/inlinewindow.html deleted file mode 100644 index 8335880..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/window/inlinewindow.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Inline Window - jQuery EasyUI Demo - - - - - - - -

                                      Inline Window

                                      -

                                      The inline window stay inside its parent.

                                      -
                                      - Open - Close -
                                      -
                                      -
                                      - This window stay inside its parent -
                                      -
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/window/modalwindow.html b/src/UWE_projectCode/前后端信息交互引用库/demo/window/modalwindow.html deleted file mode 100644 index 59e79ca..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/window/modalwindow.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Modal Window - jQuery EasyUI Demo - - - - - - - -

                                      Modal Window

                                      -

                                      Click the open button below to open the modal window.

                                      -
                                      - Open - Close -
                                      -
                                      - The window content. -
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/demo/window/windowlayout.html b/src/UWE_projectCode/前后端信息交互引用库/demo/window/windowlayout.html deleted file mode 100644 index 7311ef6..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/demo/window/windowlayout.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Window Layout - jQuery EasyUI Demo - - - - - - - -

                                      Window Layout

                                      -

                                      Using layout on window.

                                      -
                                      - Open - Close -
                                      -
                                      -
                                      -
                                      -
                                      - jQuery EasyUI framework help you build your web page easily. -
                                      -
                                      - Ok - Cancel -
                                      -
                                      -
                                      - - - \ No newline at end of file diff --git a/src/UWE_projectCode/前后端信息交互引用库/easyloader.js b/src/UWE_projectCode/前后端信息交互引用库/easyloader.js deleted file mode 100644 index 165b75b..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/easyloader.js +++ /dev/null @@ -1,194 +0,0 @@ -/** - * EasyUI for jQuery 1.10.16 - * - * Copyright (c) 2009-2023 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function(){ -var _1={draggable:{js:"jquery.draggable.js"},droppable:{js:"jquery.droppable.js"},resizable:{js:"jquery.resizable.js"},linkbutton:{js:"jquery.linkbutton.js",css:"linkbutton.css"},progressbar:{js:"jquery.progressbar.js",css:"progressbar.css"},tooltip:{js:"jquery.tooltip.js",css:"tooltip.css"},pagination:{js:"jquery.pagination.js",css:"pagination.css",dependencies:["linkbutton"]},datagrid:{js:"jquery.datagrid.js",css:"datagrid.css",dependencies:["panel","resizable","linkbutton","pagination"]},treegrid:{js:"jquery.treegrid.js",css:"tree.css",dependencies:["datagrid"]},propertygrid:{js:"jquery.propertygrid.js",css:"propertygrid.css",dependencies:["datagrid"]},datalist:{js:"jquery.datalist.js",css:"datalist.css",dependencies:["datagrid"]},panel:{js:"jquery.panel.js",css:"panel.css"},window:{js:"jquery.window.js",css:"window.css",dependencies:["resizable","draggable","panel"]},dialog:{js:"jquery.dialog.js",css:"dialog.css",dependencies:["linkbutton","window"]},messager:{js:"jquery.messager.js",css:"messager.css",dependencies:["linkbutton","dialog","progressbar"]},layout:{js:"jquery.layout.js",css:"layout.css",dependencies:["resizable","panel"]},form:{js:"jquery.form.js"},menu:{js:"jquery.menu.js",css:"menu.css"},tabs:{js:"jquery.tabs.js",css:"tabs.css",dependencies:["panel","linkbutton"]},menubutton:{js:"jquery.menubutton.js",css:"menubutton.css",dependencies:["linkbutton","menu"]},splitbutton:{js:"jquery.splitbutton.js",css:"splitbutton.css",dependencies:["menubutton"]},switchbutton:{js:"jquery.switchbutton.js",css:"switchbutton.css"},accordion:{js:"jquery.accordion.js",css:"accordion.css",dependencies:["panel"]},calendar:{js:"jquery.calendar.js",css:"calendar.css"},textbox:{js:"jquery.textbox.js",css:"textbox.css",dependencies:["validatebox","linkbutton"]},passwordbox:{js:"jquery.passwordbox.js",css:"passwordbox.css",dependencies:["textbox"]},filebox:{js:"jquery.filebox.js",css:"filebox.css",dependencies:["textbox"]},radiobutton:{js:"jquery.radiobutton.js",css:"radiobutton.css"},checkbox:{js:"jquery.checkbox.js",css:"checkbox.css"},sidemenu:{js:"jquery.sidemenu.js",css:"sidemenu.css",dependencies:["accordion","tree","tooltip"]},combo:{js:"jquery.combo.js",css:"combo.css",dependencies:["panel","textbox"]},combobox:{js:"jquery.combobox.js",css:"combobox.css",dependencies:["combo"]},combotree:{js:"jquery.combotree.js",dependencies:["combo","tree"]},combogrid:{js:"jquery.combogrid.js",dependencies:["combo","datagrid"]},combotreegrid:{js:"jquery.combotreegrid.js",dependencies:["combo","treegrid"]},tagbox:{js:"jquery.tagbox.js",dependencies:["combobox"]},validatebox:{js:"jquery.validatebox.js",css:"validatebox.css",dependencies:["tooltip"]},numberbox:{js:"jquery.numberbox.js",dependencies:["textbox"]},searchbox:{js:"jquery.searchbox.js",css:"searchbox.css",dependencies:["menubutton","textbox"]},spinner:{js:"jquery.spinner.js",css:"spinner.css",dependencies:["textbox"]},numberspinner:{js:"jquery.numberspinner.js",dependencies:["spinner","numberbox"]},timespinner:{js:"jquery.timespinner.js",dependencies:["spinner"]},timepicker:{js:"jquery.timepicker.js",css:"timepicker.css",dependencies:["combo"]},tree:{js:"jquery.tree.js",css:"tree.css",dependencies:["draggable","droppable"]},datebox:{js:"jquery.datebox.js",css:"datebox.css",dependencies:["calendar","combo"]},datetimebox:{js:"jquery.datetimebox.js",dependencies:["datebox","timespinner"]},slider:{js:"jquery.slider.js",dependencies:["draggable"]},parser:{js:"jquery.parser.js",css:"flex.css"},mobile:{js:"jquery.mobile.js"}}; -var _2={"af":"easyui-lang-af.js","ar":"easyui-lang-ar.js","bg":"easyui-lang-bg.js","ca":"easyui-lang-ca.js","cs":"easyui-lang-cs.js","cz":"easyui-lang-cz.js","da":"easyui-lang-da.js","de":"easyui-lang-de.js","el":"easyui-lang-el.js","en":"easyui-lang-en.js","es":"easyui-lang-es.js","fr":"easyui-lang-fr.js","it":"easyui-lang-it.js","jp":"easyui-lang-jp.js","nl":"easyui-lang-nl.js","pl":"easyui-lang-pl.js","pt_BR":"easyui-lang-pt_BR.js","ru":"easyui-lang-ru.js","sv_SE":"easyui-lang-sv_SE.js","tr":"easyui-lang-tr.js","zh_CN":"easyui-lang-zh_CN.js","zh_TW":"easyui-lang-zh_TW.js"}; -var _3={}; -function _4(_5,_6){ -var _7=false; -var _8=document.createElement("script"); -_8.type="text/javascript"; -_8.language="javascript"; -_8.src=_5; -_8.onload=_8.onreadystatechange=function(){ -if(!_7&&(!_8.readyState||_8.readyState=="loaded"||_8.readyState=="complete")){ -_7=true; -_8.onload=_8.onreadystatechange=null; -if(_6){ -_6.call(_8); -} -} -}; -document.getElementsByTagName("head")[0].appendChild(_8); -}; -function _9(_a,_b){ -_4(_a,function(){ -document.getElementsByTagName("head")[0].removeChild(this); -if(_b){ -_b(); -} -}); -}; -function _c(_d,_e){ -var _f=document.createElement("link"); -_f.rel="stylesheet"; -_f.type="text/css"; -_f.media="screen"; -_f.href=_d; -document.getElementsByTagName("head")[0].appendChild(_f); -if(_e){ -_e.call(_f); -} -}; -function _10(_11,_12){ -_3[_11]="loading"; -var _13=_1[_11]; -var _14="loading"; -var _15=(easyloader.css&&_13["css"])?"loading":"loaded"; -if(easyloader.css&&_13["css"]){ -if(/^http/i.test(_13["css"])){ -var url=_13["css"]; -}else{ -var url=easyloader.base+"themes/"+easyloader.theme+"/"+_13["css"]; -} -_c(url,function(){ -_15="loaded"; -if(_14=="loaded"&&_15=="loaded"){ -_16(); -} -}); -} -if(/^http/i.test(_13["js"])){ -var url=_13["js"]; -}else{ -var url=easyloader.base+"plugins/"+_13["js"]; -} -_4(url,function(){ -_14="loaded"; -if(_14=="loaded"&&_15=="loaded"){ -_16(); -} -}); -function _16(){ -_3[_11]="loaded"; -easyloader.onProgress(_11); -if(_12){ -_12(); -} -}; -}; -function _17(_18,_19){ -var mm=[]; -var _1a=false; -if(typeof _18=="string"){ -add(_18); -}else{ -for(var i=0;i<_18.length;i++){ -add(_18[i]); -} -} -mm.unshift("parser"); -function add(_1b){ -if(!_1[_1b]){ -return; -} -var d=_1[_1b]["dependencies"]; -if(d){ -for(var i=0;i=0;i--){ -_9.unshift(_a.children[i]); -} -} -} -}}; -$.parser={auto:true,emptyFn:function(){ -},onComplete:function(_b){ -},plugins:["draggable","droppable","resizable","pagination","tooltip","linkbutton","menu","sidemenu","menubutton","splitbutton","switchbutton","progressbar","radiobutton","checkbox","radiogroup","checkgroup","tree","textbox","passwordbox","maskedbox","filebox","combo","combobox","combotree","combogrid","combotreegrid","tagbox","numberbox","validatebox","searchbox","spinner","numberspinner","timespinner","datetimespinner","calendar","datebox","datetimebox","timepicker","slider","layout","panel","datagrid","propertygrid","treegrid","datalist","tabs","accordion","window","dialog","drawer","form"],parse:function(_c){ -var aa=[]; -for(var i=0;i<$.parser.plugins.length;i++){ -var _d=$.parser.plugins[i]; -var r=$(".easyui-"+_d,_c); -if(r.length){ -if(r[_d]){ -r.each(function(){ -$(this)[_d]($.data(this,"options")||{}); -}); -}else{ -aa.push({name:_d,jq:r}); -} -} -} -if(aa.length&&window.easyloader){ -var _e=[]; -for(var i=0;i=0){ -_13+=_12[0].offsetWidth-_12[0].clientWidth; -v=Math.floor((_12.width()-_13)*v/100); -}else{ -_13+=_12[0].offsetHeight-_12[0].clientHeight; -v=Math.floor((_12.height()-_13)*v/100); -} -}else{ -v=parseInt(v)||undefined; -} -return v; -},parseOptions:function(_15,_16){ -var t=$(_15); -var _17={}; -var s=$.trim(t.attr("data-options")); -if(s){ -if(s.substring(0,1)!="{"){ -s="{"+s+"}"; -} -_17=(new Function("return "+s))(); -} -$.map(["width","height","left","top","minWidth","maxWidth","minHeight","maxHeight"],function(p){ -var pv=$.trim(_15.style[p]||""); -if(pv){ -if(pv.indexOf("%")==-1){ -pv=parseInt(pv); -if(isNaN(pv)){ -pv=undefined; -} -} -_17[p]=pv; -} -}); -if(_16){ -var _18={}; -for(var i=0;i<_16.length;i++){ -var pp=_16[i]; -if(typeof pp=="string"){ -_18[pp]=t.attr(pp); -}else{ -for(var _19 in pp){ -var _1a=pp[_19]; -if(_1a=="boolean"){ -_18[_19]=t.attr(_19)?(t.attr(_19)=="true"):undefined; -}else{ -if(_1a=="number"){ -_18[_19]=t.attr(_19)=="0"?0:parseFloat(t.attr(_19))||undefined; -} -} -} -} -} -$.extend(_17,_18); -} -return _17; -},parseVars:function(){ -var d=$("
                                      ").appendTo("body"); -$._boxModel=d.outerWidth()!=100; -d.remove(); -d=$("
                                      ").appendTo("body"); -$._positionFixed=(d.css("position")=="fixed"); -d.remove(); -}}; -$(function(){ -$.parser.parseVars(); -if(!window.easyloader&&$.parser.auto){ -$.parser.parse(); -} -}); -$.fn._outerWidth=function(_1b){ -if(_1b==undefined){ -if(this[0]==window){ -return this.width()||document.body.clientWidth; -} -return this.outerWidth()||0; -} -return this._size("width",_1b); -}; -$.fn._outerHeight=function(_1c){ -if(_1c==undefined){ -if(this[0]==window){ -return this.height()||document.body.clientHeight; -} -return this.outerHeight()||0; -} -return this._size("height",_1c); -}; -$.fn._scrollLeft=function(_1d){ -if(_1d==undefined){ -return this.scrollLeft(); -}else{ -return this.each(function(){ -$(this).scrollLeft(_1d); -}); -} -}; -$.fn._propAttr=$.fn.prop||$.fn.attr; -$.fn._bind=$.fn.on; -$.fn._unbind=$.fn.off; -$.fn._size=function(_1e,_1f){ -if(typeof _1e=="string"){ -if(_1e=="clear"){ -return this.each(function(){ -$(this).css({width:"",minWidth:"",maxWidth:"",height:"",minHeight:"",maxHeight:""}); -}); -}else{ -if(_1e=="fit"){ -return this.each(function(){ -_20(this,this.tagName=="BODY"?$("body"):$(this).parent(),true); -}); -}else{ -if(_1e=="unfit"){ -return this.each(function(){ -_20(this,$(this).parent(),false); -}); -}else{ -if(_1f==undefined){ -return _21(this[0],_1e); -}else{ -return this.each(function(){ -_21(this,_1e,_1f); -}); -} -} -} -} -}else{ -return this.each(function(){ -_1f=_1f||$(this).parent(); -$.extend(_1e,_20(this,_1f,_1e.fit)||{}); -var r1=_22(this,"width",_1f,_1e); -var r2=_22(this,"height",_1f,_1e); -if(r1||r2){ -$(this).addClass("easyui-fluid"); -}else{ -$(this).removeClass("easyui-fluid"); -} -}); -} -function _20(_23,_24,fit){ -if(!_24.length){ -return false; -} -var t=$(_23)[0]; -var p=_24[0]; -var _25=p.fcount||0; -if(fit){ -if(!t.fitted){ -t.fitted=true; -p.fcount=_25+1; -$(p).addClass("panel-noscroll"); -if(p.tagName=="BODY"){ -$("html").addClass("panel-fit"); -} -} -return {width:($(p).width()||1),height:($(p).height()||1)}; -}else{ -if(t.fitted){ -t.fitted=false; -p.fcount=_25-1; -if(p.fcount==0){ -$(p).removeClass("panel-noscroll"); -if(p.tagName=="BODY"){ -$("html").removeClass("panel-fit"); -} -} -} -return false; -} -}; -function _22(_26,_27,_28,_29){ -var t=$(_26); -var p=_27; -var p1=p.substr(0,1).toUpperCase()+p.substr(1); -var min=$.parser.parseValue("min"+p1,_29["min"+p1],_28); -var max=$.parser.parseValue("max"+p1,_29["max"+p1],_28); -var val=$.parser.parseValue(p,_29[p],_28); -var _2a=(String(_29[p]||"").indexOf("%")>=0?true:false); -if(!isNaN(val)){ -var v=Math.min(Math.max(val,min||0),max||99999); -if(!_2a){ -_29[p]=v; -} -t._size("min"+p1,""); -t._size("max"+p1,""); -t._size(p,v); -}else{ -t._size(p,""); -t._size("min"+p1,min); -t._size("max"+p1,max); -} -return _2a||_29.fit; -}; -function _21(_2b,_2c,_2d){ -var t=$(_2b); -if(_2d==undefined){ -_2d=parseInt(_2b.style[_2c]); -if(isNaN(_2d)){ -return undefined; -} -if($._boxModel){ -_2d+=_2e(); -} -return _2d; -}else{ -if(_2d===""){ -t.css(_2c,""); -}else{ -if($._boxModel){ -_2d-=_2e(); -if(_2d<0){ -_2d=0; -} -} -t.css(_2c,_2d+"px"); -} -} -function _2e(){ -if(_2c.toLowerCase().indexOf("width")>=0){ -return t.outerWidth()-t.width(); -}else{ -return t.outerHeight()-t.height(); -} -}; -}; -}; -})(jQuery); -(function($){ -var _2f=null; -var _30=null; -var _31=false; -function _32(e){ -if(e.touches.length!=1){ -return; -} -if(!_31){ -_31=true; -dblClickTimer=setTimeout(function(){ -_31=false; -},500); -}else{ -clearTimeout(dblClickTimer); -_31=false; -_33(e,"dblclick"); -} -_2f=setTimeout(function(){ -_33(e,"contextmenu",3); -},1000); -_33(e,"mousedown"); -if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ -e.preventDefault(); -} -}; -function _34(e){ -if(e.touches.length!=1){ -return; -} -if(_2f){ -clearTimeout(_2f); -} -_33(e,"mousemove"); -if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ -e.preventDefault(); -} -}; -function _35(e){ -if(_2f){ -clearTimeout(_2f); -} -_33(e,"mouseup"); -if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ -e.preventDefault(); -} -}; -function _33(e,_36,_37){ -var _38=new $.Event(_36); -_38.pageX=e.changedTouches[0].pageX; -_38.pageY=e.changedTouches[0].pageY; -_38.which=_37||1; -$(e.target).trigger(_38); -}; -if(document.addEventListener){ -document.addEventListener("touchstart",_32,true); -document.addEventListener("touchmove",_34,true); -document.addEventListener("touchend",_35,true); -} -})(jQuery); -(function($){ -function _39(e){ -var _3a=$.data(e.data.target,"draggable"); -var _3b=_3a.options; -var _3c=_3a.proxy; -var _3d=e.data; -var _3e=_3d.startLeft+e.pageX-_3d.startX; -var top=_3d.startTop+e.pageY-_3d.startY; -if(_3c){ -if(_3c.parent()[0]==document.body){ -if(_3b.deltaX!=null&&_3b.deltaX!=undefined){ -_3e=e.pageX+_3b.deltaX; -}else{ -_3e=e.pageX-e.data.offsetWidth; -} -if(_3b.deltaY!=null&&_3b.deltaY!=undefined){ -top=e.pageY+_3b.deltaY; -}else{ -top=e.pageY-e.data.offsetHeight; -} -}else{ -if(_3b.deltaX!=null&&_3b.deltaX!=undefined){ -_3e+=e.data.offsetWidth+_3b.deltaX; -} -if(_3b.deltaY!=null&&_3b.deltaY!=undefined){ -top+=e.data.offsetHeight+_3b.deltaY; -} -} -} -if(e.data.parent!=document.body){ -_3e+=$(e.data.parent).scrollLeft(); -top+=$(e.data.parent).scrollTop(); -} -if(_3b.axis=="h"){ -_3d.left=_3e; -}else{ -if(_3b.axis=="v"){ -_3d.top=top; -}else{ -_3d.left=_3e; -_3d.top=top; -} -} -}; -function _3f(e){ -var _40=$.data(e.data.target,"draggable"); -var _41=_40.options; -var _42=_40.proxy; -if(!_42){ -_42=$(e.data.target); -} -_42.css({left:e.data.left,top:e.data.top}); -$("body").css("cursor",_41.cursor); -}; -function _43(e){ -if(!$.fn.draggable.isDragging){ -return false; -} -var _44=$.data(e.data.target,"draggable"); -var _45=_44.options; -var _46=$(".droppable:visible").filter(function(){ -return e.data.target!=this; -}).filter(function(){ -var _47=$.data(this,"droppable").options.accept; -if(_47){ -return $(_47).filter(function(){ -return this==e.data.target; -}).length>0; -}else{ -return true; -} -}); -_44.droppables=_46; -var _48=_44.proxy; -if(!_48){ -if(_45.proxy){ -if(_45.proxy=="clone"){ -_48=$(e.data.target).clone().insertAfter(e.data.target); -}else{ -_48=_45.proxy.call(e.data.target,e.data.target); -} -_44.proxy=_48; -}else{ -_48=$(e.data.target); -} -} -_48.css("position","absolute"); -_39(e); -_3f(e); -_45.onStartDrag.call(e.data.target,e); -return false; -}; -function _49(e){ -if(!$.fn.draggable.isDragging){ -return false; -} -var _4a=$.data(e.data.target,"draggable"); -_39(e); -if(_4a.options.onDrag.call(e.data.target,e)!=false){ -_3f(e); -} -var _4b=e.data.target; -_4a.droppables.each(function(){ -var _4c=$(this); -if(_4c.droppable("options").disabled){ -return; -} -var p2=_4c.offset(); -if(e.pageX>p2.left&&e.pageXp2.top&&e.pageYp2.left&&e.pageXp2.top&&e.pageY_62.options.edge; -}; -}); -}; -$.fn.draggable.methods={options:function(jq){ -return $.data(jq[0],"draggable").options; -},proxy:function(jq){ -return $.data(jq[0],"draggable").proxy; -},enable:function(jq){ -return jq.each(function(){ -$(this).draggable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).draggable({disabled:true}); -}); -}}; -$.fn.draggable.parseOptions=function(_67){ -var t=$(_67); -return $.extend({},$.parser.parseOptions(_67,["cursor","handle","axis",{"revert":"boolean","deltaX":"number","deltaY":"number","edge":"number","delay":"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.draggable.defaults={proxy:null,revert:false,cursor:"move",deltaX:null,deltaY:null,handle:null,disabled:false,edge:0,axis:null,delay:100,onBeforeDrag:function(e){ -},onStartDrag:function(e){ -},onDrag:function(e){ -},onEndDrag:function(e){ -},onStopDrag:function(e){ -}}; -$.fn.draggable.isDragging=false; -})(jQuery); -(function($){ -function _68(_69){ -$(_69).addClass("droppable"); -$(_69)._bind("_dragenter",function(e,_6a){ -$.data(_69,"droppable").options.onDragEnter.apply(_69,[e,_6a]); -}); -$(_69)._bind("_dragleave",function(e,_6b){ -$.data(_69,"droppable").options.onDragLeave.apply(_69,[e,_6b]); -}); -$(_69)._bind("_dragover",function(e,_6c){ -$.data(_69,"droppable").options.onDragOver.apply(_69,[e,_6c]); -}); -$(_69)._bind("_drop",function(e,_6d){ -$.data(_69,"droppable").options.onDrop.apply(_69,[e,_6d]); -}); -}; -$.fn.droppable=function(_6e,_6f){ -if(typeof _6e=="string"){ -return $.fn.droppable.methods[_6e](this,_6f); -} -_6e=_6e||{}; -return this.each(function(){ -var _70=$.data(this,"droppable"); -if(_70){ -$.extend(_70.options,_6e); -}else{ -_68(this); -$.data(this,"droppable",{options:$.extend({},$.fn.droppable.defaults,$.fn.droppable.parseOptions(this),_6e)}); -} -}); -}; -$.fn.droppable.methods={options:function(jq){ -return $.data(jq[0],"droppable").options; -},enable:function(jq){ -return jq.each(function(){ -$(this).droppable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).droppable({disabled:true}); -}); -}}; -$.fn.droppable.parseOptions=function(_71){ -var t=$(_71); -return $.extend({},$.parser.parseOptions(_71,["accept"]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.droppable.defaults={accept:null,disabled:false,onDragEnter:function(e,_72){ -},onDragOver:function(e,_73){ -},onDragLeave:function(e,_74){ -},onDrop:function(e,_75){ -}}; -})(jQuery); -(function($){ -function _76(e){ -var _77=e.data; -var _78=$.data(_77.target,"resizable").options; -if(_77.dir.indexOf("e")!=-1){ -var _79=_77.startWidth+e.pageX-_77.startX; -_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth); -_77.width=_79; -} -if(_77.dir.indexOf("s")!=-1){ -var _7a=_77.startHeight+e.pageY-_77.startY; -_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight); -_77.height=_7a; -} -if(_77.dir.indexOf("w")!=-1){ -var _79=_77.startWidth-e.pageX+_77.startX; -_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth); -_77.width=_79; -_77.left=_77.startLeft+_77.startWidth-_77.width; -} -if(_77.dir.indexOf("n")!=-1){ -var _7a=_77.startHeight-e.pageY+_77.startY; -_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight); -_77.height=_7a; -_77.top=_77.startTop+_77.startHeight-_77.height; -} -}; -function _7b(e){ -var _7c=e.data; -var t=$(_7c.target); -t.css({left:_7c.left,top:_7c.top}); -if(t.outerWidth()!=_7c.width){ -t._outerWidth(_7c.width); -} -if(t.outerHeight()!=_7c.height){ -t._outerHeight(_7c.height); -} -}; -function _7d(e){ -$.fn.resizable.isResizing=true; -$.data(e.data.target,"resizable").options.onStartResize.call(e.data.target,e); -return false; -}; -function _7e(e){ -_76(e); -if($.data(e.data.target,"resizable").options.onResize.call(e.data.target,e)!=false){ -_7b(e); -} -return false; -}; -function _7f(e){ -$.fn.resizable.isResizing=false; -_76(e,true); -_7b(e); -$.data(e.data.target,"resizable").options.onStopResize.call(e.data.target,e); -$(document)._unbind(".resizable"); -$("body").css("cursor",""); -return false; -}; -function _80(e){ -var _81=$(e.data.target).resizable("options"); -var tt=$(e.data.target); -var dir=""; -var _82=tt.offset(); -var _83=tt.outerWidth(); -var _84=tt.outerHeight(); -var _85=_81.edge; -if(e.pageY>_82.top&&e.pageY<_82.top+_85){ -dir+="n"; -}else{ -if(e.pageY<_82.top+_84&&e.pageY>_82.top+_84-_85){ -dir+="s"; -} -} -if(e.pageX>_82.left&&e.pageX<_82.left+_85){ -dir+="w"; -}else{ -if(e.pageX<_82.left+_83&&e.pageX>_82.left+_83-_85){ -dir+="e"; -} -} -var _86=_81.handles.split(","); -_86=$.map(_86,function(h){ -return $.trim(h).toLowerCase(); -}); -if($.inArray("all",_86)>=0||$.inArray(dir,_86)>=0){ -return dir; -} -for(var i=0;i=0){ -return _86[_87]; -} -} -return ""; -}; -$.fn.resizable=function(_88,_89){ -if(typeof _88=="string"){ -return $.fn.resizable.methods[_88](this,_89); -} -return this.each(function(){ -var _8a=null; -var _8b=$.data(this,"resizable"); -if(_8b){ -$(this)._unbind(".resizable"); -_8a=$.extend(_8b.options,_88||{}); -}else{ -_8a=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_88||{}); -$.data(this,"resizable",{options:_8a}); -} -if(_8a.disabled==true){ -return; -} -$(this)._bind("mousemove.resizable",{target:this},function(e){ -if($.fn.resizable.isResizing){ -return; -} -var dir=_80(e); -$(e.data.target).css("cursor",dir?dir+"-resize":""); -})._bind("mouseleave.resizable",{target:this},function(e){ -$(e.data.target).css("cursor",""); -})._bind("mousedown.resizable",{target:this},function(e){ -var dir=_80(e); -if(dir==""){ -return; -} -function _8c(css){ -var val=parseInt($(e.data.target).css(css)); -if(isNaN(val)){ -return 0; -}else{ -return val; -} -}; -var _8d={target:e.data.target,dir:dir,startLeft:_8c("left"),startTop:_8c("top"),left:_8c("left"),top:_8c("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()}; -$(document)._bind("mousedown.resizable",_8d,_7d); -$(document)._bind("mousemove.resizable",_8d,_7e); -$(document)._bind("mouseup.resizable",_8d,_7f); -$("body").css("cursor",dir+"-resize"); -}); -}); -}; -$.fn.resizable.methods={options:function(jq){ -return $.data(jq[0],"resizable").options; -},enable:function(jq){ -return jq.each(function(){ -$(this).resizable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).resizable({disabled:true}); -}); -}}; -$.fn.resizable.parseOptions=function(_8e){ -var t=$(_8e); -return $.extend({},$.parser.parseOptions(_8e,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){ -},onResize:function(e){ -},onStopResize:function(e){ -}}; -$.fn.resizable.isResizing=false; -})(jQuery); -(function($){ -function _8f(_90,_91){ -var _92=$.data(_90,"linkbutton").options; -if(_91){ -$.extend(_92,_91); -} -if(_92.width||_92.height||_92.fit){ -var btn=$(_90); -var _93=btn.parent(); -var _94=btn.is(":visible"); -if(!_94){ -var _95=$("
                                      ").insertBefore(_90); -var _96={position:btn.css("position"),display:btn.css("display"),left:btn.css("left")}; -btn.appendTo("body"); -btn.css({position:"absolute",display:"inline-block",left:-20000}); -} -btn._size(_92,_93); -var _97=btn.find(".l-btn-left"); -_97.css("margin-top",0); -_97.css("margin-top",parseInt((btn.height()-_97.height())/2)+"px"); -if(!_94){ -btn.insertAfter(_95); -btn.css(_96); -_95.remove(); -} -} -}; -function _98(_99){ -var _9a=$.data(_99,"linkbutton").options; -var t=$(_99).empty(); -t.addClass("l-btn").removeClass("l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline"); -t.removeClass("l-btn-small l-btn-medium l-btn-large").addClass("l-btn-"+_9a.size); -if(_9a.plain){ -t.addClass("l-btn-plain"); -} -if(_9a.outline){ -t.addClass("l-btn-outline"); -} -if(_9a.selected){ -t.addClass(_9a.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); -} -t.attr("group",_9a.group||""); -t.attr("id",_9a.id||""); -var _9b=$("").appendTo(t); -if(_9a.text){ -$("").html(_9a.text).appendTo(_9b); -}else{ -$(" ").appendTo(_9b); -} -if(_9a.iconCls){ -$(" ").addClass(_9a.iconCls).appendTo(_9b); -_9b.addClass("l-btn-icon-"+_9a.iconAlign); -} -t._unbind(".linkbutton")._bind("focus.linkbutton",function(){ -if(!_9a.disabled){ -$(this).addClass("l-btn-focus"); -} -})._bind("blur.linkbutton",function(){ -$(this).removeClass("l-btn-focus"); -})._bind("click.linkbutton",function(){ -if(!_9a.disabled){ -if(_9a.toggle){ -if(_9a.selected){ -$(this).linkbutton("unselect"); -}else{ -$(this).linkbutton("select"); -} -} -_9a.onClick.call(this); -} -}); -_9c(_99,_9a.selected); -_9d(_99,_9a.disabled); -}; -function _9c(_9e,_9f){ -var _a0=$.data(_9e,"linkbutton").options; -if(_9f){ -if(_a0.group){ -$("a.l-btn[group=\""+_a0.group+"\"]").each(function(){ -var o=$(this).linkbutton("options"); -if(o.toggle){ -$(this).removeClass("l-btn-selected l-btn-plain-selected"); -o.selected=false; -} -}); -} -$(_9e).addClass(_a0.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); -_a0.selected=true; -}else{ -if(!_a0.group){ -$(_9e).removeClass("l-btn-selected l-btn-plain-selected"); -_a0.selected=false; -} -} -}; -function _9d(_a1,_a2){ -var _a3=$.data(_a1,"linkbutton"); -var _a4=_a3.options; -$(_a1).removeClass("l-btn-disabled l-btn-plain-disabled"); -if(_a2){ -_a4.disabled=true; -var _a5=$(_a1).attr("href"); -if(_a5){ -_a3.href=_a5; -$(_a1).attr("href","javascript:;"); -} -if(_a1.onclick){ -_a3.onclick=_a1.onclick; -_a1.onclick=null; -} -_a4.plain?$(_a1).addClass("l-btn-disabled l-btn-plain-disabled"):$(_a1).addClass("l-btn-disabled"); -}else{ -_a4.disabled=false; -if(_a3.href){ -$(_a1).attr("href",_a3.href); -} -if(_a3.onclick){ -_a1.onclick=_a3.onclick; -} -} -$(_a1)._propAttr("disabled",_a2); -}; -$.fn.linkbutton=function(_a6,_a7){ -if(typeof _a6=="string"){ -return $.fn.linkbutton.methods[_a6](this,_a7); -} -_a6=_a6||{}; -return this.each(function(){ -var _a8=$.data(this,"linkbutton"); -if(_a8){ -$.extend(_a8.options,_a6); -}else{ -$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_a6)}); -$(this)._propAttr("disabled",false); -$(this)._bind("_resize",function(e,_a9){ -if($(this).hasClass("easyui-fluid")||_a9){ -_8f(this); -} -return false; -}); -} -_98(this); -_8f(this); -}); -}; -$.fn.linkbutton.methods={options:function(jq){ -return $.data(jq[0],"linkbutton").options; -},resize:function(jq,_aa){ -return jq.each(function(){ -_8f(this,_aa); -}); -},enable:function(jq){ -return jq.each(function(){ -_9d(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_9d(this,true); -}); -},select:function(jq){ -return jq.each(function(){ -_9c(this,true); -}); -},unselect:function(jq){ -return jq.each(function(){ -_9c(this,false); -}); -}}; -$.fn.linkbutton.parseOptions=function(_ab){ -var t=$(_ab); -return $.extend({},$.parser.parseOptions(_ab,["id","iconCls","iconAlign","group","size","text",{plain:"boolean",toggle:"boolean",selected:"boolean",outline:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:($.trim(t.html())||undefined),iconCls:(t.attr("icon")||t.attr("iconCls"))}); -}; -$.fn.linkbutton.defaults={id:null,disabled:false,toggle:false,selected:false,outline:false,group:null,plain:false,text:"",iconCls:null,iconAlign:"left",size:"small",onClick:function(){ -}}; -})(jQuery); -(function($){ -function _ac(_ad){ -var _ae=$.data(_ad,"pagination"); -var _af=_ae.options; -var bb=_ae.bb={}; -if(_af.buttons&&!$.isArray(_af.buttons)){ -$(_af.buttons).insertAfter(_ad); -} -var _b0=$(_ad).addClass("pagination").html("
                                      "); -var tr=_b0.find("tr"); -var aa=$.extend([],_af.layout); -if(!_af.showPageList){ -_b1(aa,"list"); -} -if(!_af.showPageInfo){ -_b1(aa,"info"); -} -if(!_af.showRefresh){ -_b1(aa,"refresh"); -} -if(aa[0]=="sep"){ -aa.shift(); -} -if(aa[aa.length-1]=="sep"){ -aa.pop(); -} -for(var _b2=0;_b2"); -ps._bind("change",function(){ -_af.pageSize=parseInt($(this).val()); -_af.onChangePageSize.call(_ad,_af.pageSize); -_b9(_ad,_af.pageNumber); -}); -for(var i=0;i<_af.pageList.length;i++){ -$("").text(_af.pageList[i]).appendTo(ps); -} -$("").append(ps).appendTo(tr); -}else{ -if(_b3=="sep"){ -$("
                                      ").appendTo(tr); -}else{ -if(_b3=="first"){ -bb.first=_b4("first"); -}else{ -if(_b3=="prev"){ -bb.prev=_b4("prev"); -}else{ -if(_b3=="next"){ -bb.next=_b4("next"); -}else{ -if(_b3=="last"){ -bb.last=_b4("last"); -}else{ -if(_b3=="manual"){ -$("").html(_af.beforePageText).appendTo(tr).wrap(""); -bb.num=$("").appendTo(tr).wrap(""); -bb.num._unbind(".pagination")._bind("keydown.pagination",function(e){ -if(e.keyCode==13){ -var _b5=parseInt($(this).val())||1; -_b9(_ad,_b5); -return false; -} -}); -bb.after=$("").appendTo(tr).wrap(""); -}else{ -if(_b3=="refresh"){ -bb.refresh=_b4("refresh"); -}else{ -if(_b3=="links"){ -$("").appendTo(tr); -}else{ -if(_b3=="info"){ -if(_b2==aa.length-1){ -$("
                                      ").appendTo(_b0); -}else{ -$("
                                      ").appendTo(tr); -} -} -} -} -} -} -} -} -} -} -} -} -if(_af.buttons){ -$("
                                      ").appendTo(tr); -if($.isArray(_af.buttons)){ -for(var i=0;i<_af.buttons.length;i++){ -var btn=_af.buttons[i]; -if(btn=="-"){ -$("
                                      ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var a=$("").appendTo(td); -a[0].onclick=eval(btn.handler||function(){ -}); -a.linkbutton($.extend({},btn,{plain:true})); -} -} -}else{ -var td=$("").appendTo(tr); -$(_af.buttons).appendTo(td).show(); -} -} -$("
                                      ").appendTo(_b0); -function _b4(_b6){ -var btn=_af.nav[_b6]; -var a=$("").appendTo(tr); -a.wrap(""); -a.linkbutton({iconCls:btn.iconCls,plain:true})._unbind(".pagination")._bind("click.pagination",function(){ -btn.handler.call(_ad); -}); -return a; -}; -function _b1(aa,_b7){ -var _b8=$.inArray(_b7,aa); -if(_b8>=0){ -aa.splice(_b8,1); -} -return aa; -}; -}; -function _b9(_ba,_bb){ -var _bc=$.data(_ba,"pagination").options; -if(_bc.onBeforeSelectPage.call(_ba,_bb,_bc.pageSize)==false){ -_bd(_ba); -return; -} -_bd(_ba,{pageNumber:_bb}); -_bc.onSelectPage.call(_ba,_bc.pageNumber,_bc.pageSize); -}; -function _bd(_be,_bf){ -var _c0=$.data(_be,"pagination"); -var _c1=_c0.options; -var bb=_c0.bb; -$.extend(_c1,_bf||{}); -var ps=$(_be).find("select.pagination-page-list"); -if(ps.length){ -ps.val(_c1.pageSize+""); -_c1.pageSize=parseInt(ps.val()); -} -var _c2=Math.ceil(_c1.total/_c1.pageSize)||1; -if(_c1.pageNumber<1){ -_c1.pageNumber=1; -} -if(_c1.pageNumber>_c2){ -_c1.pageNumber=_c2; -} -if(_c1.total==0){ -_c1.pageNumber=0; -_c2=0; -} -if(bb.num){ -bb.num.val(_c1.pageNumber); -} -if(bb.after){ -bb.after.html(_c1.afterPageText.replace(/{pages}/,_c2)); -} -var td=$(_be).find("td.pagination-links"); -if(td.length){ -td.empty(); -var _c3=_c1.pageNumber-Math.floor(_c1.links/2); -if(_c3<1){ -_c3=1; -} -var _c4=_c3+_c1.links-1; -if(_c4>_c2){ -_c4=_c2; -} -_c3=_c4-_c1.links+1; -if(_c3<1){ -_c3=1; -} -for(var i=_c3;i<=_c4;i++){ -var a=$("").appendTo(td); -a.linkbutton({plain:true,text:i}); -if(i==_c1.pageNumber){ -a.linkbutton("select"); -}else{ -a._unbind(".pagination")._bind("click.pagination",{pageNumber:i},function(e){ -_b9(_be,e.data.pageNumber); -}); -} -} -} -var _c5=_c1.displayMsg; -_c5=_c5.replace(/{from}/,_c1.total==0?0:_c1.pageSize*(_c1.pageNumber-1)+1); -_c5=_c5.replace(/{to}/,Math.min(_c1.pageSize*(_c1.pageNumber),_c1.total)); -_c5=_c5.replace(/{total}/,_c1.total); -$(_be).find("div.pagination-info").html(_c5); -if(bb.first){ -bb.first.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)}); -} -if(bb.prev){ -bb.prev.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)}); -} -if(bb.next){ -bb.next.linkbutton({disabled:(_c1.pageNumber==_c2)}); -} -if(bb.last){ -bb.last.linkbutton({disabled:(_c1.pageNumber==_c2)}); -} -_c6(_be,_c1.loading); -}; -function _c6(_c7,_c8){ -var _c9=$.data(_c7,"pagination"); -var _ca=_c9.options; -_ca.loading=_c8; -if(_ca.showRefresh&&_c9.bb.refresh){ -_c9.bb.refresh.linkbutton({iconCls:(_ca.loading?"pagination-loading":"pagination-load")}); -} -}; -$.fn.pagination=function(_cb,_cc){ -if(typeof _cb=="string"){ -return $.fn.pagination.methods[_cb](this,_cc); -} -_cb=_cb||{}; -return this.each(function(){ -var _cd; -var _ce=$.data(this,"pagination"); -if(_ce){ -_cd=$.extend(_ce.options,_cb); -}else{ -_cd=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_cb); -$.data(this,"pagination",{options:_cd}); -} -_ac(this); -_bd(this); -}); -}; -$.fn.pagination.methods={options:function(jq){ -return $.data(jq[0],"pagination").options; -},loading:function(jq){ -return jq.each(function(){ -_c6(this,true); -}); -},loaded:function(jq){ -return jq.each(function(){ -_c6(this,false); -}); -},refresh:function(jq,_cf){ -return jq.each(function(){ -_bd(this,_cf); -}); -},select:function(jq,_d0){ -return jq.each(function(){ -_b9(this,_d0); -}); -}}; -$.fn.pagination.parseOptions=function(_d1){ -var t=$(_d1); -return $.extend({},$.parser.parseOptions(_d1,[{total:"number",pageSize:"number",pageNumber:"number",links:"number"},{loading:"boolean",showPageList:"boolean",showPageInfo:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)}); -}; -$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showPageInfo:true,showRefresh:true,links:10,layout:["list","sep","first","prev","sep","manual","sep","next","last","sep","refresh","info"],onBeforeSelectPage:function(_d2,_d3){ -},onSelectPage:function(_d4,_d5){ -},onBeforeRefresh:function(_d6,_d7){ -},onRefresh:function(_d8,_d9){ -},onChangePageSize:function(_da){ -},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){ -var _db=$(this).pagination("options"); -if(_db.pageNumber>1){ -$(this).pagination("select",1); -} -}},prev:{iconCls:"pagination-prev",handler:function(){ -var _dc=$(this).pagination("options"); -if(_dc.pageNumber>1){ -$(this).pagination("select",_dc.pageNumber-1); -} -}},next:{iconCls:"pagination-next",handler:function(){ -var _dd=$(this).pagination("options"); -var _de=Math.ceil(_dd.total/_dd.pageSize); -if(_dd.pageNumber<_de){ -$(this).pagination("select",_dd.pageNumber+1); -} -}},last:{iconCls:"pagination-last",handler:function(){ -var _df=$(this).pagination("options"); -var _e0=Math.ceil(_df.total/_df.pageSize); -if(_df.pageNumber<_e0){ -$(this).pagination("select",_e0); -} -}},refresh:{iconCls:"pagination-refresh",handler:function(){ -var _e1=$(this).pagination("options"); -if(_e1.onBeforeRefresh.call(this,_e1.pageNumber,_e1.pageSize)!=false){ -$(this).pagination("select",_e1.pageNumber); -_e1.onRefresh.call(this,_e1.pageNumber,_e1.pageSize); -} -}}}}; -})(jQuery); -(function($){ -function _e2(_e3){ -var _e4=$(_e3); -_e4.addClass("tree"); -return _e4; -}; -function _e5(_e6){ -var _e7=$.data(_e6,"tree").options; -$(_e6)._unbind()._bind("mouseover",function(e){ -var tt=$(e.target); -var _e8=tt.closest("div.tree-node"); -if(!_e8.length){ -return; -} -_e8.addClass("tree-node-hover"); -if(tt.hasClass("tree-hit")){ -if(tt.hasClass("tree-expanded")){ -tt.addClass("tree-expanded-hover"); -}else{ -tt.addClass("tree-collapsed-hover"); -} -} -e.stopPropagation(); -})._bind("mouseout",function(e){ -var tt=$(e.target); -var _e9=tt.closest("div.tree-node"); -if(!_e9.length){ -return; -} -_e9.removeClass("tree-node-hover"); -if(tt.hasClass("tree-hit")){ -if(tt.hasClass("tree-expanded")){ -tt.removeClass("tree-expanded-hover"); -}else{ -tt.removeClass("tree-collapsed-hover"); -} -} -e.stopPropagation(); -})._bind("click",function(e){ -var tt=$(e.target); -var _ea=tt.closest("div.tree-node"); -if(!_ea.length){ -return; -} -if(tt.hasClass("tree-hit")){ -_148(_e6,_ea[0]); -return false; -}else{ -if(tt.hasClass("tree-checkbox")){ -_10f(_e6,_ea[0]); -return false; -}else{ -_18d(_e6,_ea[0]); -_e7.onClick.call(_e6,_ed(_e6,_ea[0])); -} -} -e.stopPropagation(); -})._bind("dblclick",function(e){ -var _eb=$(e.target).closest("div.tree-node"); -if(!_eb.length){ -return; -} -_18d(_e6,_eb[0]); -_e7.onDblClick.call(_e6,_ed(_e6,_eb[0])); -e.stopPropagation(); -})._bind("contextmenu",function(e){ -var _ec=$(e.target).closest("div.tree-node"); -if(!_ec.length){ -return; -} -_e7.onContextMenu.call(_e6,e,_ed(_e6,_ec[0])); -e.stopPropagation(); -}); -}; -function _ee(_ef){ -var _f0=$.data(_ef,"tree").options; -_f0.dnd=false; -var _f1=$(_ef).find("div.tree-node"); -_f1.draggable("disable"); -_f1.css("cursor","pointer"); -}; -function _f2(_f3){ -var _f4=$.data(_f3,"tree"); -var _f5=_f4.options; -var _f6=_f4.tree; -_f4.disabledNodes=[]; -_f5.dnd=true; -_f6.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_f7){ -var p=$("
                                      ").appendTo("body"); -p.html(" "+$(_f7).find(".tree-title").html()); -p.hide(); -return p; -},deltaX:15,deltaY:15,onBeforeDrag:function(e){ -if(_f5.onBeforeDrag.call(_f3,_ed(_f3,this))==false){ -return false; -} -if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){ -return false; -} -if(e.which!=1){ -return false; -} -var _f8=$(this).find("span.tree-indent"); -if(_f8.length){ -e.data.offsetWidth-=_f8.length*_f8.width(); -} -},onStartDrag:function(e){ -$(this).next("ul").find("div.tree-node").each(function(){ -$(this).droppable("disable"); -_f4.disabledNodes.push(this); -}); -$(this).draggable("proxy").css({left:-10000,top:-10000}); -_f5.onStartDrag.call(_f3,_ed(_f3,this)); -var _f9=_ed(_f3,this); -if(_f9.id==undefined){ -_f9.id="easyui_tree_node_id_temp"; -_12f(_f3,_f9); -} -_f4.draggingNodeId=_f9.id; -},onDrag:function(e){ -var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY; -var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); -if(d>3){ -$(this).draggable("proxy").show(); -} -this.pageY=e.pageY; -},onStopDrag:function(){ -for(var i=0;i<_f4.disabledNodes.length;i++){ -$(_f4.disabledNodes[i]).droppable("enable"); -} -_f4.disabledNodes=[]; -var _fa=_185(_f3,_f4.draggingNodeId); -if(_fa&&_fa.id=="easyui_tree_node_id_temp"){ -_fa.id=""; -_12f(_f3,_fa); -} -_f5.onStopDrag.call(_f3,_fa); -}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_fb){ -if(_f5.onDragEnter.call(_f3,this,_fc(_fb))==false){ -_fd(_fb,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -$(this).droppable("disable"); -_f4.disabledNodes.push(this); -} -},onDragOver:function(e,_fe){ -if($(this).droppable("options").disabled){ -return; -} -var _ff=_fe.pageY; -var top=$(this).offset().top; -var _100=top+$(this).outerHeight(); -_fd(_fe,true); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -if(_ff>top+(_100-top)/2){ -if(_100-_ff<5){ -$(this).addClass("tree-node-bottom"); -}else{ -$(this).addClass("tree-node-append"); -} -}else{ -if(_ff-top<5){ -$(this).addClass("tree-node-top"); -}else{ -$(this).addClass("tree-node-append"); -} -} -if(_f5.onDragOver.call(_f3,this,_fc(_fe))==false){ -_fd(_fe,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -$(this).droppable("disable"); -_f4.disabledNodes.push(this); -} -},onDragLeave:function(e,_101){ -_fd(_101,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -_f5.onDragLeave.call(_f3,this,_fc(_101)); -},onDrop:function(e,_102){ -var dest=this; -var _103,_104; -if($(this).hasClass("tree-node-append")){ -_103=_105; -_104="append"; -}else{ -_103=_106; -_104=$(this).hasClass("tree-node-top")?"top":"bottom"; -} -if(_f5.onBeforeDrop.call(_f3,dest,_fc(_102),_104)==false){ -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -return; -} -_103(_102,dest,_104); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -}}); -function _fc(_107,pop){ -return $(_107).closest("ul.tree").tree(pop?"pop":"getData",_107); -}; -function _fd(_108,_109){ -var icon=$(_108).draggable("proxy").find("span.tree-dnd-icon"); -icon.removeClass("tree-dnd-yes tree-dnd-no").addClass(_109?"tree-dnd-yes":"tree-dnd-no"); -}; -function _105(_10a,dest){ -if(_ed(_f3,dest).state=="closed"){ -_140(_f3,dest,function(){ -_10b(); -}); -}else{ -_10b(); -} -function _10b(){ -var node=_fc(_10a,true); -$(_f3).tree("append",{parent:dest,data:[node]}); -_f5.onDrop.call(_f3,dest,node,"append"); -}; -}; -function _106(_10c,dest,_10d){ -var _10e={}; -if(_10d=="top"){ -_10e.before=dest; -}else{ -_10e.after=dest; -} -var node=_fc(_10c,true); -_10e.data=node; -$(_f3).tree("insert",_10e); -_f5.onDrop.call(_f3,dest,node,_10d); -}; -}; -function _10f(_110,_111,_112,_113){ -var _114=$.data(_110,"tree"); -var opts=_114.options; -if(!opts.checkbox){ -return; -} -var _115=_ed(_110,_111); -if(!_115.checkState){ -return; -} -var ck=$(_111).find(".tree-checkbox"); -if(_112==undefined){ -if(ck.hasClass("tree-checkbox1")){ -_112=false; -}else{ -if(ck.hasClass("tree-checkbox0")){ -_112=true; -}else{ -if(_115._checked==undefined){ -_115._checked=$(_111).find(".tree-checkbox").hasClass("tree-checkbox1"); -} -_112=!_115._checked; -} -} -} -_115._checked=_112; -if(_112){ -if(ck.hasClass("tree-checkbox1")){ -return; -} -}else{ -if(ck.hasClass("tree-checkbox0")){ -return; -} -} -if(!_113){ -if(opts.onBeforeCheck.call(_110,_115,_112)==false){ -return; -} -} -if(opts.cascadeCheck){ -_116(_110,_115,_112); -_117(_110,_115); -}else{ -_118(_110,_115,_112?"1":"0"); -} -if(!_113){ -opts.onCheck.call(_110,_115,_112); -} -}; -function _116(_119,_11a,_11b){ -var opts=$.data(_119,"tree").options; -var flag=_11b?1:0; -_118(_119,_11a,flag); -if(opts.deepCheck){ -$.easyui.forEach(_11a.children||[],true,function(n){ -_118(_119,n,flag); -}); -}else{ -var _11c=[]; -if(_11a.children&&_11a.children.length){ -_11c.push(_11a); -} -$.easyui.forEach(_11a.children||[],true,function(n){ -if(!n.hidden){ -_118(_119,n,flag); -if(n.children&&n.children.length){ -_11c.push(n); -} -} -}); -for(var i=_11c.length-1;i>=0;i--){ -var node=_11c[i]; -_118(_119,node,_11d(node)); -} -} -}; -function _118(_11e,_11f,flag){ -var opts=$.data(_11e,"tree").options; -if(!_11f.checkState||flag==undefined){ -return; -} -if(_11f.hidden&&!opts.deepCheck){ -return; -} -var ck=$("#"+_11f.domId).find(".tree-checkbox"); -_11f.checkState=["unchecked","checked","indeterminate"][flag]; -_11f.checked=(_11f.checkState=="checked"); -ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); -ck.addClass("tree-checkbox"+flag); -}; -function _117(_120,_121){ -var pd=_122(_120,$("#"+_121.domId)[0]); -if(pd){ -_118(_120,pd,_11d(pd)); -_117(_120,pd); -} -}; -function _11d(row){ -var c0=0; -var c1=0; -var len=0; -$.easyui.forEach(row.children||[],false,function(r){ -if(r.checkState){ -len++; -if(r.checkState=="checked"){ -c1++; -}else{ -if(r.checkState=="unchecked"){ -c0++; -} -} -} -}); -if(len==0){ -return undefined; -} -var flag=0; -if(c0==len){ -flag=0; -}else{ -if(c1==len){ -flag=1; -}else{ -flag=2; -} -} -return flag; -}; -function _123(_124,_125){ -var opts=$.data(_124,"tree").options; -if(!opts.checkbox){ -return; -} -var node=$(_125); -var ck=node.find(".tree-checkbox"); -var _126=_ed(_124,_125); -if(opts.view.hasCheckbox(_124,_126)){ -if(!ck.length){ -_126.checkState=_126.checkState||"unchecked"; -$("").insertBefore(node.find(".tree-title")); -} -if(_126.checkState=="checked"){ -_10f(_124,_125,true,true); -}else{ -if(_126.checkState=="unchecked"){ -_10f(_124,_125,false,true); -}else{ -var flag=_11d(_126); -if(flag===0){ -_10f(_124,_125,false,true); -}else{ -if(flag===1){ -_10f(_124,_125,true,true); -} -} -} -} -}else{ -ck.remove(); -_126.checkState=undefined; -_126.checked=undefined; -_117(_124,_126); -} -}; -function _127(_128,ul,data,_129,_12a){ -var _12b=$.data(_128,"tree"); -var opts=_12b.options; -var _12c=$(ul).prevAll("div.tree-node:first"); -data=opts.loadFilter.call(_128,data,_12c[0]); -var _12d=_12e(_128,"domId",_12c.attr("id")); -if(!_129){ -_12d?_12d.children=data:_12b.data=data; -$(ul).empty(); -}else{ -if(_12d){ -_12d.children?_12d.children=_12d.children.concat(data):_12d.children=data; -}else{ -_12b.data=_12b.data.concat(data); -} -} -opts.view.render.call(opts.view,_128,ul,data); -if(opts.dnd){ -_f2(_128); -} -if(_12d){ -_12f(_128,_12d); -} -for(var i=0;i<_12b.tmpIds.length;i++){ -_10f(_128,$("#"+_12b.tmpIds[i])[0],true,true); -} -_12b.tmpIds=[]; -setTimeout(function(){ -_130(_128,_128); -},0); -if(!_12a){ -opts.onLoadSuccess.call(_128,_12d,data); -} -}; -function _130(_131,ul,_132){ -var opts=$.data(_131,"tree").options; -if(opts.lines){ -$(_131).addClass("tree-lines"); -}else{ -$(_131).removeClass("tree-lines"); -return; -} -if(!_132){ -_132=true; -$(_131).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); -$(_131).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one"); -var _133=$(_131).tree("getRoots"); -if(_133.length>1){ -$(_133[0].target).addClass("tree-root-first"); -}else{ -if(_133.length==1){ -$(_133[0].target).addClass("tree-root-one"); -} -} -} -$(ul).children("li").each(function(){ -var node=$(this).children("div.tree-node"); -var ul=node.next("ul"); -if(ul.length){ -if($(this).next().length){ -_134(node); -} -_130(_131,ul,_132); -}else{ -_135(node); -} -}); -var _136=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last"); -_136.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom"); -function _135(node,_137){ -var icon=node.find("span.tree-icon"); -icon.prev("span.tree-indent").addClass("tree-join"); -}; -function _134(node){ -var _138=node.find("span.tree-indent, span.tree-hit").length; -node.next().find("div.tree-node").each(function(){ -$(this).children("span:eq("+(_138-1)+")").addClass("tree-line"); -}); -}; -}; -function _139(_13a,ul,_13b,_13c){ -var opts=$.data(_13a,"tree").options; -_13b=$.extend({},opts.queryParams,_13b||{}); -var _13d=null; -if(_13a!=ul){ -var node=$(ul).prev(); -_13d=_ed(_13a,node[0]); -} -if(opts.onBeforeLoad.call(_13a,_13d,_13b)==false){ -return; -} -var _13e=$(ul).prev().children("span.tree-folder"); -_13e.addClass("tree-loading"); -var _13f=opts.loader.call(_13a,_13b,function(data){ -_13e.removeClass("tree-loading"); -_127(_13a,ul,data); -if(_13c){ -_13c(); -} -},function(){ -_13e.removeClass("tree-loading"); -opts.onLoadError.apply(_13a,arguments); -if(_13c){ -_13c(); -} -}); -if(_13f==false){ -_13e.removeClass("tree-loading"); -} -}; -function _140(_141,_142,_143){ -var opts=$.data(_141,"tree").options; -var hit=$(_142).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -return; -} -var node=_ed(_141,_142); -if(opts.onBeforeExpand.call(_141,node)==false){ -return; -} -hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); -hit.next().addClass("tree-folder-open"); -var ul=$(_142).next(); -if(ul.length){ -if(opts.animate){ -ul.slideDown("normal",function(){ -node.state="open"; -opts.onExpand.call(_141,node); -if(_143){ -_143(); -} -}); -}else{ -ul.css("display","block"); -node.state="open"; -opts.onExpand.call(_141,node); -if(_143){ -_143(); -} -} -}else{ -var _144=$("
                                        ").insertAfter(_142); -_139(_141,_144[0],{id:node.id},function(){ -if(_144.is(":empty")){ -_144.remove(); -} -if(opts.animate){ -_144.slideDown("normal",function(){ -node.state="open"; -opts.onExpand.call(_141,node); -if(_143){ -_143(); -} -}); -}else{ -_144.css("display","block"); -node.state="open"; -opts.onExpand.call(_141,node); -if(_143){ -_143(); -} -} -}); -} -}; -function _145(_146,_147){ -var opts=$.data(_146,"tree").options; -var hit=$(_147).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-collapsed")){ -return; -} -var node=_ed(_146,_147); -if(opts.onBeforeCollapse.call(_146,node)==false){ -return; -} -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -hit.next().removeClass("tree-folder-open"); -var ul=$(_147).next(); -if(opts.animate){ -ul.slideUp("normal",function(){ -node.state="closed"; -opts.onCollapse.call(_146,node); -}); -}else{ -ul.css("display","none"); -node.state="closed"; -opts.onCollapse.call(_146,node); -} -}; -function _148(_149,_14a){ -var hit=$(_14a).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -_145(_149,_14a); -}else{ -_140(_149,_14a); -} -}; -function _14b(_14c,_14d){ -var _14e=_14f(_14c,_14d); -if(_14d){ -_14e.unshift(_ed(_14c,_14d)); -} -for(var i=0;i<_14e.length;i++){ -_140(_14c,_14e[i].target); -} -}; -function _150(_151,_152){ -var _153=[]; -var p=_122(_151,_152); -while(p){ -_153.unshift(p); -p=_122(_151,p.target); -} -for(var i=0;i<_153.length;i++){ -_140(_151,_153[i].target); -} -}; -function _154(_155,_156){ -var c=$(_155).parent(); -while(c[0].tagName!="BODY"&&c.css("overflow-y")!="auto"){ -c=c.parent(); -} -var n=$(_156); -var ntop=n.offset().top; -if(c[0].tagName!="BODY"){ -var ctop=c.offset().top; -if(ntopctop+c.outerHeight()-18){ -c.scrollTop(c.scrollTop()+ntop+n.outerHeight()-ctop-c.outerHeight()+18); -} -} -}else{ -c.scrollTop(ntop); -} -}; -function _157(_158,_159){ -var _15a=_14f(_158,_159); -if(_159){ -_15a.unshift(_ed(_158,_159)); -} -for(var i=0;i<_15a.length;i++){ -_145(_158,_15a[i].target); -} -}; -function _15b(_15c,_15d){ -var node=$(_15d.parent); -var data=_15d.data; -if(!data){ -return; -} -data=$.isArray(data)?data:[data]; -if(!data.length){ -return; -} -var ul; -if(node.length==0){ -ul=$(_15c); -}else{ -if(_15e(_15c,node[0])){ -var _15f=node.find("span.tree-icon"); -_15f.removeClass("tree-file").addClass("tree-folder tree-folder-open"); -var hit=$("").insertBefore(_15f); -if(hit.prev().length){ -hit.prev().remove(); -} -} -ul=node.next(); -if(!ul.length){ -ul=$("
                                          ").insertAfter(node); -} -} -_127(_15c,ul[0],data,true,true); -}; -function _160(_161,_162){ -var ref=_162.before||_162.after; -var _163=_122(_161,ref); -var data=_162.data; -if(!data){ -return; -} -data=$.isArray(data)?data:[data]; -if(!data.length){ -return; -} -_15b(_161,{parent:(_163?_163.target:null),data:data}); -var _164=_163?_163.children:$(_161).tree("getRoots"); -for(var i=0;i<_164.length;i++){ -if(_164[i].domId==$(ref).attr("id")){ -for(var j=data.length-1;j>=0;j--){ -_164.splice((_162.before?i:(i+1)),0,data[j]); -} -_164.splice(_164.length-data.length,data.length); -break; -} -} -var li=$(); -for(var i=0;i").prependTo(node); -node.next().remove(); -} -_12f(_166,_168); -} -_130(_166,_166); -function del(_169){ -var id=$(_169).attr("id"); -var _16a=_122(_166,_169); -var cc=_16a?_16a.children:$.data(_166,"tree").data; -for(var i=0;i").appendTo(nt); -_196.val(node.text).focus(); -_196.width(_195+20); -_196._outerHeight(opts.editorHeight); -_196._bind("click",function(e){ -return false; -})._bind("mousedown",function(e){ -e.stopPropagation(); -})._bind("mousemove",function(e){ -e.stopPropagation(); -})._bind("keydown",function(e){ -if(e.keyCode==13){ -_197(_193,_194); -return false; -}else{ -if(e.keyCode==27){ -_19b(_193,_194); -return false; -} -} -})._bind("blur",function(e){ -e.stopPropagation(); -_197(_193,_194); -}); -}; -function _197(_198,_199){ -var opts=$.data(_198,"tree").options; -$(_199).css("position",""); -var _19a=$(_199).find("input.tree-editor"); -var val=_19a.val(); -_19a.remove(); -var node=_ed(_198,_199); -node.text=val; -_12f(_198,node); -opts.onAfterEdit.call(_198,node); -}; -function _19b(_19c,_19d){ -var opts=$.data(_19c,"tree").options; -$(_19d).css("position",""); -$(_19d).find("input.tree-editor").remove(); -var node=_ed(_19c,_19d); -_12f(_19c,node); -opts.onCancelEdit.call(_19c,node); -}; -function _19e(_19f,q){ -var _1a0=$.data(_19f,"tree"); -var opts=_1a0.options; -var ids={}; -$.easyui.forEach(_1a0.data,true,function(node){ -if(opts.filter.call(_19f,q,node)){ -$("#"+node.domId).removeClass("tree-node-hidden"); -ids[node.domId]=1; -node.hidden=false; -}else{ -$("#"+node.domId).addClass("tree-node-hidden"); -node.hidden=true; -} -}); -for(var id in ids){ -_1a1(id); -} -function _1a1(_1a2){ -var p=$(_19f).tree("getParent",$("#"+_1a2)[0]); -while(p){ -$(p.target).removeClass("tree-node-hidden"); -p.hidden=false; -p=$(_19f).tree("getParent",p.target); -} -}; -}; -$.fn.tree=function(_1a3,_1a4){ -if(typeof _1a3=="string"){ -return $.fn.tree.methods[_1a3](this,_1a4); -} -var _1a3=_1a3||{}; -return this.each(function(){ -var _1a5=$.data(this,"tree"); -var opts; -if(_1a5){ -opts=$.extend(_1a5.options,_1a3); -_1a5.options=opts; -}else{ -opts=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_1a3); -$.data(this,"tree",{options:opts,tree:_e2(this),data:[],tmpIds:[]}); -var data=$.fn.tree.parseData(this); -if(data.length){ -_127(this,this,data); -} -} -_e5(this); -if(opts.data){ -_127(this,this,$.extend(true,[],opts.data)); -} -_139(this,this); -}); -}; -$.fn.tree.methods={options:function(jq){ -return $.data(jq[0],"tree").options; -},loadData:function(jq,data){ -return jq.each(function(){ -_127(this,this,data); -}); -},getNode:function(jq,_1a6){ -return _ed(jq[0],_1a6); -},getData:function(jq,_1a7){ -return _180(jq[0],_1a7); -},reload:function(jq,_1a8){ -return jq.each(function(){ -if(_1a8){ -var node=$(_1a8); -var hit=node.children("span.tree-hit"); -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -node.next().remove(); -_140(this,_1a8); -}else{ -$(this).empty(); -_139(this,this); -} -}); -},getRoot:function(jq,_1a9){ -return _16d(jq[0],_1a9); -},getRoots:function(jq){ -return _171(jq[0]); -},getParent:function(jq,_1aa){ -return _122(jq[0],_1aa); -},getChildren:function(jq,_1ab){ -return _14f(jq[0],_1ab); -},getChecked:function(jq,_1ac){ -return _17a(jq[0],_1ac); -},getSelected:function(jq){ -return _17e(jq[0]); -},isLeaf:function(jq,_1ad){ -return _15e(jq[0],_1ad); -},find:function(jq,id){ -return _185(jq[0],id); -},findBy:function(jq,_1ae){ -return _12e(jq[0],_1ae.field,_1ae.value); -},select:function(jq,_1af){ -return jq.each(function(){ -_18d(this,_1af); -}); -},check:function(jq,_1b0){ -return jq.each(function(){ -_10f(this,_1b0,true); -}); -},uncheck:function(jq,_1b1){ -return jq.each(function(){ -_10f(this,_1b1,false); -}); -},collapse:function(jq,_1b2){ -return jq.each(function(){ -_145(this,_1b2); -}); -},expand:function(jq,_1b3){ -return jq.each(function(){ -_140(this,_1b3); -}); -},collapseAll:function(jq,_1b4){ -return jq.each(function(){ -_157(this,_1b4); -}); -},expandAll:function(jq,_1b5){ -return jq.each(function(){ -_14b(this,_1b5); -}); -},expandTo:function(jq,_1b6){ -return jq.each(function(){ -_150(this,_1b6); -}); -},scrollTo:function(jq,_1b7){ -return jq.each(function(){ -_154(this,_1b7); -}); -},toggle:function(jq,_1b8){ -return jq.each(function(){ -_148(this,_1b8); -}); -},append:function(jq,_1b9){ -return jq.each(function(){ -_15b(this,_1b9); -}); -},insert:function(jq,_1ba){ -return jq.each(function(){ -_160(this,_1ba); -}); -},remove:function(jq,_1bb){ -return jq.each(function(){ -_165(this,_1bb); -}); -},pop:function(jq,_1bc){ -var node=jq.tree("getData",_1bc); -jq.tree("remove",_1bc); -return node; -},update:function(jq,_1bd){ -return jq.each(function(){ -_12f(this,$.extend({},_1bd,{checkState:_1bd.checked?"checked":(_1bd.checked===false?"unchecked":undefined)})); -}); -},enableDnd:function(jq){ -return jq.each(function(){ -_f2(this); -}); -},disableDnd:function(jq){ -return jq.each(function(){ -_ee(this); -}); -},beginEdit:function(jq,_1be){ -return jq.each(function(){ -_192(this,_1be); -}); -},endEdit:function(jq,_1bf){ -return jq.each(function(){ -_197(this,_1bf); -}); -},cancelEdit:function(jq,_1c0){ -return jq.each(function(){ -_19b(this,_1c0); -}); -},doFilter:function(jq,q){ -return jq.each(function(){ -_19e(this,q); -}); -}}; -$.fn.tree.parseOptions=function(_1c1){ -var t=$(_1c1); -return $.extend({},$.parser.parseOptions(_1c1,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}])); -}; -$.fn.tree.parseData=function(_1c2){ -var data=[]; -_1c3(data,$(_1c2)); -return data; -function _1c3(aa,tree){ -tree.children("li").each(function(){ -var node=$(this); -var item=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(node.attr("checked")?true:undefined)}); -item.text=node.children("span").html(); -if(!item.text){ -item.text=node.html(); -} -var _1c4=node.children("ul"); -if(_1c4.length){ -item.children=[]; -_1c3(item.children,_1c4); -} -aa.push(item); -}); -}; -}; -var _1c5=1; -var _1c6={render:function(_1c7,ul,data){ -var _1c8=$.data(_1c7,"tree"); -var opts=_1c8.options; -var _1c9=$(ul).prev(".tree-node"); -var _1ca=_1c9.length?$(_1c7).tree("getNode",_1c9[0]):null; -var _1cb=_1c9.find("span.tree-indent, span.tree-hit").length; -var _1cc=$(_1c7).attr("id")||""; -var cc=_1cd.call(this,_1cb,data); -$(ul).append(cc.join("")); -function _1cd(_1ce,_1cf){ -var cc=[]; -for(var i=0;i<_1cf.length;i++){ -var item=_1cf[i]; -if(item.state!="open"&&item.state!="closed"){ -item.state="open"; -} -item.domId=_1cc+"_easyui_tree_"+_1c5++; -cc.push("
                                        • "); -cc.push("
                                          "); -for(var j=0;j<_1ce;j++){ -cc.push(""); -} -if(item.state=="closed"){ -cc.push(""); -cc.push(""); -}else{ -if(item.children&&item.children.length){ -cc.push(""); -cc.push(""); -}else{ -cc.push(""); -cc.push(""); -} -} -if(this.hasCheckbox(_1c7,item)){ -var flag=0; -if(_1ca&&_1ca.checkState=="checked"&&opts.cascadeCheck){ -flag=1; -item.checked=true; -}else{ -if(item.checked){ -$.easyui.addArrayItem(_1c8.tmpIds,item.domId); -} -} -item.checkState=flag?"checked":"unchecked"; -cc.push(""); -}else{ -item.checkState=undefined; -item.checked=undefined; -} -cc.push(""+opts.formatter.call(_1c7,item)+""); -cc.push("
                                          "); -if(item.children&&item.children.length){ -var tmp=_1cd.call(this,_1ce+1,item.children); -cc.push("
                                            "); -cc=cc.concat(tmp); -cc.push("
                                          "); -} -cc.push("
                                        • "); -} -return cc; -}; -},hasCheckbox:function(_1d0,item){ -var _1d1=$.data(_1d0,"tree"); -var opts=_1d1.options; -if(opts.checkbox){ -if($.isFunction(opts.checkbox)){ -if(opts.checkbox.call(_1d0,item)){ -return true; -}else{ -return false; -} -}else{ -if(opts.onlyLeafCheck){ -if(item.state=="open"&&!(item.children&&item.children.length)){ -return true; -} -}else{ -return true; -} -} -} -return false; -}}; -$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,editorHeight:26,data:null,queryParams:{},formatter:function(node){ -return node.text; -},filter:function(q,node){ -var qq=[]; -$.map($.isArray(q)?q:[q],function(q){ -q=$.trim(q); -if(q){ -qq.push(q); -} -}); -for(var i=0;i=0){ -return true; -} -} -return !qq.length; -},loader:function(_1d3,_1d4,_1d5){ -var opts=$(this).tree("options"); -if(!opts.url){ -return false; -} -$.ajax({type:opts.method,url:opts.url,data:_1d3,dataType:"json",success:function(data){ -_1d4(data); -},error:function(){ -_1d5.apply(this,arguments); -}}); -},loadFilter:function(data,_1d6){ -return data; -},view:_1c6,onBeforeLoad:function(node,_1d7){ -},onLoadSuccess:function(node,data){ -},onLoadError:function(){ -},onClick:function(node){ -},onDblClick:function(node){ -},onBeforeExpand:function(node){ -},onExpand:function(node){ -},onBeforeCollapse:function(node){ -},onCollapse:function(node){ -},onBeforeCheck:function(node,_1d8){ -},onCheck:function(node,_1d9){ -},onBeforeSelect:function(node){ -},onSelect:function(node){ -},onContextMenu:function(e,node){ -},onBeforeDrag:function(node){ -},onStartDrag:function(node){ -},onStopDrag:function(node){ -},onDragEnter:function(_1da,_1db){ -},onDragOver:function(_1dc,_1dd){ -},onDragLeave:function(_1de,_1df){ -},onBeforeDrop:function(_1e0,_1e1,_1e2){ -},onDrop:function(_1e3,_1e4,_1e5){ -},onBeforeEdit:function(node){ -},onAfterEdit:function(node){ -},onCancelEdit:function(node){ -}}; -})(jQuery); -(function($){ -function init(_1e6){ -$(_1e6).addClass("progressbar"); -$(_1e6).html("
                                          "); -$(_1e6)._bind("_resize",function(e,_1e7){ -if($(this).hasClass("easyui-fluid")||_1e7){ -_1e8(_1e6); -} -return false; -}); -return $(_1e6); -}; -function _1e8(_1e9,_1ea){ -var opts=$.data(_1e9,"progressbar").options; -var bar=$.data(_1e9,"progressbar").bar; -if(_1ea){ -opts.width=_1ea; -} -bar._size(opts); -bar.find("div.progressbar-text").css("width",bar.width()); -bar.find("div.progressbar-text,div.progressbar-value").css({height:bar.height()+"px",lineHeight:bar.height()+"px"}); -}; -$.fn.progressbar=function(_1eb,_1ec){ -if(typeof _1eb=="string"){ -var _1ed=$.fn.progressbar.methods[_1eb]; -if(_1ed){ -return _1ed(this,_1ec); -} -} -_1eb=_1eb||{}; -return this.each(function(){ -var _1ee=$.data(this,"progressbar"); -if(_1ee){ -$.extend(_1ee.options,_1eb); -}else{ -_1ee=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_1eb),bar:init(this)}); -} -$(this).progressbar("setValue",_1ee.options.value); -_1e8(this); -}); -}; -$.fn.progressbar.methods={options:function(jq){ -return $.data(jq[0],"progressbar").options; -},resize:function(jq,_1ef){ -return jq.each(function(){ -_1e8(this,_1ef); -}); -},getValue:function(jq){ -return $.data(jq[0],"progressbar").options.value; -},setValue:function(jq,_1f0){ -if(_1f0<0){ -_1f0=0; -} -if(_1f0>100){ -_1f0=100; -} -return jq.each(function(){ -var opts=$.data(this,"progressbar").options; -var text=opts.text.replace(/{value}/,_1f0); -var _1f1=opts.value; -opts.value=_1f0; -$(this).find("div.progressbar-value").width(_1f0+"%"); -$(this).find("div.progressbar-text").html(text); -if(_1f1!=_1f0){ -opts.onChange.call(this,_1f0,_1f1); -} -}); -}}; -$.fn.progressbar.parseOptions=function(_1f2){ -return $.extend({},$.parser.parseOptions(_1f2,["width","height","text",{value:"number"}])); -}; -$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_1f3,_1f4){ -}}; -})(jQuery); -(function($){ -function init(_1f5){ -$(_1f5).addClass("tooltip-f"); -}; -function _1f6(_1f7){ -var opts=$.data(_1f7,"tooltip").options; -$(_1f7)._unbind(".tooltip")._bind(opts.showEvent+".tooltip",function(e){ -$(_1f7).tooltip("show",e); -})._bind(opts.hideEvent+".tooltip",function(e){ -$(_1f7).tooltip("hide",e); -})._bind("mousemove.tooltip",function(e){ -if(opts.trackMouse){ -opts.trackMouseX=e.pageX; -opts.trackMouseY=e.pageY; -$(_1f7).tooltip("reposition"); -} -}); -}; -function _1f8(_1f9){ -var _1fa=$.data(_1f9,"tooltip"); -if(_1fa.showTimer){ -clearTimeout(_1fa.showTimer); -_1fa.showTimer=null; -} -if(_1fa.hideTimer){ -clearTimeout(_1fa.hideTimer); -_1fa.hideTimer=null; -} -}; -function _1fb(_1fc){ -var _1fd=$.data(_1fc,"tooltip"); -if(!_1fd||!_1fd.tip){ -return; -} -var opts=_1fd.options; -var tip=_1fd.tip; -var pos={left:-100000,top:-100000}; -if($(_1fc).is(":visible")){ -pos=_1fe(opts.position); -if(opts.position=="top"&&pos.top<0){ -pos=_1fe("bottom"); -}else{ -if((opts.position=="bottom")&&(pos.top+tip._outerHeight()>$(window)._outerHeight()+$(document).scrollTop())){ -pos=_1fe("top"); -} -} -if(pos.left<0){ -if(opts.position=="left"){ -pos=_1fe("right"); -}else{ -$(_1fc).tooltip("arrow").css("left",tip._outerWidth()/2+pos.left); -pos.left=0; -} -}else{ -if(pos.left+tip._outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ -if(opts.position=="right"){ -pos=_1fe("left"); -}else{ -var left=pos.left; -pos.left=$(window)._outerWidth()+$(document)._scrollLeft()-tip._outerWidth(); -$(_1fc).tooltip("arrow").css("left",tip._outerWidth()/2-(pos.left-left)); -} -} -} -} -tip.css({left:pos.left,top:pos.top,zIndex:(opts.zIndex!=undefined?opts.zIndex:($.fn.window?$.fn.window.defaults.zIndex++:""))}); -opts.onPosition.call(_1fc,pos.left,pos.top); -function _1fe(_1ff){ -opts.position=_1ff||"bottom"; -tip.removeClass("tooltip-top tooltip-bottom tooltip-left tooltip-right").addClass("tooltip-"+opts.position); -var left,top; -var _200=$.isFunction(opts.deltaX)?opts.deltaX.call(_1fc,opts.position):opts.deltaX; -var _201=$.isFunction(opts.deltaY)?opts.deltaY.call(_1fc,opts.position):opts.deltaY; -if(opts.trackMouse){ -t=$(); -left=opts.trackMouseX+_200; -top=opts.trackMouseY+_201; -}else{ -var t=$(_1fc); -left=t.offset().left+_200; -top=t.offset().top+_201; -} -switch(opts.position){ -case "right": -left+=t._outerWidth()+12+(opts.trackMouse?12:0); -if(opts.valign=="middle"){ -top-=(tip._outerHeight()-t._outerHeight())/2; -} -break; -case "left": -left-=tip._outerWidth()+12+(opts.trackMouse?12:0); -if(opts.valign=="middle"){ -top-=(tip._outerHeight()-t._outerHeight())/2; -} -break; -case "top": -left-=(tip._outerWidth()-t._outerWidth())/2; -top-=tip._outerHeight()+12+(opts.trackMouse?12:0); -break; -case "bottom": -left-=(tip._outerWidth()-t._outerWidth())/2; -top+=t._outerHeight()+12+(opts.trackMouse?12:0); -break; -} -return {left:left,top:top}; -}; -}; -function _202(_203,e){ -var _204=$.data(_203,"tooltip"); -var opts=_204.options; -var tip=_204.tip; -if(!tip){ -tip=$("
                                          "+"
                                          "+"
                                          "+"
                                          "+"
                                          ").appendTo("body"); -_204.tip=tip; -_205(_203); -} -_1f8(_203); -_204.showTimer=setTimeout(function(){ -$(_203).tooltip("reposition"); -tip.show(); -opts.onShow.call(_203,e); -var _206=tip.children(".tooltip-arrow-outer"); -var _207=tip.children(".tooltip-arrow"); -var bc="border-"+opts.position+"-color"; -_206.add(_207).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""}); -_206.css(bc,tip.css(bc)); -_207.css(bc,tip.css("backgroundColor")); -},opts.showDelay); -}; -function _208(_209,e){ -var _20a=$.data(_209,"tooltip"); -if(_20a&&_20a.tip){ -_1f8(_209); -_20a.hideTimer=setTimeout(function(){ -_20a.tip.hide(); -_20a.options.onHide.call(_209,e); -},_20a.options.hideDelay); -} -}; -function _205(_20b,_20c){ -var _20d=$.data(_20b,"tooltip"); -var opts=_20d.options; -if(_20c){ -opts.content=_20c; -} -if(!_20d.tip){ -return; -} -var cc=typeof opts.content=="function"?opts.content.call(_20b):opts.content; -_20d.tip.children(".tooltip-content").html(cc); -opts.onUpdate.call(_20b,cc); -}; -function _20e(_20f){ -var _210=$.data(_20f,"tooltip"); -if(_210){ -_1f8(_20f); -var opts=_210.options; -if(_210.tip){ -_210.tip.remove(); -} -if(opts._title){ -$(_20f).attr("title",opts._title); -} -$.removeData(_20f,"tooltip"); -$(_20f)._unbind(".tooltip").removeClass("tooltip-f"); -opts.onDestroy.call(_20f); -} -}; -$.fn.tooltip=function(_211,_212){ -if(typeof _211=="string"){ -return $.fn.tooltip.methods[_211](this,_212); -} -_211=_211||{}; -return this.each(function(){ -var _213=$.data(this,"tooltip"); -if(_213){ -$.extend(_213.options,_211); -}else{ -$.data(this,"tooltip",{options:$.extend({},$.fn.tooltip.defaults,$.fn.tooltip.parseOptions(this),_211)}); -init(this); -} -_1f6(this); -_205(this); -}); -}; -$.fn.tooltip.methods={options:function(jq){ -return $.data(jq[0],"tooltip").options; -},tip:function(jq){ -return $.data(jq[0],"tooltip").tip; -},arrow:function(jq){ -return jq.tooltip("tip").children(".tooltip-arrow-outer,.tooltip-arrow"); -},show:function(jq,e){ -return jq.each(function(){ -_202(this,e); -}); -},hide:function(jq,e){ -return jq.each(function(){ -_208(this,e); -}); -},update:function(jq,_214){ -return jq.each(function(){ -_205(this,_214); -}); -},reposition:function(jq){ -return jq.each(function(){ -_1fb(this); -}); -},destroy:function(jq){ -return jq.each(function(){ -_20e(this); -}); -}}; -$.fn.tooltip.parseOptions=function(_215){ -var t=$(_215); -var opts=$.extend({},$.parser.parseOptions(_215,["position","showEvent","hideEvent","content",{trackMouse:"boolean",deltaX:"number",deltaY:"number",showDelay:"number",hideDelay:"number"}]),{_title:t.attr("title")}); -t.attr("title",""); -if(!opts.content){ -opts.content=opts._title; -} -return opts; -}; -$.fn.tooltip.defaults={position:"bottom",valign:"middle",content:null,trackMouse:false,deltaX:0,deltaY:0,showEvent:"mouseenter",hideEvent:"mouseleave",showDelay:200,hideDelay:100,onShow:function(e){ -},onHide:function(e){ -},onUpdate:function(_216){ -},onPosition:function(left,top){ -},onDestroy:function(){ -}}; -})(jQuery); -(function($){ -$.fn._remove=function(){ -return this.each(function(){ -$(this).remove(); -try{ -this.outerHTML=""; -} -catch(err){ -} -}); -}; -function _217(node){ -node._remove(); -}; -function _218(_219,_21a){ -var _21b=$.data(_219,"panel"); -var opts=_21b.options; -var _21c=_21b.panel; -var _21d=_21c.children(".panel-header"); -var _21e=_21c.children(".panel-body"); -var _21f=_21c.children(".panel-footer"); -var _220=(opts.halign=="left"||opts.halign=="right"); -if(_21a){ -$.extend(opts,{width:_21a.width,height:_21a.height,minWidth:_21a.minWidth,maxWidth:_21a.maxWidth,minHeight:_21a.minHeight,maxHeight:_21a.maxHeight,left:_21a.left,top:_21a.top}); -opts.hasResized=false; -} -var _221=_21c.outerWidth(); -var _222=_21c.outerHeight(); -_21c._size(opts); -var _223=_21c.outerWidth(); -var _224=_21c.outerHeight(); -if(opts.hasResized&&(_221==_223&&_222==_224)){ -return; -} -opts.hasResized=true; -if(!_220){ -_21d._outerWidth(_21c.width()); -} -_21e._outerWidth(_21c.width()); -if(!isNaN(parseInt(opts.height))){ -if(_220){ -if(opts.header){ -var _225=$(opts.header)._outerWidth(); -}else{ -_21d.css("width",""); -var _225=_21d._outerWidth(); -} -var _226=_21d.find(".panel-title"); -_225+=Math.min(_226._outerWidth(),_226._outerHeight()); -var _227=_21c.height(); -_21d._outerWidth(_225)._outerHeight(_227); -_226._outerWidth(_21d.height()); -_21e._outerWidth(_21c.width()-_225-_21f._outerWidth())._outerHeight(_227); -_21f._outerHeight(_227); -_21e.css({left:"",right:""}); -if(_21d.length){ -_21e.css(opts.halign,(_21d.position()[opts.halign]+_225)+"px"); -} -opts.panelCssWidth=_21c.css("width"); -if(opts.collapsed){ -_21c._outerWidth(_225+_21f._outerWidth()); -} -}else{ -_21e._outerHeight(_21c.height()-_21d._outerHeight()-_21f._outerHeight()); -} -}else{ -_21e.css("height",""); -var min=$.parser.parseValue("minHeight",opts.minHeight,_21c.parent()); -var max=$.parser.parseValue("maxHeight",opts.maxHeight,_21c.parent()); -var _228=_21d._outerHeight()+_21f._outerHeight()+_21c._outerHeight()-_21c.height(); -_21e._size("minHeight",min?(min-_228):""); -_21e._size("maxHeight",max?(max-_228):""); -} -_21c.css({height:(_220?undefined:""),minHeight:"",maxHeight:"",left:opts.left,top:opts.top}); -opts.onResize.apply(_219,[opts.width,opts.height]); -$(_219).panel("doLayout"); -}; -function _229(_22a,_22b){ -var _22c=$.data(_22a,"panel"); -var opts=_22c.options; -var _22d=_22c.panel; -if(_22b){ -if(_22b.left!=null){ -opts.left=_22b.left; -} -if(_22b.top!=null){ -opts.top=_22b.top; -} -} -_22d.css({left:opts.left,top:opts.top}); -_22d.find(".tooltip-f").each(function(){ -$(this).tooltip("reposition"); -}); -opts.onMove.apply(_22a,[opts.left,opts.top]); -}; -function _22e(_22f){ -$(_22f).addClass("panel-body")._size("clear"); -var _230=$("
                                          ").insertBefore(_22f); -_230[0].appendChild(_22f); -_230._bind("_resize",function(e,_231){ -if($(this).hasClass("easyui-fluid")||_231){ -_218(_22f,{}); -} -return false; -}); -return _230; -}; -function _232(_233){ -var _234=$.data(_233,"panel"); -var opts=_234.options; -var _235=_234.panel; -_235.css(opts.style); -_235.addClass(opts.cls); -_235.removeClass("panel-hleft panel-hright").addClass("panel-h"+opts.halign); -_236(); -_237(); -var _238=$(_233).panel("header"); -var body=$(_233).panel("body"); -var _239=$(_233).siblings(".panel-footer"); -if(opts.border){ -_238.removeClass("panel-header-noborder"); -body.removeClass("panel-body-noborder"); -_239.removeClass("panel-footer-noborder"); -}else{ -_238.addClass("panel-header-noborder"); -body.addClass("panel-body-noborder"); -_239.addClass("panel-footer-noborder"); -} -_238.addClass(opts.headerCls); -body.addClass(opts.bodyCls); -$(_233).attr("id",opts.id||""); -if(opts.content){ -$(_233).panel("clear"); -$(_233).html(opts.content); -$.parser.parse($(_233)); -} -function _236(){ -if(opts.noheader||(!opts.title&&!opts.header)){ -_217(_235.children(".panel-header")); -_235.children(".panel-body").addClass("panel-body-noheader"); -}else{ -if(opts.header){ -$(opts.header).addClass("panel-header").prependTo(_235); -}else{ -var _23a=_235.children(".panel-header"); -if(!_23a.length){ -_23a=$("
                                          ").prependTo(_235); -} -if(!$.isArray(opts.tools)){ -_23a.find("div.panel-tool .panel-tool-a").appendTo(opts.tools); -} -_23a.empty(); -var _23b=$("
                                          ").html(opts.title).appendTo(_23a); -if(opts.iconCls){ -_23b.addClass("panel-with-icon"); -$("
                                          ").addClass(opts.iconCls).appendTo(_23a); -} -if(opts.halign=="left"||opts.halign=="right"){ -_23b.addClass("panel-title-"+opts.titleDirection); -} -var tool=$("
                                          ").appendTo(_23a); -tool._bind("click",function(e){ -e.stopPropagation(); -}); -if(opts.tools){ -if($.isArray(opts.tools)){ -$.map(opts.tools,function(t){ -_23c(tool,t.iconCls,eval(t.handler)); -}); -}else{ -$(opts.tools).children().each(function(){ -$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(tool); -}); -} -} -if(opts.collapsible){ -_23c(tool,"panel-tool-collapse",function(){ -if(opts.collapsed==true){ -_25d(_233,true); -}else{ -_24e(_233,true); -} -}); -} -if(opts.minimizable){ -_23c(tool,"panel-tool-min",function(){ -_263(_233); -}); -} -if(opts.maximizable){ -_23c(tool,"panel-tool-max",function(){ -if(opts.maximized==true){ -_266(_233); -}else{ -_24d(_233); -} -}); -} -if(opts.closable){ -_23c(tool,"panel-tool-close",function(){ -_24f(_233); -}); -} -} -_235.children("div.panel-body").removeClass("panel-body-noheader"); -} -}; -function _23c(c,icon,_23d){ -var a=$("").addClass(icon).appendTo(c); -a._bind("click",_23d); -}; -function _237(){ -if(opts.footer){ -$(opts.footer).addClass("panel-footer").appendTo(_235); -$(_233).addClass("panel-body-nobottom"); -}else{ -_235.children(".panel-footer").remove(); -$(_233).removeClass("panel-body-nobottom"); -} -}; -}; -function _23e(_23f,_240){ -var _241=$.data(_23f,"panel"); -var opts=_241.options; -if(_242){ -opts.queryParams=_240; -} -if(!opts.href){ -return; -} -if(!_241.isLoaded||!opts.cache){ -var _242=$.extend({},opts.queryParams); -if(opts.onBeforeLoad.call(_23f,_242)==false){ -return; -} -_241.isLoaded=false; -if(opts.loadingMessage){ -$(_23f).panel("clear"); -$(_23f).html($("
                                          ").html(opts.loadingMessage)); -} -opts.loader.call(_23f,_242,function(data){ -var _243=opts.extractor.call(_23f,data); -$(_23f).panel("clear"); -$(_23f).html(_243); -$.parser.parse($(_23f)); -opts.onLoad.apply(_23f,arguments); -_241.isLoaded=true; -},function(){ -opts.onLoadError.apply(_23f,arguments); -}); -} -}; -function _244(_245){ -var t=$(_245); -t.find(".combo-f").each(function(){ -$(this).combo("destroy"); -}); -t.find(".m-btn").each(function(){ -$(this).menubutton("destroy"); -}); -t.find(".s-btn").each(function(){ -$(this).splitbutton("destroy"); -}); -t.find(".tooltip-f").each(function(){ -$(this).tooltip("destroy"); -}); -t.children("div").each(function(){ -$(this)._size("unfit"); -}); -t.empty(); -}; -function _246(_247){ -$(_247).panel("doLayout",true); -}; -function _248(_249,_24a){ -var _24b=$.data(_249,"panel"); -var opts=_24b.options; -var _24c=_24b.panel; -if(_24a!=true){ -if(opts.onBeforeOpen.call(_249)==false){ -return; -} -} -_24c.stop(true,true); -if($.isFunction(opts.openAnimation)){ -opts.openAnimation.call(_249,cb); -}else{ -switch(opts.openAnimation){ -case "slide": -_24c.slideDown(opts.openDuration,cb); -break; -case "fade": -_24c.fadeIn(opts.openDuration,cb); -break; -case "show": -_24c.show(opts.openDuration,cb); -break; -default: -_24c.show(); -cb(); -} -} -function cb(){ -opts.closed=false; -opts.minimized=false; -var tool=_24c.children(".panel-header").find("a.panel-tool-restore"); -if(tool.length){ -opts.maximized=true; -} -opts.onOpen.call(_249); -if(opts.maximized==true){ -opts.maximized=false; -_24d(_249); -} -if(opts.collapsed==true){ -opts.collapsed=false; -_24e(_249); -} -if(!opts.collapsed){ -if(opts.href&&(!_24b.isLoaded||!opts.cache)){ -_23e(_249); -_246(_249); -opts.doneLayout=true; -} -} -if(!opts.doneLayout){ -opts.doneLayout=true; -_246(_249); -} -}; -}; -function _24f(_250,_251){ -var _252=$.data(_250,"panel"); -var opts=_252.options; -var _253=_252.panel; -if(_251!=true){ -if(opts.onBeforeClose.call(_250)==false){ -return; -} -} -_253.find(".tooltip-f").each(function(){ -$(this).tooltip("hide"); -}); -_253.stop(true,true); -_253._size("unfit"); -if($.isFunction(opts.closeAnimation)){ -opts.closeAnimation.call(_250,cb); -}else{ -switch(opts.closeAnimation){ -case "slide": -_253.slideUp(opts.closeDuration,cb); -break; -case "fade": -_253.fadeOut(opts.closeDuration,cb); -break; -case "hide": -_253.hide(opts.closeDuration,cb); -break; -default: -_253.hide(); -cb(); -} -} -function cb(){ -opts.closed=true; -opts.onClose.call(_250); -}; -}; -function _254(_255,_256){ -var _257=$.data(_255,"panel"); -var opts=_257.options; -var _258=_257.panel; -if(_256!=true){ -if(opts.onBeforeDestroy.call(_255)==false){ -return; -} -} -$(_255).panel("clear").panel("clear","footer"); -_217(_258); -opts.onDestroy.call(_255); -}; -function _24e(_259,_25a){ -var opts=$.data(_259,"panel").options; -var _25b=$.data(_259,"panel").panel; -var body=_25b.children(".panel-body"); -var _25c=_25b.children(".panel-header"); -var tool=_25c.find("a.panel-tool-collapse"); -if(opts.collapsed==true){ -return; -} -body.stop(true,true); -if(opts.onBeforeCollapse.call(_259)==false){ -return; -} -tool.addClass("panel-tool-expand"); -if(_25a==true){ -if(opts.halign=="left"||opts.halign=="right"){ -_25b.animate({width:_25c._outerWidth()+_25b.children(".panel-footer")._outerWidth()},function(){ -cb(); -}); -}else{ -body.slideUp("normal",function(){ -cb(); -}); -} -}else{ -if(opts.halign=="left"||opts.halign=="right"){ -_25b._outerWidth(_25c._outerWidth()+_25b.children(".panel-footer")._outerWidth()); -} -cb(); -} -function cb(){ -body.hide(); -opts.collapsed=true; -opts.onCollapse.call(_259); -}; -}; -function _25d(_25e,_25f){ -var opts=$.data(_25e,"panel").options; -var _260=$.data(_25e,"panel").panel; -var body=_260.children(".panel-body"); -var tool=_260.children(".panel-header").find("a.panel-tool-collapse"); -if(opts.collapsed==false){ -return; -} -body.stop(true,true); -if(opts.onBeforeExpand.call(_25e)==false){ -return; -} -tool.removeClass("panel-tool-expand"); -if(_25f==true){ -if(opts.halign=="left"||opts.halign=="right"){ -body.show(); -_260.animate({width:opts.panelCssWidth},function(){ -cb(); -}); -}else{ -body.slideDown("normal",function(){ -cb(); -}); -} -}else{ -if(opts.halign=="left"||opts.halign=="right"){ -_260.css("width",opts.panelCssWidth); -} -cb(); -} -function cb(){ -body.show(); -opts.collapsed=false; -opts.onExpand.call(_25e); -_23e(_25e); -_246(_25e); -}; -}; -function _24d(_261){ -var opts=$.data(_261,"panel").options; -var _262=$.data(_261,"panel").panel; -var tool=_262.children(".panel-header").find("a.panel-tool-max"); -if(opts.maximized==true){ -return; -} -tool.addClass("panel-tool-restore"); -if(!$.data(_261,"panel").original){ -$.data(_261,"panel").original={width:opts.width,height:opts.height,left:opts.left,top:opts.top,fit:opts.fit}; -} -opts.left=0; -opts.top=0; -opts.fit=true; -_218(_261); -opts.minimized=false; -opts.maximized=true; -opts.onMaximize.call(_261); -}; -function _263(_264){ -var opts=$.data(_264,"panel").options; -var _265=$.data(_264,"panel").panel; -_265._size("unfit"); -_265.hide(); -opts.minimized=true; -opts.maximized=false; -opts.onMinimize.call(_264); -}; -function _266(_267){ -var opts=$.data(_267,"panel").options; -var _268=$.data(_267,"panel").panel; -var tool=_268.children(".panel-header").find("a.panel-tool-max"); -if(opts.maximized==false){ -return; -} -_268.show(); -tool.removeClass("panel-tool-restore"); -$.extend(opts,$.data(_267,"panel").original); -_218(_267); -opts.minimized=false; -opts.maximized=false; -$.data(_267,"panel").original=null; -opts.onRestore.call(_267); -}; -function _269(_26a,_26b){ -$.data(_26a,"panel").options.title=_26b; -$(_26a).panel("header").find("div.panel-title").html(_26b); -}; -var _26c=null; -$(window)._unbind(".panel")._bind("resize.panel",function(){ -if(_26c){ -clearTimeout(_26c); -} -_26c=setTimeout(function(){ -var _26d=$("body.layout"); -if(_26d.length){ -_26d.layout("resize"); -$("body").children(".easyui-fluid:visible").each(function(){ -$(this).triggerHandler("_resize"); -}); -}else{ -$("body").panel("doLayout"); -} -_26c=null; -},100); -}); -$.fn.panel=function(_26e,_26f){ -if(typeof _26e=="string"){ -return $.fn.panel.methods[_26e](this,_26f); -} -_26e=_26e||{}; -return this.each(function(){ -var _270=$.data(this,"panel"); -var opts; -if(_270){ -opts=$.extend(_270.options,_26e); -_270.isLoaded=false; -}else{ -opts=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_26e); -$(this).attr("title",""); -_270=$.data(this,"panel",{options:opts,panel:_22e(this),isLoaded:false}); -} -_232(this); -$(this).show(); -if(opts.doSize==true){ -_270.panel.css("display","block"); -_218(this); -} -if(opts.closed==true||opts.minimized==true){ -_270.panel.hide(); -}else{ -_248(this); -} -}); -}; -$.fn.panel.methods={options:function(jq){ -return $.data(jq[0],"panel").options; -},panel:function(jq){ -return $.data(jq[0],"panel").panel; -},header:function(jq){ -return $.data(jq[0],"panel").panel.children(".panel-header"); -},footer:function(jq){ -return jq.panel("panel").children(".panel-footer"); -},body:function(jq){ -return $.data(jq[0],"panel").panel.children(".panel-body"); -},setTitle:function(jq,_271){ -return jq.each(function(){ -_269(this,_271); -}); -},open:function(jq,_272){ -return jq.each(function(){ -_248(this,_272); -}); -},close:function(jq,_273){ -return jq.each(function(){ -_24f(this,_273); -}); -},destroy:function(jq,_274){ -return jq.each(function(){ -_254(this,_274); -}); -},clear:function(jq,type){ -return jq.each(function(){ -_244(type=="footer"?$(this).panel("footer"):this); -}); -},refresh:function(jq,href){ -return jq.each(function(){ -var _275=$.data(this,"panel"); -_275.isLoaded=false; -if(href){ -if(typeof href=="string"){ -_275.options.href=href; -}else{ -_275.options.queryParams=href; -} -} -_23e(this); -}); -},resize:function(jq,_276){ -return jq.each(function(){ -_218(this,_276||{}); -}); -},doLayout:function(jq,all){ -return jq.each(function(){ -_277(this,"body"); -_277($(this).siblings(".panel-footer")[0],"footer"); -function _277(_278,type){ -if(!_278){ -return; -} -var _279=_278==$("body")[0]; -var s=$(_278).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible,.easyui-fluid:visible").filter(function(_27a,el){ -var p=$(el).parents(".panel-"+type+":first"); -return _279?p.length==0:p[0]==_278; -}); -s.each(function(){ -$(this).triggerHandler("_resize",[all||false]); -}); -}; -}); -},move:function(jq,_27b){ -return jq.each(function(){ -_229(this,_27b); -}); -},maximize:function(jq){ -return jq.each(function(){ -_24d(this); -}); -},minimize:function(jq){ -return jq.each(function(){ -_263(this); -}); -},restore:function(jq){ -return jq.each(function(){ -_266(this); -}); -},collapse:function(jq,_27c){ -return jq.each(function(){ -_24e(this,_27c); -}); -},expand:function(jq,_27d){ -return jq.each(function(){ -_25d(this,_27d); -}); -}}; -$.fn.panel.parseOptions=function(_27e){ -var t=$(_27e); -var hh=t.children(".panel-header,header"); -var ff=t.children(".panel-footer,footer"); -return $.extend({},$.parser.parseOptions(_27e,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href","method","header","footer","halign","titleDirection",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"},"openAnimation","closeAnimation",{openDuration:"number",closeDuration:"number"},]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined),header:(hh.length?hh.removeClass("panel-header"):undefined),footer:(ff.length?ff.removeClass("panel-footer"):undefined)}); -}; -$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,halign:"top",titleDirection:"down",collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,openAnimation:false,openDuration:400,closeAnimation:false,closeDuration:400,tools:null,footer:null,header:null,queryParams:{},method:"get",href:null,loadingMessage:"Loading...",loader:function(_27f,_280,_281){ -var opts=$(this).panel("options"); -if(!opts.href){ -return false; -} -$.ajax({type:opts.method,url:opts.href,cache:false,data:_27f,dataType:"html",success:function(data){ -_280(data); -},error:function(){ -_281.apply(this,arguments); -}}); -},extractor:function(data){ -var _282=/]*>((.|[\n\r])*)<\/body>/im; -var _283=_282.exec(data); -if(_283){ -return _283[1]; -}else{ -return data; -} -},onBeforeLoad:function(_284){ -},onLoad:function(){ -},onLoadError:function(){ -},onBeforeOpen:function(){ -},onOpen:function(){ -},onBeforeClose:function(){ -},onClose:function(){ -},onBeforeDestroy:function(){ -},onDestroy:function(){ -},onResize:function(_285,_286){ -},onMove:function(left,top){ -},onMaximize:function(){ -},onRestore:function(){ -},onMinimize:function(){ -},onBeforeCollapse:function(){ -},onBeforeExpand:function(){ -},onCollapse:function(){ -},onExpand:function(){ -}}; -})(jQuery); -(function($){ -function _287(_288,_289){ -var _28a=$.data(_288,"window"); -if(_289){ -if(_289.left!=null){ -_28a.options.left=_289.left; -} -if(_289.top!=null){ -_28a.options.top=_289.top; -} -} -$(_288).panel("move",_28a.options); -if(_28a.shadow){ -_28a.shadow.css({left:_28a.options.left,top:_28a.options.top}); -} -}; -function _28b(_28c,_28d){ -var opts=$.data(_28c,"window").options; -var pp=$(_28c).window("panel"); -var _28e=pp._outerWidth(); -if(opts.inline){ -var _28f=pp.parent(); -opts.left=Math.ceil((_28f.width()-_28e)/2+_28f.scrollLeft()); -}else{ -var _290=opts.fixed?0:$(document).scrollLeft(); -opts.left=Math.ceil(($(window)._outerWidth()-_28e)/2+_290); -} -if(_28d){ -_287(_28c); -} -}; -function _291(_292,_293){ -var opts=$.data(_292,"window").options; -var pp=$(_292).window("panel"); -var _294=pp._outerHeight(); -if(opts.inline){ -var _295=pp.parent(); -opts.top=Math.ceil((_295.height()-_294)/2+_295.scrollTop()); -}else{ -var _296=opts.fixed?0:$(document).scrollTop(); -opts.top=Math.ceil(($(window)._outerHeight()-_294)/2+_296); -} -if(_293){ -_287(_292); -} -}; -function _297(_298){ -var _299=$.data(_298,"window"); -var opts=_299.options; -var win=$(_298).panel($.extend({},_299.options,{border:false,hasResized:false,doSize:true,closed:true,cls:"window "+(!opts.border?"window-thinborder window-noborder ":(opts.border=="thin"?"window-thinborder ":""))+(opts.cls||""),headerCls:"window-header "+(opts.headerCls||""),bodyCls:"window-body "+(opts.noheader?"window-body-noheader ":" ")+(opts.bodyCls||""),onBeforeDestroy:function(){ -if(opts.onBeforeDestroy.call(_298)==false){ -return false; -} -if(_299.shadow){ -_299.shadow.remove(); -} -if(_299.mask){ -_299.mask.remove(); -} -},onClose:function(){ -if(_299.shadow){ -_299.shadow.hide(); -} -if(_299.mask){ -_299.mask.hide(); -} -opts.onClose.call(_298); -},onOpen:function(){ -if(_299.mask){ -_299.mask.css($.extend({display:"block",zIndex:$.fn.window.defaults.zIndex++},$.fn.window.getMaskSize(_298))); -} -if(_299.shadow){ -_299.shadow.css({display:"block",position:(opts.fixed?"fixed":"absolute"),zIndex:$.fn.window.defaults.zIndex++,left:opts.left,top:opts.top,width:_299.window._outerWidth(),height:_299.window._outerHeight()}); -} -_299.window.css({position:(opts.fixed?"fixed":"absolute"),zIndex:$.fn.window.defaults.zIndex++}); -opts.onOpen.call(_298); -},onResize:function(_29a,_29b){ -var _29c=$(this).panel("options"); -$.extend(opts,{width:_29c.width,height:_29c.height,left:_29c.left,top:_29c.top}); -if(_299.shadow){ -_299.shadow.css({left:opts.left,top:opts.top,width:_299.window._outerWidth(),height:_299.window._outerHeight()}); -} -opts.onResize.call(_298,_29a,_29b); -},onMinimize:function(){ -if(_299.shadow){ -_299.shadow.hide(); -} -if(_299.mask){ -_299.mask.hide(); -} -_299.options.onMinimize.call(_298); -},onBeforeCollapse:function(){ -if(opts.onBeforeCollapse.call(_298)==false){ -return false; -} -if(_299.shadow){ -_299.shadow.hide(); -} -},onExpand:function(){ -if(_299.shadow){ -_299.shadow.show(); -} -opts.onExpand.call(_298); -}})); -_299.window=win.panel("panel"); -if(_299.mask){ -_299.mask.remove(); -} -if(opts.modal){ -_299.mask=$("
                                          ").insertAfter(_299.window); -} -if(_299.shadow){ -_299.shadow.remove(); -} -if(opts.shadow){ -_299.shadow=$("
                                          ").insertAfter(_299.window); -} -var _29d=opts.closed; -if(opts.left==null){ -_28b(_298); -} -if(opts.top==null){ -_291(_298); -} -_287(_298); -if(!_29d){ -win.window("open"); -} -}; -function _29e(left,top,_29f,_2a0){ -var _2a1=this; -var _2a2=$.data(_2a1,"window"); -var opts=_2a2.options; -if(!opts.constrain){ -return {}; -} -if($.isFunction(opts.constrain)){ -return opts.constrain.call(_2a1,left,top,_29f,_2a0); -} -var win=$(_2a1).window("window"); -var _2a3=opts.inline?win.parent():$(window); -var _2a4=opts.fixed?0:_2a3.scrollTop(); -if(left<0){ -left=0; -} -if(top<_2a4){ -top=_2a4; -} -if(left+_29f>_2a3.width()){ -if(_29f==win.outerWidth()){ -left=_2a3.width()-_29f; -}else{ -_29f=_2a3.width()-left; -} -} -if(top-_2a4+_2a0>_2a3.height()){ -if(_2a0==win.outerHeight()){ -top=_2a3.height()-_2a0+_2a4; -}else{ -_2a0=_2a3.height()-top+_2a4; -} -} -return {left:left,top:top,width:_29f,height:_2a0}; -}; -function _2a5(_2a6){ -var _2a7=$.data(_2a6,"window"); -var opts=_2a7.options; -_2a7.window.draggable({handle:">.panel-header>.panel-title",disabled:_2a7.options.draggable==false,onBeforeDrag:function(e){ -if(_2a7.mask){ -_2a7.mask.css("z-index",$.fn.window.defaults.zIndex++); -} -if(_2a7.shadow){ -_2a7.shadow.css("z-index",$.fn.window.defaults.zIndex++); -} -_2a7.window.css("z-index",$.fn.window.defaults.zIndex++); -},onStartDrag:function(e){ -_2a8(e); -},onDrag:function(e){ -_2a9(e); -return false; -},onStopDrag:function(e){ -_2aa(e,"move"); -}}); -_2a7.window.resizable({disabled:_2a7.options.resizable==false,onStartResize:function(e){ -_2a8(e); -},onResize:function(e){ -_2a9(e); -return false; -},onStopResize:function(e){ -_2aa(e,"resize"); -}}); -function _2a8(e){ -_2a7.window.css("position",opts.fixed?"fixed":"absolute"); -if(_2a7.shadow){ -_2a7.shadow.css("position",opts.fixed?"fixed":"absolute"); -} -if(_2a7.pmask){ -_2a7.pmask.remove(); -} -_2a7.pmask=$("
                                          ").insertAfter(_2a7.window); -_2a7.pmask.css({display:"none",position:(opts.fixed?"fixed":"absolute"),zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_2a7.window._outerWidth(),height:_2a7.window._outerHeight()}); -if(_2a7.proxy){ -_2a7.proxy.remove(); -} -_2a7.proxy=$("
                                          ").insertAfter(_2a7.window); -_2a7.proxy.css({display:"none",position:(opts.fixed?"fixed":"absolute"),zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top}); -_2a7.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); -_2a7.proxy.hide(); -setTimeout(function(){ -if(_2a7.pmask){ -_2a7.pmask.show(); -} -if(_2a7.proxy){ -_2a7.proxy.show(); -} -},500); -}; -function _2a9(e){ -$.extend(e.data,_29e.call(_2a6,e.data.left,e.data.top,e.data.width,e.data.height)); -_2a7.pmask.show(); -_2a7.proxy.css({display:"block",left:e.data.left,top:e.data.top}); -_2a7.proxy._outerWidth(e.data.width); -_2a7.proxy._outerHeight(e.data.height); -}; -function _2aa(e,_2ab){ -_2a7.window.css("position",opts.fixed?"fixed":"absolute"); -if(_2a7.shadow){ -_2a7.shadow.css("position",opts.fixed?"fixed":"absolute"); -} -$.extend(e.data,_29e.call(_2a6,e.data.left,e.data.top,e.data.width+0.1,e.data.height+0.1)); -$(_2a6).window(_2ab,e.data); -_2a7.pmask.remove(); -_2a7.pmask=null; -_2a7.proxy.remove(); -_2a7.proxy=null; -}; -}; -$(function(){ -if(!$._positionFixed){ -$(window).resize(function(){ -$("body>.window-mask:visible").css({width:"",height:""}); -setTimeout(function(){ -$("body>.window-mask:visible").css($.fn.window.getMaskSize()); -},50); -}); -} -}); -$.fn.window=function(_2ac,_2ad){ -if(typeof _2ac=="string"){ -var _2ae=$.fn.window.methods[_2ac]; -if(_2ae){ -return _2ae(this,_2ad); -}else{ -return this.panel(_2ac,_2ad); -} -} -_2ac=_2ac||{}; -return this.each(function(){ -var _2af=$.data(this,"window"); -if(_2af){ -$.extend(_2af.options,_2ac); -}else{ -_2af=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_2ac)}); -if(!_2af.options.inline){ -document.body.appendChild(this); -} -} -_297(this); -_2a5(this); -}); -}; -$.fn.window.methods={options:function(jq){ -var _2b0=jq.panel("options"); -var _2b1=$.data(jq[0],"window").options; -return $.extend(_2b1,{closed:_2b0.closed,collapsed:_2b0.collapsed,minimized:_2b0.minimized,maximized:_2b0.maximized}); -},window:function(jq){ -return $.data(jq[0],"window").window; -},move:function(jq,_2b2){ -return jq.each(function(){ -_287(this,_2b2); -}); -},hcenter:function(jq){ -return jq.each(function(){ -_28b(this,true); -}); -},vcenter:function(jq){ -return jq.each(function(){ -_291(this,true); -}); -},center:function(jq){ -return jq.each(function(){ -_28b(this); -_291(this); -_287(this); -}); -}}; -$.fn.window.getMaskSize=function(_2b3){ -var _2b4=$(_2b3).data("window"); -if(_2b4&&_2b4.options.inline){ -return {}; -}else{ -if($._positionFixed){ -return {position:"fixed"}; -}else{ -return {width:$(document).width(),height:$(document).height()}; -} -} -}; -$.fn.window.parseOptions=function(_2b5){ -return $.extend({},$.fn.panel.parseOptions(_2b5),$.parser.parseOptions(_2b5,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}])); -}; -$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,border:true,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false,fixed:false,constrain:false}); -})(jQuery); -(function($){ -function _2b6(_2b7){ -var opts=$.data(_2b7,"dialog").options; -opts.inited=false; -$(_2b7).window($.extend({},opts,{onResize:function(w,h){ -if(opts.inited){ -_2bc(this); -opts.onResize.call(this,w,h); -} -}})); -var win=$(_2b7).window("window"); -if(opts.toolbar){ -if($.isArray(opts.toolbar)){ -$(_2b7).siblings("div.dialog-toolbar").remove(); -var _2b8=$("
                                          ").appendTo(win); -var tr=_2b8.find("tr"); -for(var i=0;i
                                          ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var tool=$("").appendTo(td); -tool[0].onclick=eval(btn.handler||function(){ -}); -tool.linkbutton($.extend({},btn,{plain:true})); -} -} -}else{ -$(opts.toolbar).addClass("dialog-toolbar").appendTo(win); -$(opts.toolbar).show(); -} -}else{ -$(_2b7).siblings("div.dialog-toolbar").remove(); -} -if(opts.buttons){ -if($.isArray(opts.buttons)){ -$(_2b7).siblings("div.dialog-button").remove(); -var _2b9=$("
                                          ").appendTo(win); -for(var i=0;i").appendTo(_2b9); -if(p.handler){ -_2ba[0].onclick=p.handler; -} -_2ba.linkbutton(p); -} -}else{ -$(opts.buttons).addClass("dialog-button").appendTo(win); -$(opts.buttons).show(); -} -}else{ -$(_2b7).siblings("div.dialog-button").remove(); -} -opts.inited=true; -var _2bb=opts.closed; -win.show(); -$(_2b7).window("resize",{}); -if(_2bb){ -win.hide(); -} -}; -function _2bc(_2bd,_2be){ -var t=$(_2bd); -var opts=t.dialog("options"); -var _2bf=opts.noheader; -var tb=t.siblings(".dialog-toolbar"); -var bb=t.siblings(".dialog-button"); -tb.insertBefore(_2bd).css({borderTopWidth:(_2bf?1:0),top:(_2bf?tb.length:0)}); -bb.insertAfter(_2bd); -tb.add(bb)._outerWidth(t._outerWidth()).find(".easyui-fluid:visible").each(function(){ -$(this).triggerHandler("_resize"); -}); -var _2c0=tb._outerHeight()+bb._outerHeight(); -if(!isNaN(parseInt(opts.height))){ -t._outerHeight(t._outerHeight()-_2c0); -}else{ -var _2c1=t._size("min-height"); -if(_2c1){ -t._size("min-height",_2c1-_2c0); -} -var _2c2=t._size("max-height"); -if(_2c2){ -t._size("max-height",_2c2-_2c0); -} -} -var _2c3=$.data(_2bd,"window").shadow; -if(_2c3){ -var cc=t.panel("panel"); -_2c3.css({width:cc._outerWidth(),height:cc._outerHeight()}); -} -}; -$.fn.dialog=function(_2c4,_2c5){ -if(typeof _2c4=="string"){ -var _2c6=$.fn.dialog.methods[_2c4]; -if(_2c6){ -return _2c6(this,_2c5); -}else{ -return this.window(_2c4,_2c5); -} -} -_2c4=_2c4||{}; -return this.each(function(){ -var _2c7=$.data(this,"dialog"); -if(_2c7){ -$.extend(_2c7.options,_2c4); -}else{ -$.data(this,"dialog",{options:$.extend({},$.fn.dialog.defaults,$.fn.dialog.parseOptions(this),_2c4)}); -} -_2b6(this); -}); -}; -$.fn.dialog.methods={options:function(jq){ -var _2c8=$.data(jq[0],"dialog").options; -var _2c9=jq.panel("options"); -$.extend(_2c8,{width:_2c9.width,height:_2c9.height,left:_2c9.left,top:_2c9.top,closed:_2c9.closed,collapsed:_2c9.collapsed,minimized:_2c9.minimized,maximized:_2c9.maximized}); -return _2c8; -},dialog:function(jq){ -return jq.window("window"); -}}; -$.fn.dialog.parseOptions=function(_2ca){ -var t=$(_2ca); -return $.extend({},$.fn.window.parseOptions(_2ca),$.parser.parseOptions(_2ca,["toolbar","buttons"]),{toolbar:(t.children(".dialog-toolbar").length?t.children(".dialog-toolbar").removeClass("dialog-toolbar"):undefined),buttons:(t.children(".dialog-button").length?t.children(".dialog-button").removeClass("dialog-button"):undefined)}); -}; -$.fn.dialog.defaults=$.extend({},$.fn.window.defaults,{title:"New Dialog",collapsible:false,minimizable:false,maximizable:false,resizable:false,toolbar:null,buttons:null}); -})(jQuery); -(function($){ -function _2cb(){ -$(document)._unbind(".messager")._bind("keydown.messager",function(e){ -if(e.keyCode==27){ -$("body").children("div.messager-window").children("div.messager-body").each(function(){ -$(this).dialog("close"); -}); -}else{ -if(e.keyCode==9){ -var win=$("body").children("div.messager-window"); -if(!win.length){ -return; -} -var _2cc=win.find(".messager-input,.messager-button .l-btn"); -for(var i=0;i<_2cc.length;i++){ -if($(_2cc[i]).is(":focus")){ -$(_2cc[i>=_2cc.length-1?0:i+1]).focus(); -return false; -} -} -}else{ -if(e.keyCode==13){ -var _2cd=$(e.target).closest("input.messager-input"); -if(_2cd.length){ -var dlg=_2cd.closest(".messager-body"); -_2ce(dlg,_2cd.val()); -} -} -} -} -}); -}; -function _2cf(){ -$(document)._unbind(".messager"); -}; -function _2d0(_2d1){ -var opts=$.extend({},$.messager.defaults,{modal:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},title:"",width:300,height:150,minHeight:0,showType:"slide",showSpeed:600,content:_2d1.msg,timeout:4000},_2d1); -var dlg=$("
                                          ").appendTo("body"); -dlg.dialog($.extend({},opts,{noheader:(opts.title?false:true),openAnimation:(opts.showType),closeAnimation:(opts.showType=="show"?"hide":opts.showType),openDuration:opts.showSpeed,closeDuration:opts.showSpeed,onOpen:function(){ -dlg.dialog("dialog").hover(function(){ -if(opts.timer){ -clearTimeout(opts.timer); -} -},function(){ -_2d2(); -}); -_2d2(); -function _2d2(){ -if(opts.timeout>0){ -opts.timer=setTimeout(function(){ -if(dlg.length&&dlg.data("dialog")){ -dlg.dialog("close"); -} -},opts.timeout); -} -}; -if(_2d1.onOpen){ -_2d1.onOpen.call(this); -}else{ -opts.onOpen.call(this); -} -},onClose:function(){ -if(opts.timer){ -clearTimeout(opts.timer); -} -if(_2d1.onClose){ -_2d1.onClose.call(this); -}else{ -opts.onClose.call(this); -} -dlg.dialog("destroy"); -}})); -dlg.dialog("dialog").css(opts.style); -dlg.dialog("open"); -return dlg; -}; -function _2d3(_2d4){ -_2cb(); -var dlg=$("
                                          ").appendTo("body"); -dlg.dialog($.extend({},_2d4,{noheader:(_2d4.title?false:true),onClose:function(){ -_2cf(); -if(_2d4.onClose){ -_2d4.onClose.call(this); -} -dlg.dialog("destroy"); -_2d5(); -}})); -var win=dlg.dialog("dialog").addClass("messager-window"); -win.find(".dialog-button").addClass("messager-button").find("a:first").focus(); -return dlg; -}; -function _2ce(dlg,_2d6){ -var opts=dlg.dialog("options"); -dlg.dialog("close"); -opts.fn(_2d6); -}; -function _2d5(){ -var top=20+document.body.scrollTop+document.documentElement.scrollTop; -$("body>.messager-tip").each(function(){ -$(this).animate({top:top},200); -top+=$(this)._outerHeight()+10; -}); -}; -$.messager={show:function(_2d7){ -return _2d0(_2d7); -},tip:function(msg){ -var opts=typeof msg=="object"?msg:{msg:msg}; -if(opts.timeout==null){ -opts.timeout=2000; -} -var top=0; -var _2d8=$("body>.messager-tip").last(); -if(_2d8.length){ -top=parseInt(_2d8.css("top"))+_2d8._outerHeight(); -} -var cls=opts.icon?"messager-icon messager-"+opts.icon:""; -opts=$.extend({},$.messager.defaults,{content:"
                                          "+"
                                          "+opts.msg+"
                                          "+"
                                          ",border:false,noheader:true,modal:false,title:null,width:"auto",height:"auto",minHeight:null,shadow:false,top:top,cls:"messager-tip",bodyCls:"f-row f-vcenter f-full"},opts); -var dlg=_2d3(opts); -if(opts.timeout){ -setTimeout(function(){ -if($(dlg).closest("body").length){ -$(dlg).dialog("close"); -} -},opts.timeout); -} -setTimeout(function(){ -_2d5(); -},0); -return dlg; -},alert:function(_2d9,msg,icon,fn){ -var opts=typeof _2d9=="object"?_2d9:{title:_2d9,msg:msg,icon:icon,fn:fn}; -var cls=opts.icon?"messager-icon messager-"+opts.icon:""; -opts=$.extend({},$.messager.defaults,{content:"
                                          "+"
                                          "+opts.msg+"
                                          "+"
                                          "},opts); -if(!opts.buttons){ -opts.buttons=[{text:opts.ok,onClick:function(){ -_2ce(dlg); -}}]; -} -var dlg=_2d3(opts); -return dlg; -},confirm:function(_2da,msg,fn){ -var opts=typeof _2da=="object"?_2da:{title:_2da,msg:msg,fn:fn}; -opts=$.extend({},$.messager.defaults,{content:"
                                          "+"
                                          "+opts.msg+"
                                          "+"
                                          "},opts); -if(!opts.buttons){ -opts.buttons=[{text:opts.ok,onClick:function(){ -_2ce(dlg,true); -}},{text:opts.cancel,onClick:function(){ -_2ce(dlg,false); -}}]; -} -var dlg=_2d3(opts); -return dlg; -},prompt:function(_2db,msg,fn){ -var opts=typeof _2db=="object"?_2db:{title:_2db,msg:msg,fn:fn}; -opts=$.extend({},$.messager.defaults,{content:"
                                          "+"
                                          "+opts.msg+"
                                          "+"
                                          "+"
                                          "+"
                                          "},opts); -if(!opts.buttons){ -opts.buttons=[{text:opts.ok,onClick:function(){ -_2ce(dlg,dlg.find(".messager-input").val()); -}},{text:opts.cancel,onClick:function(){ -_2ce(dlg); -}}]; -} -var dlg=_2d3(opts); -dlg.find(".messager-input").focus(); -return dlg; -},progress:function(_2dc){ -var _2dd={bar:function(){ -return $("body>div.messager-window").find("div.messager-p-bar"); -},close:function(){ -var dlg=$("body>div.messager-window>div.messager-body:has(div.messager-progress)"); -if(dlg.length){ -dlg.dialog("close"); -} -}}; -if(typeof _2dc=="string"){ -var _2de=_2dd[_2dc]; -return _2de(); -} -_2dc=_2dc||{}; -var opts=$.extend({},{title:"",minHeight:0,content:undefined,msg:"",text:undefined,interval:300},_2dc); -var dlg=_2d3($.extend({},$.messager.defaults,{content:"
                                          "+opts.msg+"
                                          ",closable:false,doSize:false},opts,{onClose:function(){ -if(this.timer){ -clearInterval(this.timer); -} -if(_2dc.onClose){ -_2dc.onClose.call(this); -}else{ -$.messager.defaults.onClose.call(this); -} -}})); -var bar=dlg.find("div.messager-p-bar"); -bar.progressbar({text:opts.text}); -dlg.dialog("resize"); -if(opts.interval){ -dlg[0].timer=setInterval(function(){ -var v=bar.progressbar("getValue"); -v+=10; -if(v>100){ -v=0; -} -bar.progressbar("setValue",v); -},opts.interval); -} -return dlg; -}}; -$.messager.defaults=$.extend({},$.fn.dialog.defaults,{ok:"Ok",cancel:"Cancel",width:300,height:"auto",minHeight:150,modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,fn:function(){ -}}); -})(jQuery); -(function($){ -function _2df(_2e0){ -var opts=$.data(_2e0,"drawer").options; -$(_2e0).dialog($.extend({},opts,{cls:"drawer f-column window-shadow layout-panel layout-collapsed layout-panel-"+opts.region,bodyCls:"f-full",collapsed:false,top:0,left:"auto",right:"auto"})); -$(_2e0).dialog("header").find(".panel-tool-collapse").addClass("layout-button-"+(opts.region=="east"?"right":"left"))._unbind()._bind("click",function(){ -_2e2(_2e0); -}); -var _2e1=$(_2e0).dialog("dialog").width(); -$(_2e0).dialog("dialog").css({display:"",left:opts.region=="east"?"auto":-_2e1,right:opts.region=="east"?-_2e1:"auto"}); -var mask=$(_2e0).data("window").mask; -$(mask).addClass("drawer-mask").hide()._unbind()._bind("click",function(){ -_2e2(_2e0); -}); -}; -function _2e3(_2e4){ -var opts=$.data(_2e4,"drawer").options; -if(opts.onBeforeExpand.call(_2e4)==false){ -return; -} -var _2e5=$(_2e4).dialog("dialog").width(); -var mask=$(_2e4).data("window").mask; -$(mask).show(); -$(_2e4).show().css({display:""}).dialog("dialog").animate({left:opts.region=="east"?"auto":0,right:opts.region=="east"?0:"auto"},function(){ -$(this).removeClass("layout-collapsed"); -opts.collapsed=false; -opts.onExpand.call(_2e4); -}); -}; -function _2e2(_2e6){ -var opts=$.data(_2e6,"drawer").options; -if(opts.onBeforeCollapse.call(_2e6)==false){ -return; -} -var _2e7=$(_2e6).dialog("dialog").width(); -$(_2e6).show().css({display:""}).dialog("dialog").animate({left:opts.region=="east"?"auto":-_2e7,right:opts.region=="east"?-_2e7:"auto"},function(){ -$(this).addClass("layout-collapsed"); -var mask=$(_2e6).data("window").mask; -$(mask).hide(); -opts.collapsed=true; -opts.onCollapse.call(this); -}); -}; -$.fn.drawer=function(_2e8,_2e9){ -if(typeof _2e8=="string"){ -var _2ea=$.fn.drawer.methods[_2e8]; -if(_2ea){ -return _2ea(this,_2e9); -}else{ -return this.dialog(_2e8,_2e9); -} -} -_2e8=_2e8||{}; -this.each(function(){ -var _2eb=$.data(this,"drawer"); -if(_2eb){ -$.extend(_2eb.options,_2e8); -}else{ -var opts=$.extend({},$.fn.drawer.defaults,$.fn.drawer.parseOptions(this),_2e8); -$.data(this,"drawer",{options:opts}); -} -_2df(this); -}); -}; -$.fn.drawer.methods={options:function(jq){ -var opts=$.data(jq[0],"drawer").options; -return $.extend(jq.dialog("options"),{region:opts.region,collapsed:opts.collapsed}); -},expand:function(jq){ -return jq.each(function(){ -_2e3(this); -}); -},collapse:function(jq){ -return jq.each(function(){ -_2e2(this); -}); -}}; -$.fn.drawer.parseOptions=function(_2ec){ -return $.extend({},$.fn.dialog.parseOptions(_2ec),$.parser.parseOptions(_2ec,["region"])); -}; -$.fn.drawer.defaults=$.extend({},$.fn.dialog.defaults,{border:false,region:"east",title:null,shadow:false,fixed:true,collapsed:true,closable:false,modal:true,draggable:false}); -})(jQuery); -(function($){ -function _2ed(_2ee,_2ef){ -var _2f0=$.data(_2ee,"accordion"); -var opts=_2f0.options; -var _2f1=_2f0.panels; -var cc=$(_2ee); -var _2f2=(opts.halign=="left"||opts.halign=="right"); -cc.children(".panel-last").removeClass("panel-last"); -cc.children(".panel:last").addClass("panel-last"); -if(_2ef){ -$.extend(opts,{width:_2ef.width,height:_2ef.height}); -} -cc._size(opts); -var _2f3=0; -var _2f4="auto"; -var _2f5=cc.find(">.panel>.accordion-header"); -if(_2f5.length){ -if(_2f2){ -$(_2f5[0]).next().panel("resize",{width:cc.width(),height:cc.height()}); -_2f3=$(_2f5[0])._outerWidth(); -}else{ -_2f3=$(_2f5[0]).css("height","")._outerHeight(); -} -} -if(!isNaN(parseInt(opts.height))){ -if(_2f2){ -_2f4=cc.width()-_2f3*_2f5.length; -}else{ -_2f4=cc.height()-_2f3*_2f5.length; -} -} -_2f6(true,_2f4-_2f6(false)); -function _2f6(_2f7,_2f8){ -var _2f9=0; -for(var i=0;i<_2f1.length;i++){ -var p=_2f1[i]; -if(_2f2){ -var h=p.panel("header")._outerWidth(_2f3); -}else{ -var h=p.panel("header")._outerHeight(_2f3); -} -if(p.panel("options").collapsible==_2f7){ -var _2fa=isNaN(_2f8)?undefined:(_2f8+_2f3*h.length); -if(_2f2){ -p.panel("resize",{height:cc.height(),width:(_2f7?_2fa:undefined)}); -_2f9+=p.panel("panel")._outerWidth()-_2f3*h.length; -}else{ -p.panel("resize",{width:cc.width(),height:(_2f7?_2fa:undefined)}); -_2f9+=p.panel("panel").outerHeight()-_2f3*h.length; -} -} -} -return _2f9; -}; -}; -function _2fb(_2fc,_2fd,_2fe,all){ -var _2ff=$.data(_2fc,"accordion").panels; -var pp=[]; -for(var i=0;i<_2ff.length;i++){ -var p=_2ff[i]; -if(_2fd){ -if(p.panel("options")[_2fd]==_2fe){ -pp.push(p); -} -}else{ -if(p[0]==$(_2fe)[0]){ -return i; -} -} -} -if(_2fd){ -return all?pp:(pp.length?pp[0]:null); -}else{ -return -1; -} -}; -function _300(_301){ -return _2fb(_301,"collapsed",false,true); -}; -function _302(_303){ -var pp=_300(_303); -return pp.length?pp[0]:null; -}; -function _304(_305,_306){ -return _2fb(_305,null,_306); -}; -function _307(_308,_309){ -var _30a=$.data(_308,"accordion").panels; -if(typeof _309=="number"){ -if(_309<0||_309>=_30a.length){ -return null; -}else{ -return _30a[_309]; -} -} -return _2fb(_308,"title",_309); -}; -function _30b(_30c){ -var opts=$.data(_30c,"accordion").options; -var cc=$(_30c); -if(opts.border){ -cc.removeClass("accordion-noborder"); -}else{ -cc.addClass("accordion-noborder"); -} -}; -function init(_30d){ -var _30e=$.data(_30d,"accordion"); -var cc=$(_30d); -cc.addClass("accordion"); -_30e.panels=[]; -cc.children("div").each(function(){ -var opts=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); -var pp=$(this); -_30e.panels.push(pp); -_310(_30d,pp,opts); -}); -cc._bind("_resize",function(e,_30f){ -if($(this).hasClass("easyui-fluid")||_30f){ -_2ed(_30d); -} -return false; -}); -}; -function _310(_311,pp,_312){ -var opts=$.data(_311,"accordion").options; -pp.panel($.extend({},{collapsible:true,minimizable:false,maximizable:false,closable:false,doSize:false,collapsed:true,headerCls:"accordion-header",bodyCls:"accordion-body",halign:opts.halign},_312,{onBeforeExpand:function(){ -if(_312.onBeforeExpand){ -if(_312.onBeforeExpand.call(this)==false){ -return false; -} -} -if(!opts.multiple){ -var all=$.grep(_300(_311),function(p){ -return p.panel("options").collapsible; -}); -for(var i=0;i.panel-last>.accordion-header").removeClass("accordion-header-border"); -if(_312.onExpand){ -_312.onExpand.call(this); -} -opts.onSelect.call(_311,$(this).panel("options").title,_304(_311,this)); -},onBeforeCollapse:function(){ -if(_312.onBeforeCollapse){ -if(_312.onBeforeCollapse.call(this)==false){ -return false; -} -} -$(_311).find(">.panel-last>.accordion-header").addClass("accordion-header-border"); -var _314=$(this).panel("header"); -_314.removeClass("accordion-header-selected"); -_314.find(".accordion-collapse").addClass("accordion-expand"); -},onCollapse:function(){ -if(isNaN(parseInt(opts.height))){ -$(_311).find(">.panel-last>.accordion-header").removeClass("accordion-header-border"); -} -if(_312.onCollapse){ -_312.onCollapse.call(this); -} -opts.onUnselect.call(_311,$(this).panel("options").title,_304(_311,this)); -}})); -var _315=pp.panel("header"); -var tool=_315.children("div.panel-tool"); -tool.children("a.panel-tool-collapse").hide(); -var t=$("").addClass("accordion-collapse accordion-expand").appendTo(tool); -t._bind("click",function(){ -_316(pp); -return false; -}); -pp.panel("options").collapsible?t.show():t.hide(); -if(opts.halign=="left"||opts.halign=="right"){ -t.hide(); -} -_315._bind("click",function(){ -_316(pp); -return false; -}); -function _316(p){ -var _317=p.panel("options"); -if(_317.collapsible){ -var _318=_304(_311,p); -if(_317.collapsed){ -_319(_311,_318); -}else{ -_31a(_311,_318); -} -} -}; -}; -function _319(_31b,_31c){ -var p=_307(_31b,_31c); -if(!p){ -return; -} -_31d(_31b); -var opts=$.data(_31b,"accordion").options; -p.panel("expand",opts.animate); -}; -function _31a(_31e,_31f){ -var p=_307(_31e,_31f); -if(!p){ -return; -} -_31d(_31e); -var opts=$.data(_31e,"accordion").options; -p.panel("collapse",opts.animate); -}; -function _320(_321){ -var opts=$.data(_321,"accordion").options; -$(_321).find(">.panel-last>.accordion-header").addClass("accordion-header-border"); -var p=_2fb(_321,"selected",true); -if(p){ -_322(_304(_321,p)); -}else{ -_322(opts.selected); -} -function _322(_323){ -var _324=opts.animate; -opts.animate=false; -_319(_321,_323); -opts.animate=_324; -}; -}; -function _31d(_325){ -var _326=$.data(_325,"accordion").panels; -for(var i=0;i<_326.length;i++){ -_326[i].stop(true,true); -} -}; -function add(_327,_328){ -var _329=$.data(_327,"accordion"); -var opts=_329.options; -var _32a=_329.panels; -if(_328.selected==undefined){ -_328.selected=true; -} -_31d(_327); -var pp=$("
                                          ").appendTo(_327); -_32a.push(pp); -_310(_327,pp,_328); -_2ed(_327); -opts.onAdd.call(_327,_328.title,_32a.length-1); -if(_328.selected){ -_319(_327,_32a.length-1); -} -}; -function _32b(_32c,_32d){ -var _32e=$.data(_32c,"accordion"); -var opts=_32e.options; -var _32f=_32e.panels; -_31d(_32c); -var _330=_307(_32c,_32d); -var _331=_330.panel("options").title; -var _332=_304(_32c,_330); -if(!_330){ -return; -} -if(opts.onBeforeRemove.call(_32c,_331,_332)==false){ -return; -} -_32f.splice(_332,1); -_330.panel("destroy"); -if(_32f.length){ -_2ed(_32c); -var curr=_302(_32c); -if(!curr){ -_319(_32c,0); -} -} -opts.onRemove.call(_32c,_331,_332); -}; -$.fn.accordion=function(_333,_334){ -if(typeof _333=="string"){ -return $.fn.accordion.methods[_333](this,_334); -} -_333=_333||{}; -return this.each(function(){ -var _335=$.data(this,"accordion"); -if(_335){ -$.extend(_335.options,_333); -}else{ -$.data(this,"accordion",{options:$.extend({},$.fn.accordion.defaults,$.fn.accordion.parseOptions(this),_333),accordion:$(this).addClass("accordion"),panels:[]}); -init(this); -} -_30b(this); -_2ed(this); -_320(this); -}); -}; -$.fn.accordion.methods={options:function(jq){ -return $.data(jq[0],"accordion").options; -},panels:function(jq){ -return $.data(jq[0],"accordion").panels; -},resize:function(jq,_336){ -return jq.each(function(){ -_2ed(this,_336); -}); -},getSelections:function(jq){ -return _300(jq[0]); -},getSelected:function(jq){ -return _302(jq[0]); -},getPanel:function(jq,_337){ -return _307(jq[0],_337); -},getPanelIndex:function(jq,_338){ -return _304(jq[0],_338); -},select:function(jq,_339){ -return jq.each(function(){ -_319(this,_339); -}); -},unselect:function(jq,_33a){ -return jq.each(function(){ -_31a(this,_33a); -}); -},add:function(jq,_33b){ -return jq.each(function(){ -add(this,_33b); -}); -},remove:function(jq,_33c){ -return jq.each(function(){ -_32b(this,_33c); -}); -}}; -$.fn.accordion.parseOptions=function(_33d){ -var t=$(_33d); -return $.extend({},$.parser.parseOptions(_33d,["width","height","halign",{fit:"boolean",border:"boolean",animate:"boolean",multiple:"boolean",selected:"number"}])); -}; -$.fn.accordion.defaults={width:"auto",height:"auto",fit:false,border:true,animate:true,multiple:false,selected:0,halign:"top",onSelect:function(_33e,_33f){ -},onUnselect:function(_340,_341){ -},onAdd:function(_342,_343){ -},onBeforeRemove:function(_344,_345){ -},onRemove:function(_346,_347){ -}}; -})(jQuery); -(function($){ -function _348(c){ -var w=0; -$(c).children().each(function(){ -w+=$(this).outerWidth(true); -}); -return w; -}; -function _349(_34a){ -var opts=$.data(_34a,"tabs").options; -if(!opts.showHeader){ -return; -} -var _34b=$(_34a).children("div.tabs-header"); -var tool=_34b.children("div.tabs-tool:not(.tabs-tool-hidden)"); -var _34c=_34b.children("div.tabs-scroller-left"); -var _34d=_34b.children("div.tabs-scroller-right"); -var wrap=_34b.children("div.tabs-wrap"); -if(opts.tabPosition=="left"||opts.tabPosition=="right"){ -if(!tool.length){ -return; -} -tool._outerWidth(_34b.width()); -var _34e={left:opts.tabPosition=="left"?"auto":0,right:opts.tabPosition=="left"?0:"auto",top:opts.toolPosition=="top"?0:"auto",bottom:opts.toolPosition=="top"?"auto":0}; -var _34f={marginTop:opts.toolPosition=="top"?tool.outerHeight():0}; -tool.css(_34e); -wrap.css(_34f); -return; -} -var _350=_34b.outerHeight(); -if(opts.plain){ -_350-=_350-_34b.height(); -} -tool._outerHeight(_350); -var _351=_348(_34b.find("ul.tabs")); -var _352=_34b.width()-tool._outerWidth(); -if(_351>_352){ -_34c.add(_34d).show()._outerHeight(_350); -if(opts.toolPosition=="left"){ -tool.css({left:_34c.outerWidth(),right:""}); -wrap.css({marginLeft:_34c.outerWidth()+tool._outerWidth(),marginRight:_34d._outerWidth(),width:_352-_34c.outerWidth()-_34d.outerWidth()}); -}else{ -tool.css({left:"",right:_34d.outerWidth()}); -wrap.css({marginLeft:_34c.outerWidth(),marginRight:_34d.outerWidth()+tool._outerWidth(),width:_352-_34c.outerWidth()-_34d.outerWidth()}); -} -}else{ -_34c.add(_34d).hide(); -if(opts.toolPosition=="left"){ -tool.css({left:0,right:""}); -wrap.css({marginLeft:tool._outerWidth(),marginRight:0,width:_352}); -}else{ -tool.css({left:"",right:0}); -wrap.css({marginLeft:0,marginRight:tool._outerWidth(),width:_352}); -} -} -}; -function _353(_354){ -var opts=$.data(_354,"tabs").options; -var _355=$(_354).children("div.tabs-header"); -if(opts.tools){ -if(typeof opts.tools=="string"){ -$(opts.tools).addClass("tabs-tool").appendTo(_355); -$(opts.tools).show(); -}else{ -_355.children("div.tabs-tool").remove(); -var _356=$("
                                          ").appendTo(_355); -var tr=_356.find("tr"); -for(var i=0;i").appendTo(tr); -var tool=$("").appendTo(td); -tool[0].onclick=eval(opts.tools[i].handler||function(){ -}); -tool.linkbutton($.extend({},opts.tools[i],{plain:true})); -} -} -}else{ -_355.children("div.tabs-tool").remove(); -} -}; -function _357(_358,_359){ -var _35a=$.data(_358,"tabs"); -var opts=_35a.options; -var cc=$(_358); -if(!opts.doSize){ -return; -} -if(_359){ -$.extend(opts,{width:_359.width,height:_359.height}); -} -cc._size(opts); -var _35b=cc.children("div.tabs-header"); -var _35c=cc.children("div.tabs-panels"); -var wrap=_35b.find("div.tabs-wrap"); -var ul=wrap.find(".tabs"); -ul.children("li").removeClass("tabs-first tabs-last"); -ul.children("li:first").addClass("tabs-first"); -ul.children("li:last").addClass("tabs-last"); -if(opts.tabPosition=="left"||opts.tabPosition=="right"){ -_35b._outerWidth(opts.showHeader?opts.headerWidth:0); -_35c._outerWidth(cc.width()-_35b.outerWidth()); -_35b.add(_35c)._size("height",isNaN(parseInt(opts.height))?"":cc.height()); -wrap._outerWidth(_35b.width()); -ul._outerWidth(wrap.width()).css("height",""); -}else{ -_35b.children("div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)").css("display",opts.showHeader?"block":"none"); -_35b._outerWidth(cc.width()).css("height",""); -if(opts.showHeader){ -_35b.css("background-color",""); -wrap.css("height",""); -}else{ -_35b.css("background-color","transparent"); -_35b._outerHeight(0); -wrap._outerHeight(0); -} -ul._outerHeight(opts.tabHeight).css("width",""); -ul._outerHeight(ul.outerHeight()-ul.height()-1+opts.tabHeight).css("width",""); -_35c._size("height",isNaN(parseInt(opts.height))?"":(cc.height()-_35b.outerHeight())); -_35c._size("width",cc.width()); -} -if(_35a.tabs.length){ -var d1=ul.outerWidth(true)-ul.width(); -var li=ul.children("li:first"); -var d2=li.outerWidth(true)-li.width(); -var _35d=_35b.width()-_35b.children(".tabs-tool:not(.tabs-tool-hidden)")._outerWidth(); -var _35e=Math.floor((_35d-d1-d2*_35a.tabs.length)/_35a.tabs.length); -$.map(_35a.tabs,function(p){ -_35f(p,(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0)?_35e:undefined); -}); -if(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0){ -var _360=_35d-d1-_348(ul); -_35f(_35a.tabs[_35a.tabs.length-1],_35e+_360); -} -} -_349(_358); -function _35f(p,_361){ -var _362=p.panel("options"); -var p_t=_362.tab.find(".tabs-inner"); -var _361=_361?_361:(parseInt(_362.tabWidth||opts.tabWidth||undefined)); -if(_361){ -p_t._outerWidth(_361); -}else{ -p_t.css("width",""); -} -p_t._outerHeight(opts.tabHeight); -p_t.css("lineHeight",p_t.height()+"px"); -p_t.find(".easyui-fluid:visible").triggerHandler("_resize"); -}; -}; -function _363(_364){ -var opts=$.data(_364,"tabs").options; -var tab=_365(_364); -if(tab){ -var _366=$(_364).children("div.tabs-panels"); -var _367=opts.width=="auto"?"auto":_366.width(); -var _368=opts.height=="auto"?"auto":_366.height(); -tab.panel("resize",{width:_367,height:_368}); -} -}; -function _369(_36a){ -var tabs=$.data(_36a,"tabs").tabs; -var cc=$(_36a).addClass("tabs-container"); -var _36b=$("
                                          ").insertBefore(cc); -cc.children("div").each(function(){ -_36b[0].appendChild(this); -}); -cc[0].appendChild(_36b[0]); -$("
                                          "+"
                                          "+"
                                          "+"
                                          "+"
                                            "+"
                                            "+"
                                            ").prependTo(_36a); -cc.children("div.tabs-panels").children("div").each(function(i){ -var opts=$.extend({},$.parser.parseOptions(this),{disabled:($(this).attr("disabled")?true:undefined),selected:($(this).attr("selected")?true:undefined)}); -_378(_36a,opts,$(this)); -}); -cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right")._bind("mouseenter",function(){ -$(this).addClass("tabs-scroller-over"); -})._bind("mouseleave",function(){ -$(this).removeClass("tabs-scroller-over"); -}); -cc._bind("_resize",function(e,_36c){ -if($(this).hasClass("easyui-fluid")||_36c){ -_357(_36a); -_363(_36a); -} -return false; -}); -}; -function _36d(_36e){ -var _36f=$.data(_36e,"tabs"); -var opts=_36f.options; -$(_36e).children("div.tabs-header")._unbind()._bind("click",function(e){ -if($(e.target).hasClass("tabs-scroller-left")){ -$(_36e).tabs("scrollBy",-opts.scrollIncrement); -}else{ -if($(e.target).hasClass("tabs-scroller-right")){ -$(_36e).tabs("scrollBy",opts.scrollIncrement); -}else{ -var li=$(e.target).closest("li"); -if(li.hasClass("tabs-disabled")){ -return false; -} -var a=$(e.target).closest(".tabs-close"); -if(a.length){ -_392(_36e,_370(li)); -}else{ -if(li.length){ -var _371=_370(li); -var _372=_36f.tabs[_371].panel("options"); -if(_372.collapsible){ -_372.closed?_389(_36e,_371):_3a9(_36e,_371); -}else{ -_389(_36e,_371); -} -} -} -return false; -} -} -})._bind("contextmenu",function(e){ -var li=$(e.target).closest("li"); -if(li.hasClass("tabs-disabled")){ -return; -} -if(li.length){ -opts.onContextMenu.call(_36e,e,li.find("span.tabs-title").html(),_370(li)); -} -}); -function _370(li){ -var _373=0; -li.parent().children("li").each(function(i){ -if(li[0]==this){ -_373=i; -return false; -} -}); -return _373; -}; -}; -function _374(_375){ -var opts=$.data(_375,"tabs").options; -var _376=$(_375).children("div.tabs-header"); -var _377=$(_375).children("div.tabs-panels"); -_376.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right"); -_377.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right"); -if(opts.tabPosition=="top"){ -_376.insertBefore(_377); -}else{ -if(opts.tabPosition=="bottom"){ -_376.insertAfter(_377); -_376.addClass("tabs-header-bottom"); -_377.addClass("tabs-panels-top"); -}else{ -if(opts.tabPosition=="left"){ -_376.addClass("tabs-header-left"); -_377.addClass("tabs-panels-right"); -}else{ -if(opts.tabPosition=="right"){ -_376.addClass("tabs-header-right"); -_377.addClass("tabs-panels-left"); -} -} -} -} -if(opts.plain==true){ -_376.addClass("tabs-header-plain"); -}else{ -_376.removeClass("tabs-header-plain"); -} -_376.removeClass("tabs-header-narrow").addClass(opts.narrow?"tabs-header-narrow":""); -var tabs=_376.find(".tabs"); -tabs.removeClass("tabs-pill").addClass(opts.pill?"tabs-pill":""); -tabs.removeClass("tabs-narrow").addClass(opts.narrow?"tabs-narrow":""); -tabs.removeClass("tabs-justified").addClass(opts.justified?"tabs-justified":""); -if(opts.border==true){ -_376.removeClass("tabs-header-noborder"); -_377.removeClass("tabs-panels-noborder"); -}else{ -_376.addClass("tabs-header-noborder"); -_377.addClass("tabs-panels-noborder"); -} -opts.doSize=true; -}; -function _378(_379,_37a,pp){ -_37a=_37a||{}; -var _37b=$.data(_379,"tabs"); -var tabs=_37b.tabs; -if(_37a.index==undefined||_37a.index>tabs.length){ -_37a.index=tabs.length; -} -if(_37a.index<0){ -_37a.index=0; -} -var ul=$(_379).children("div.tabs-header").find("ul.tabs"); -var _37c=$(_379).children("div.tabs-panels"); -var tab=$("
                                          • "+""+""+""+""+"
                                          • "); -if(!pp){ -pp=$("
                                            "); -} -if(_37a.index>=tabs.length){ -tab.appendTo(ul); -pp.appendTo(_37c); -tabs.push(pp); -}else{ -tab.insertBefore(ul.children("li:eq("+_37a.index+")")); -pp.insertBefore(_37c.children("div.panel:eq("+_37a.index+")")); -tabs.splice(_37a.index,0,pp); -} -pp.panel($.extend({},_37a,{tab:tab,border:false,noheader:true,closed:true,doSize:false,iconCls:(_37a.icon?_37a.icon:undefined),onLoad:function(){ -if(_37a.onLoad){ -_37a.onLoad.apply(this,arguments); -} -_37b.options.onLoad.call(_379,$(this)); -},onBeforeOpen:function(){ -if(_37a.onBeforeOpen){ -if(_37a.onBeforeOpen.call(this)==false){ -return false; -} -} -var p=$(_379).tabs("getSelected"); -if(p){ -if(p[0]!=this){ -$(_379).tabs("unselect",_384(_379,p)); -p=$(_379).tabs("getSelected"); -if(p){ -return false; -} -}else{ -_363(_379); -return false; -} -} -var _37d=$(this).panel("options"); -_37d.tab.addClass("tabs-selected"); -var wrap=$(_379).find(">div.tabs-header>div.tabs-wrap"); -var left=_37d.tab.position().left; -var _37e=left+_37d.tab.outerWidth(); -if(left<0||_37e>wrap.width()){ -var _37f=left-(wrap.width()-_37d.tab.width())/2; -$(_379).tabs("scrollBy",_37f); -}else{ -$(_379).tabs("scrollBy",0); -} -var _380=$(this).panel("panel"); -_380.css("display","block"); -_363(_379); -_380.css("display","none"); -},onOpen:function(){ -if(_37a.onOpen){ -_37a.onOpen.call(this); -} -var _381=$(this).panel("options"); -var _382=_384(_379,this); -_37b.selectHis.push(_382); -_37b.options.onSelect.call(_379,_381.title,_382); -},onBeforeClose:function(){ -if(_37a.onBeforeClose){ -if(_37a.onBeforeClose.call(this)==false){ -return false; -} -} -$(this).panel("options").tab.removeClass("tabs-selected"); -},onClose:function(){ -if(_37a.onClose){ -_37a.onClose.call(this); -} -var _383=$(this).panel("options"); -_37b.options.onUnselect.call(_379,_383.title,_384(_379,this)); -}})); -$(_379).tabs("update",{tab:pp,options:pp.panel("options"),type:"header"}); -}; -function _385(_386,_387){ -var _388=$.data(_386,"tabs"); -var opts=_388.options; -if(_387.selected==undefined){ -_387.selected=true; -} -_378(_386,_387); -opts.onAdd.call(_386,_387.title,_387.index); -if(_387.selected){ -_389(_386,_387.index); -} -}; -function _38a(_38b,_38c){ -_38c.type=_38c.type||"all"; -var _38d=$.data(_38b,"tabs").selectHis; -var pp=_38c.tab; -var opts=pp.panel("options"); -var _38e=opts.title; -$.extend(opts,_38c.options,{iconCls:(_38c.options.icon?_38c.options.icon:undefined)}); -if(_38c.type=="all"||_38c.type=="body"){ -pp.panel(); -} -if(_38c.type=="all"||_38c.type=="header"){ -var tab=opts.tab; -if(opts.header){ -tab.find(".tabs-inner").html($(opts.header)); -}else{ -var _38f=tab.find("span.tabs-title"); -var _390=tab.find("span.tabs-icon"); -_38f.html(opts.title); -_390.attr("class","tabs-icon"); -tab.find(".tabs-close").remove(); -if(opts.closable){ -_38f.addClass("tabs-closable"); -$("").appendTo(tab); -}else{ -_38f.removeClass("tabs-closable"); -} -if(opts.iconCls){ -_38f.addClass("tabs-with-icon"); -_390.addClass(opts.iconCls); -}else{ -_38f.removeClass("tabs-with-icon"); -} -if(opts.tools){ -var _391=tab.find("span.tabs-p-tool"); -if(!_391.length){ -var _391=$("").insertAfter(tab.find(".tabs-inner")); -} -if($.isArray(opts.tools)){ -_391.empty(); -for(var i=0;i").appendTo(_391); -t.addClass(opts.tools[i].iconCls); -if(opts.tools[i].handler){ -t._bind("click",{handler:opts.tools[i].handler},function(e){ -if($(this).parents("li").hasClass("tabs-disabled")){ -return; -} -e.data.handler.call(this); -}); -} -} -}else{ -$(opts.tools).children().appendTo(_391); -} -var pr=_391.children().length*12; -if(opts.closable){ -pr+=8; -_391.css("right",""); -}else{ -pr-=3; -_391.css("right","5px"); -} -_38f.css("padding-right",pr+"px"); -}else{ -tab.find("span.tabs-p-tool").remove(); -_38f.css("padding-right",""); -} -} -} -if(opts.disabled){ -opts.tab.addClass("tabs-disabled"); -}else{ -opts.tab.removeClass("tabs-disabled"); -} -_357(_38b); -$.data(_38b,"tabs").options.onUpdate.call(_38b,opts.title,_384(_38b,pp)); -}; -function _392(_393,_394){ -var _395=$.data(_393,"tabs"); -var opts=_395.options; -var tabs=_395.tabs; -var _396=_395.selectHis; -if(!_397(_393,_394)){ -return; -} -var tab=_398(_393,_394); -var _399=tab.panel("options").title; -var _39a=_384(_393,tab); -if(opts.onBeforeClose.call(_393,_399,_39a)==false){ -return; -} -var tab=_398(_393,_394,true); -tab.panel("options").tab.remove(); -tab.panel("destroy"); -opts.onClose.call(_393,_399,_39a); -_357(_393); -var his=[]; -for(var i=0;i<_396.length;i++){ -var _39b=_396[i]; -if(_39b!=_39a){ -his.push(_39b>_39a?_39b-1:_39b); -} -} -_395.selectHis=his; -var _39c=$(_393).tabs("getSelected"); -if(!_39c&&his.length){ -_39a=_395.selectHis.pop(); -$(_393).tabs("select",_39a); -} -}; -function _398(_39d,_39e,_39f){ -var tabs=$.data(_39d,"tabs").tabs; -var tab=null; -if(typeof _39e=="number"){ -if(_39e>=0&&_39e"); -for(var i=0;i.tabs-header>.tabs-tool"); -if(_3b4){ -tool.removeClass("tabs-tool-hidden").show(); -}else{ -tool.addClass("tabs-tool-hidden").hide(); -} -$(_3b3).tabs("resize").tabs("scrollBy",0); -}; -$.fn.tabs=function(_3b5,_3b6){ -if(typeof _3b5=="string"){ -return $.fn.tabs.methods[_3b5](this,_3b6); -} -_3b5=_3b5||{}; -return this.each(function(){ -var _3b7=$.data(this,"tabs"); -if(_3b7){ -$.extend(_3b7.options,_3b5); -}else{ -$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_3b5),tabs:[],selectHis:[]}); -_369(this); -} -_353(this); -_374(this); -_357(this); -_36d(this); -_3a3(this); -}); -}; -$.fn.tabs.methods={options:function(jq){ -var cc=jq[0]; -var opts=$.data(cc,"tabs").options; -var s=_365(cc); -opts.selected=s?_384(cc,s):-1; -return opts; -},tabs:function(jq){ -return $.data(jq[0],"tabs").tabs; -},resize:function(jq,_3b8){ -return jq.each(function(){ -_357(this,_3b8); -_363(this); -}); -},add:function(jq,_3b9){ -return jq.each(function(){ -_385(this,_3b9); -}); -},close:function(jq,_3ba){ -return jq.each(function(){ -_392(this,_3ba); -}); -},getTab:function(jq,_3bb){ -return _398(jq[0],_3bb); -},getTabIndex:function(jq,tab){ -return _384(jq[0],tab); -},getSelected:function(jq){ -return _365(jq[0]); -},select:function(jq,_3bc){ -return jq.each(function(){ -_389(this,_3bc); -}); -},unselect:function(jq,_3bd){ -return jq.each(function(){ -_3a9(this,_3bd); -}); -},exists:function(jq,_3be){ -return _397(jq[0],_3be); -},update:function(jq,_3bf){ -return jq.each(function(){ -_38a(this,_3bf); -}); -},enableTab:function(jq,_3c0){ -return jq.each(function(){ -var opts=$(this).tabs("getTab",_3c0).panel("options"); -opts.tab.removeClass("tabs-disabled"); -opts.disabled=false; -}); -},disableTab:function(jq,_3c1){ -return jq.each(function(){ -var opts=$(this).tabs("getTab",_3c1).panel("options"); -opts.tab.addClass("tabs-disabled"); -opts.disabled=true; -}); -},showHeader:function(jq){ -return jq.each(function(){ -_3af(this,true); -}); -},hideHeader:function(jq){ -return jq.each(function(){ -_3af(this,false); -}); -},showTool:function(jq){ -return jq.each(function(){ -_3b2(this,true); -}); -},hideTool:function(jq){ -return jq.each(function(){ -_3b2(this,false); -}); -},scrollBy:function(jq,_3c2){ -return jq.each(function(){ -var opts=$(this).tabs("options"); -var wrap=$(this).find(">div.tabs-header>div.tabs-wrap"); -var pos=Math.min(wrap._scrollLeft()+_3c2,_3c3()); -wrap.animate({scrollLeft:pos},opts.scrollDuration); -function _3c3(){ -var w=0; -var ul=wrap.children("ul"); -ul.children("li").each(function(){ -w+=$(this).outerWidth(true); -}); -return w-wrap.width()+(ul.outerWidth()-ul.width()); -}; -}); -}}; -$.fn.tabs.parseOptions=function(_3c4){ -return $.extend({},$.parser.parseOptions(_3c4,["tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean"},{headerWidth:"number",tabWidth:"number",tabHeight:"number",selected:"number"},{showHeader:"boolean",justified:"boolean",narrow:"boolean",pill:"boolean"}])); -}; -$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,tabWidth:"auto",tabHeight:32,selected:0,showHeader:true,plain:false,fit:false,border:true,justified:false,narrow:false,pill:false,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_3c5){ -},onSelect:function(_3c6,_3c7){ -},onUnselect:function(_3c8,_3c9){ -},onBeforeClose:function(_3ca,_3cb){ -},onClose:function(_3cc,_3cd){ -},onAdd:function(_3ce,_3cf){ -},onUpdate:function(_3d0,_3d1){ -},onContextMenu:function(e,_3d2,_3d3){ -}}; -})(jQuery); -(function($){ -var _3d4=false; -function _3d5(_3d6,_3d7){ -var _3d8=$.data(_3d6,"layout"); -var opts=_3d8.options; -var _3d9=_3d8.panels; -var cc=$(_3d6); -if(_3d7){ -$.extend(opts,{width:_3d7.width,height:_3d7.height}); -} -if(_3d6.tagName.toLowerCase()=="body"){ -cc._size("fit"); -}else{ -cc._size(opts); -} -var cpos={top:0,left:0,width:cc.width(),height:cc.height()}; -_3da(_3db(_3d9.expandNorth)?_3d9.expandNorth:_3d9.north,"n"); -_3da(_3db(_3d9.expandSouth)?_3d9.expandSouth:_3d9.south,"s"); -_3dc(_3db(_3d9.expandEast)?_3d9.expandEast:_3d9.east,"e"); -_3dc(_3db(_3d9.expandWest)?_3d9.expandWest:_3d9.west,"w"); -_3d9.center.panel("resize",cpos); -function _3da(pp,type){ -if(!pp.length||!_3db(pp)){ -return; -} -var opts=pp.panel("options"); -pp.panel("resize",{width:cc.width(),height:opts.height}); -var _3dd=pp.panel("panel").outerHeight(); -pp.panel("move",{left:0,top:(type=="n"?0:cc.height()-_3dd)}); -cpos.height-=_3dd; -if(type=="n"){ -cpos.top+=_3dd; -if(!opts.split&&opts.border){ -cpos.top--; -} -} -if(!opts.split&&opts.border){ -cpos.height++; -} -}; -function _3dc(pp,type){ -if(!pp.length||!_3db(pp)){ -return; -} -var opts=pp.panel("options"); -pp.panel("resize",{width:opts.width,height:cpos.height}); -var _3de=pp.panel("panel").outerWidth(); -pp.panel("move",{left:(type=="e"?cc.width()-_3de:0),top:cpos.top}); -cpos.width-=_3de; -if(type=="w"){ -cpos.left+=_3de; -if(!opts.split&&opts.border){ -cpos.left--; -} -} -if(!opts.split&&opts.border){ -cpos.width++; -} -}; -}; -function init(_3df){ -var cc=$(_3df); -cc.addClass("layout"); -function _3e0(el){ -var _3e1=$.fn.layout.parsePanelOptions(el); -if("north,south,east,west,center".indexOf(_3e1.region)>=0){ -_3e4(_3df,_3e1,el); -} -}; -var opts=cc.layout("options"); -var _3e2=opts.onAdd; -opts.onAdd=function(){ -}; -cc.find(">div,>form>div").each(function(){ -_3e0(this); -}); -opts.onAdd=_3e2; -cc.append("
                                            "); -cc._bind("_resize",function(e,_3e3){ -if($(this).hasClass("easyui-fluid")||_3e3){ -_3d5(_3df); -} -return false; -}); -}; -function _3e4(_3e5,_3e6,el){ -_3e6.region=_3e6.region||"center"; -var _3e7=$.data(_3e5,"layout").panels; -var cc=$(_3e5); -var dir=_3e6.region; -if(_3e7[dir].length){ -return; -} -var pp=$(el); -if(!pp.length){ -pp=$("
                                            ").appendTo(cc); -} -var _3e8=$.extend({},$.fn.layout.paneldefaults,{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,onOpen:function(){ -var tool=$(this).panel("header").children("div.panel-tool"); -tool.children("a.panel-tool-collapse").hide(); -var _3e9={north:"up",south:"down",east:"right",west:"left"}; -if(!_3e9[dir]){ -return; -} -var _3ea="layout-button-"+_3e9[dir]; -var t=tool.children("a."+_3ea); -if(!t.length){ -t=$("").addClass(_3ea).appendTo(tool); -t._bind("click",{dir:dir},function(e){ -_401(_3e5,e.data.dir); -return false; -}); -} -$(this).panel("options").collapsible?t.show():t.hide(); -}},_3e6,{cls:((_3e6.cls||"")+" layout-panel layout-panel-"+dir),bodyCls:((_3e6.bodyCls||"")+" layout-body")}); -pp.panel(_3e8); -_3e7[dir]=pp; -var _3eb={north:"s",south:"n",east:"w",west:"e"}; -var _3ec=pp.panel("panel"); -if(pp.panel("options").split){ -_3ec.addClass("layout-split-"+dir); -} -_3ec.resizable($.extend({},{handles:(_3eb[dir]||""),disabled:(!pp.panel("options").split),onStartResize:function(e){ -_3d4=true; -if(dir=="north"||dir=="south"){ -var _3ed=$(">div.layout-split-proxy-v",_3e5); -}else{ -var _3ed=$(">div.layout-split-proxy-h",_3e5); -} -var top=0,left=0,_3ee=0,_3ef=0; -var pos={display:"block"}; -if(dir=="north"){ -pos.top=parseInt(_3ec.css("top"))+_3ec.outerHeight()-_3ed.height(); -pos.left=parseInt(_3ec.css("left")); -pos.width=_3ec.outerWidth(); -pos.height=_3ed.height(); -}else{ -if(dir=="south"){ -pos.top=parseInt(_3ec.css("top")); -pos.left=parseInt(_3ec.css("left")); -pos.width=_3ec.outerWidth(); -pos.height=_3ed.height(); -}else{ -if(dir=="east"){ -pos.top=parseInt(_3ec.css("top"))||0; -pos.left=parseInt(_3ec.css("left"))||0; -pos.width=_3ed.width(); -pos.height=_3ec.outerHeight(); -}else{ -if(dir=="west"){ -pos.top=parseInt(_3ec.css("top"))||0; -pos.left=_3ec.outerWidth()-_3ed.width(); -pos.width=_3ed.width(); -pos.height=_3ec.outerHeight(); -} -} -} -} -_3ed.css(pos); -$("
                                            ").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc); -},onResize:function(e){ -if(dir=="north"||dir=="south"){ -var _3f0=_3f1(this); -$(this).resizable("options").maxHeight=_3f0; -var _3f2=$(">div.layout-split-proxy-v",_3e5); -var top=dir=="north"?e.data.height-_3f2.height():$(_3e5).height()-e.data.height; -_3f2.css("top",top); -}else{ -var _3f3=_3f1(this); -$(this).resizable("options").maxWidth=_3f3; -var _3f2=$(">div.layout-split-proxy-h",_3e5); -var left=dir=="west"?e.data.width-_3f2.width():$(_3e5).width()-e.data.width; -_3f2.css("left",left); -} -return false; -},onStopResize:function(e){ -cc.children("div.layout-split-proxy-v,div.layout-split-proxy-h").hide(); -pp.panel("resize",e.data); -_3d5(_3e5); -_3d4=false; -cc.find(">div.layout-mask").remove(); -}},_3e6)); -cc.layout("options").onAdd.call(_3e5,dir); -function _3f1(p){ -var _3f4="expand"+dir.substring(0,1).toUpperCase()+dir.substring(1); -var _3f5=_3e7["center"]; -var _3f6=(dir=="north"||dir=="south")?"minHeight":"minWidth"; -var _3f7=(dir=="north"||dir=="south")?"maxHeight":"maxWidth"; -var _3f8=(dir=="north"||dir=="south")?"_outerHeight":"_outerWidth"; -var _3f9=$.parser.parseValue(_3f7,_3e7[dir].panel("options")[_3f7],$(_3e5)); -var _3fa=$.parser.parseValue(_3f6,_3f5.panel("options")[_3f6],$(_3e5)); -var _3fb=_3f5.panel("panel")[_3f8]()-_3fa; -if(_3db(_3e7[_3f4])){ -_3fb+=_3e7[_3f4][_3f8]()-1; -}else{ -_3fb+=$(p)[_3f8](); -} -if(_3fb>_3f9){ -_3fb=_3f9; -} -return _3fb; -}; -}; -function _3fc(_3fd,_3fe){ -var _3ff=$.data(_3fd,"layout").panels; -if(_3ff[_3fe].length){ -_3ff[_3fe].panel("destroy"); -_3ff[_3fe]=$(); -var _400="expand"+_3fe.substring(0,1).toUpperCase()+_3fe.substring(1); -if(_3ff[_400]){ -_3ff[_400].panel("destroy"); -_3ff[_400]=undefined; -} -$(_3fd).layout("options").onRemove.call(_3fd,_3fe); -} -}; -function _401(_402,_403,_404){ -if(_404==undefined){ -_404="normal"; -} -var _405=$.data(_402,"layout"); -var _406=_405.panels; -var p=_406[_403]; -var _407=p.panel("options"); -if(_407.onBeforeCollapse.call(p)==false){ -return; -} -var _408="expand"+_403.substring(0,1).toUpperCase()+_403.substring(1); -if(!_406[_408]){ -_406[_408]=_409(_403); -var ep=_406[_408].panel("panel"); -if(!_407.expandMode){ -ep.css("cursor","default"); -}else{ -ep._bind("click",function(){ -if(_407.expandMode=="dock"){ -_416(_402,_403); -}else{ -p.panel("expand",false).panel("open"); -var _40a=_40b(); -p.panel("resize",_40a.collapse); -p.panel("panel")._unbind(".layout")._bind("mouseleave.layout",{region:_403},function(e){ -var that=this; -_405.collapseTimer=setTimeout(function(){ -$(that).stop(true,true); -if(_3d4==true){ -return; -} -if($("body>div.combo-p>div.combo-panel:visible").length){ -return; -} -_401(_402,e.data.region); -},_405.options.collapseDelay); -}); -p.panel("panel").animate(_40a.expand,function(){ -$(_402).layout("options").onExpand.call(_402,_403); -}); -} -return false; -}); -} -} -var _40c=_40b(); -if(!_3db(_406[_408])){ -_406.center.panel("resize",_40c.resizeC); -} -p.panel("panel").animate(_40c.collapse,_404,function(){ -p.panel("collapse",false).panel("close"); -_406[_408].panel("open").panel("resize",_40c.expandP); -$(this)._unbind(".layout"); -$(_402).layout("options").onCollapse.call(_402,_403); -}); -function _409(dir){ -var _40d={"east":"left","west":"right","north":"down","south":"up"}; -var isns=(_407.region=="north"||_407.region=="south"); -var icon="layout-button-"+_40d[dir]; -var p=$("
                                            ").appendTo(_402); -p.panel($.extend({},$.fn.layout.paneldefaults,{cls:("layout-expand layout-expand-"+dir),title:" ",titleDirection:_407.titleDirection,iconCls:(_407.hideCollapsedContent?null:_407.iconCls),closed:true,minWidth:0,minHeight:0,doSize:false,region:_407.region,collapsedSize:_407.collapsedSize,noheader:(!isns&&_407.hideExpandTool),tools:((isns&&_407.hideExpandTool)?null:[{iconCls:icon,handler:function(){ -_416(_402,_403); -return false; -}}]),onResize:function(){ -var _40e=$(this).children(".layout-expand-title"); -if(_40e.length){ -var icon=$(this).children(".panel-icon"); -var _40f=icon.length>0?(icon._outerHeight()+2):0; -_40e._outerWidth($(this).height()-_40f); -var left=($(this).width()-Math.min(_40e._outerWidth(),_40e._outerHeight()))/2; -var top=Math.max(_40e._outerWidth(),_40e._outerHeight()); -if(_40e.hasClass("layout-expand-title-down")){ -left+=Math.min(_40e._outerWidth(),_40e._outerHeight()); -top=0; -} -top+=_40f; -_40e.css({left:(left+"px"),top:(top+"px")}); -} -}})); -if(!_407.hideCollapsedContent){ -var _410=typeof _407.collapsedContent=="function"?_407.collapsedContent.call(p[0],_407.title):_407.collapsedContent; -isns?p.panel("setTitle",_410):p.html(_410); -} -p.panel("panel").hover(function(){ -$(this).addClass("layout-expand-over"); -},function(){ -$(this).removeClass("layout-expand-over"); -}); -return p; -}; -function _40b(){ -var cc=$(_402); -var _411=_406.center.panel("options"); -var _412=_407.collapsedSize; -if(_403=="east"){ -var _413=p.panel("panel")._outerWidth(); -var _414=_411.width+_413-_412; -if(_407.split||!_407.border){ -_414++; -} -return {resizeC:{width:_414},expand:{left:cc.width()-_413},expandP:{top:_411.top,left:cc.width()-_412,width:_412,height:_411.height},collapse:{left:cc.width(),top:_411.top,height:_411.height}}; -}else{ -if(_403=="west"){ -var _413=p.panel("panel")._outerWidth(); -var _414=_411.width+_413-_412; -if(_407.split||!_407.border){ -_414++; -} -return {resizeC:{width:_414,left:_412-1},expand:{left:0},expandP:{left:0,top:_411.top,width:_412,height:_411.height},collapse:{left:-_413,top:_411.top,height:_411.height}}; -}else{ -if(_403=="north"){ -var _415=p.panel("panel")._outerHeight(); -var hh=_411.height; -if(!_3db(_406.expandNorth)){ -hh+=_415-_412+((_407.split||!_407.border)?1:0); -} -_406.east.add(_406.west).add(_406.expandEast).add(_406.expandWest).panel("resize",{top:_412-1,height:hh}); -return {resizeC:{top:_412-1,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:_412},collapse:{top:-_415,width:cc.width()}}; -}else{ -if(_403=="south"){ -var _415=p.panel("panel")._outerHeight(); -var hh=_411.height; -if(!_3db(_406.expandSouth)){ -hh+=_415-_412+((_407.split||!_407.border)?1:0); -} -_406.east.add(_406.west).add(_406.expandEast).add(_406.expandWest).panel("resize",{height:hh}); -return {resizeC:{height:hh},expand:{top:cc.height()-_415},expandP:{top:cc.height()-_412,left:0,width:cc.width(),height:_412},collapse:{top:cc.height(),width:cc.width()}}; -} -} -} -} -}; -}; -function _416(_417,_418){ -var _419=$.data(_417,"layout").panels; -var p=_419[_418]; -var _41a=p.panel("options"); -if(_41a.onBeforeExpand.call(p)==false){ -return; -} -var _41b="expand"+_418.substring(0,1).toUpperCase()+_418.substring(1); -if(_419[_41b]){ -_419[_41b].panel("close"); -p.panel("panel").stop(true,true); -p.panel("expand",false).panel("open"); -var _41c=_41d(); -p.panel("resize",_41c.collapse); -p.panel("panel").animate(_41c.expand,function(){ -_3d5(_417); -$(_417).layout("options").onExpand.call(_417,_418); -}); -} -function _41d(){ -var cc=$(_417); -var _41e=_419.center.panel("options"); -if(_418=="east"&&_419.expandEast){ -return {collapse:{left:cc.width(),top:_41e.top,height:_41e.height},expand:{left:cc.width()-p.panel("panel")._outerWidth()}}; -}else{ -if(_418=="west"&&_419.expandWest){ -return {collapse:{left:-p.panel("panel")._outerWidth(),top:_41e.top,height:_41e.height},expand:{left:0}}; -}else{ -if(_418=="north"&&_419.expandNorth){ -return {collapse:{top:-p.panel("panel")._outerHeight(),width:cc.width()},expand:{top:0}}; -}else{ -if(_418=="south"&&_419.expandSouth){ -return {collapse:{top:cc.height(),width:cc.width()},expand:{top:cc.height()-p.panel("panel")._outerHeight()}}; -} -} -} -} -}; -}; -function _3db(pp){ -if(!pp){ -return false; -} -if(pp.length){ -return pp.panel("panel").is(":visible"); -}else{ -return false; -} -}; -function _41f(_420){ -var _421=$.data(_420,"layout"); -var opts=_421.options; -var _422=_421.panels; -var _423=opts.onCollapse; -opts.onCollapse=function(){ -}; -_424("east"); -_424("west"); -_424("north"); -_424("south"); -opts.onCollapse=_423; -function _424(_425){ -var p=_422[_425]; -if(p.length&&p.panel("options").collapsed){ -_401(_420,_425,0); -} -}; -}; -function _426(_427,_428,_429){ -var p=$(_427).layout("panel",_428); -p.panel("options").split=_429; -var cls="layout-split-"+_428; -var _42a=p.panel("panel").removeClass(cls); -if(_429){ -_42a.addClass(cls); -} -_42a.resizable({disabled:(!_429)}); -_3d5(_427); -}; -$.fn.layout=function(_42b,_42c){ -if(typeof _42b=="string"){ -return $.fn.layout.methods[_42b](this,_42c); -} -_42b=_42b||{}; -return this.each(function(){ -var _42d=$.data(this,"layout"); -if(_42d){ -$.extend(_42d.options,_42b); -}else{ -var opts=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_42b); -$.data(this,"layout",{options:opts,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}}); -init(this); -} -_3d5(this); -_41f(this); -}); -}; -$.fn.layout.methods={options:function(jq){ -return $.data(jq[0],"layout").options; -},resize:function(jq,_42e){ -return jq.each(function(){ -_3d5(this,_42e); -}); -},panel:function(jq,_42f){ -return $.data(jq[0],"layout").panels[_42f]; -},collapse:function(jq,_430){ -return jq.each(function(){ -_401(this,_430); -}); -},expand:function(jq,_431){ -return jq.each(function(){ -_416(this,_431); -}); -},add:function(jq,_432){ -return jq.each(function(){ -_3e4(this,_432); -_3d5(this); -if($(this).layout("panel",_432.region).panel("options").collapsed){ -_401(this,_432.region,0); -} -}); -},remove:function(jq,_433){ -return jq.each(function(){ -_3fc(this,_433); -_3d5(this); -}); -},split:function(jq,_434){ -return jq.each(function(){ -_426(this,_434,true); -}); -},unsplit:function(jq,_435){ -return jq.each(function(){ -_426(this,_435,false); -}); -},stopCollapsing:function(jq){ -return jq.each(function(){ -clearTimeout($(this).data("layout").collapseTimer); -}); -}}; -$.fn.layout.parseOptions=function(_436){ -return $.extend({},$.parser.parseOptions(_436,[{fit:"boolean"}])); -}; -$.fn.layout.defaults={fit:false,onExpand:function(_437){ -},onCollapse:function(_438){ -},onAdd:function(_439){ -},onRemove:function(_43a){ -}}; -$.fn.layout.parsePanelOptions=function(_43b){ -var t=$(_43b); -return $.extend({},$.fn.panel.parseOptions(_43b),$.parser.parseOptions(_43b,["region",{split:"boolean",collpasedSize:"number",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}])); -}; -$.fn.layout.paneldefaults=$.extend({},$.fn.panel.defaults,{region:null,split:false,collapseDelay:100,collapsedSize:32,expandMode:"float",hideExpandTool:false,hideCollapsedContent:true,collapsedContent:function(_43c){ -var p=$(this); -var opts=p.panel("options"); -if(opts.region=="north"||opts.region=="south"){ -return _43c; -} -var cc=[]; -if(opts.iconCls){ -cc.push("
                                            "); -} -cc.push("
                                            "); -cc.push(_43c); -cc.push("
                                            "); -return cc.join(""); -},minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000}); -})(jQuery); -(function($){ -$(function(){ -$(document)._unbind(".menu")._bind("mousedown.menu",function(e){ -var m=$(e.target).closest("div.menu,div.combo-p"); -if(m.length){ -return; -} -$("body>div.menu-top:visible").not(".menu-inline").menu("hide"); -_43d($("body>div.menu:visible").not(".menu-inline")); -}); -}); -function init(_43e){ -var opts=$.data(_43e,"menu").options; -$(_43e).addClass("menu-top"); -opts.inline?$(_43e).addClass("menu-inline"):$(_43e).appendTo("body"); -$(_43e)._bind("_resize",function(e,_43f){ -if($(this).hasClass("easyui-fluid")||_43f){ -$(_43e).menu("resize",_43e); -} -return false; -}); -var _440=_441($(_43e)); -for(var i=0;i<_440.length;i++){ -_444(_43e,_440[i]); -} -function _441(menu){ -var _442=[]; -menu.addClass("menu"); -_442.push(menu); -if(!menu.hasClass("menu-content")){ -menu.children("div").each(function(){ -var _443=$(this).children("div"); -if(_443.length){ -_443.appendTo("body"); -this.submenu=_443; -var mm=_441(_443); -_442=_442.concat(mm); -} -}); -} -return _442; -}; -}; -function _444(_445,div){ -var menu=$(div).addClass("menu"); -if(!menu.data("menu")){ -menu.data("menu",{options:$.parser.parseOptions(menu[0],["width","height"])}); -} -if(!menu.hasClass("menu-content")){ -menu.children("div").each(function(){ -_446(_445,this); -}); -$("
                                            ").prependTo(menu); -} -_447(_445,menu); -if(!menu.hasClass("menu-inline")){ -menu.hide(); -} -_448(_445,menu); -}; -function _446(_449,div,_44a){ -var item=$(div); -var _44b=$.extend({},$.parser.parseOptions(item[0],["id","name","iconCls","href",{separator:"boolean"}]),{disabled:(item.attr("disabled")?true:undefined),text:$.trim(item.html()),onclick:item[0].onclick},_44a||{}); -_44b.onclick=_44b.onclick||_44b.handler||null; -item.data("menuitem",{options:_44b}); -if(_44b.separator){ -item.addClass("menu-sep"); -} -if(!item.hasClass("menu-sep")){ -item.addClass("menu-item"); -item.empty().append($("
                                            ").html(_44b.text)); -if(_44b.iconCls){ -$("
                                            ").addClass(_44b.iconCls).appendTo(item); -} -if(_44b.id){ -item.attr("id",_44b.id); -} -if(_44b.onclick){ -if(typeof _44b.onclick=="string"){ -item.attr("onclick",_44b.onclick); -}else{ -item[0].onclick=eval(_44b.onclick); -} -} -if(_44b.disabled){ -_44c(_449,item[0],true); -} -if(item[0].submenu){ -$("
                                            ").appendTo(item); -} -} -}; -function _447(_44d,menu){ -var opts=$.data(_44d,"menu").options; -var _44e=menu.attr("style")||""; -var _44f=menu.is(":visible"); -menu.css({display:"block",left:-10000,height:"auto",overflow:"hidden"}); -menu.find(".menu-item").each(function(){ -$(this)._outerHeight(opts.itemHeight); -$(this).find(".menu-text").css({height:(opts.itemHeight-2)+"px",lineHeight:(opts.itemHeight-2)+"px"}); -}); -menu.removeClass("menu-noline").addClass(opts.noline?"menu-noline":""); -var _450=menu.data("menu").options; -var _451=_450.width; -var _452=_450.height; -if(isNaN(parseInt(_451))){ -_451=0; -menu.find("div.menu-text").each(function(){ -if(_451<$(this).outerWidth()){ -_451=$(this).outerWidth(); -} -}); -_451=_451?_451+40:""; -} -var _453=Math.round(menu.outerHeight()); -if(isNaN(parseInt(_452))){ -_452=_453; -if(menu.hasClass("menu-top")&&opts.alignTo){ -var at=$(opts.alignTo); -var h1=at.offset().top-$(document).scrollTop(); -var h2=$(window)._outerHeight()+$(document).scrollTop()-at.offset().top-at._outerHeight(); -_452=Math.min(_452,Math.max(h1,h2)); -}else{ -if(_452>$(window)._outerHeight()){ -_452=$(window).height(); -} -} -} -menu.attr("style",_44e); -menu.show(); -menu._size($.extend({},_450,{width:_451,height:_452,minWidth:_450.minWidth||opts.minWidth,maxWidth:_450.maxWidth||opts.maxWidth})); -menu.find(".easyui-fluid").triggerHandler("_resize",[true]); -menu.css("overflow",menu.outerHeight()<_453?"auto":"hidden"); -menu.children("div.menu-line")._outerHeight(_453-2); -if(!_44f){ -menu.hide(); -} -}; -function _448(_454,menu){ -var _455=$.data(_454,"menu"); -var opts=_455.options; -menu._unbind(".menu"); -for(var _456 in opts.events){ -menu._bind(_456+".menu",{target:_454},opts.events[_456]); -} -}; -function _457(e){ -var _458=e.data.target; -var _459=$.data(_458,"menu"); -if(_459.timer){ -clearTimeout(_459.timer); -_459.timer=null; -} -}; -function _45a(e){ -var _45b=e.data.target; -var _45c=$.data(_45b,"menu"); -if(_45c.options.hideOnUnhover){ -_45c.timer=setTimeout(function(){ -_45d(_45b,$(_45b).hasClass("menu-inline")); -},_45c.options.duration); -} -}; -function _45e(e){ -var _45f=e.data.target; -var item=$(e.target).closest(".menu-item"); -if(item.length){ -item.siblings().each(function(){ -if(this.submenu){ -_43d(this.submenu); -} -$(this).removeClass("menu-active"); -}); -item.addClass("menu-active"); -if(item.hasClass("menu-item-disabled")){ -item.addClass("menu-active-disabled"); -return; -} -var _460=item[0].submenu; -if(_460){ -$(_45f).menu("show",{menu:_460,parent:item}); -} -} -}; -function _461(e){ -var item=$(e.target).closest(".menu-item"); -if(item.length){ -item.removeClass("menu-active menu-active-disabled"); -var _462=item[0].submenu; -if(_462){ -if(e.pageX>=parseInt(_462.css("left"))){ -item.addClass("menu-active"); -}else{ -_43d(_462); -} -}else{ -item.removeClass("menu-active"); -} -} -}; -function _463(e){ -var _464=e.data.target; -var item=$(e.target).closest(".menu-item"); -if(item.length){ -var opts=$(_464).data("menu").options; -var _465=item.data("menuitem").options; -if(_465.disabled){ -return; -} -if(!item[0].submenu){ -_45d(_464,opts.inline); -if(_465.href){ -location.href=_465.href; -} -} -item.trigger("mouseenter"); -opts.onClick.call(_464,$(_464).menu("getItem",item[0])); -} -}; -function _45d(_466,_467){ -var _468=$.data(_466,"menu"); -if(_468){ -if($(_466).is(":visible")){ -_43d($(_466)); -if(_467){ -$(_466).show(); -}else{ -_468.options.onHide.call(_466); -} -} -} -return false; -}; -function _469(_46a,_46b){ -_46b=_46b||{}; -var left,top; -var opts=$.data(_46a,"menu").options; -var menu=$(_46b.menu||_46a); -$(_46a).menu("resize",menu[0]); -if(menu.hasClass("menu-top")){ -$.extend(opts,_46b); -left=opts.left; -top=opts.top; -if(opts.alignTo){ -var at=$(opts.alignTo); -left=at.offset().left; -top=at.offset().top+at._outerHeight(); -if(opts.align=="right"){ -left+=at.outerWidth()-menu.outerWidth(); -} -} -if(left+menu.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ -left=$(window)._outerWidth()+$(document).scrollLeft()-menu.outerWidth()-5; -} -if(left<0){ -left=0; -} -top=_46c(top,opts.alignTo); -}else{ -var _46d=_46b.parent; -left=_46d.offset().left+_46d.outerWidth()-2; -if(left+menu.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){ -left=_46d.offset().left-menu.outerWidth()+2; -} -top=_46c(_46d.offset().top-3); -} -function _46c(top,_46e){ -if(top+menu.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -if(_46e){ -top=$(_46e).offset().top-menu._outerHeight(); -}else{ -top=$(window)._outerHeight()+$(document).scrollTop()-menu.outerHeight(); -} -} -if(top<0){ -top=0; -} -return top; -}; -menu.css(opts.position.call(_46a,menu[0],left,top)); -menu.show(0,function(){ -if(!menu[0].shadow){ -menu[0].shadow=$("
                                            ").insertAfter(menu); -} -menu[0].shadow.css({display:(menu.hasClass("menu-inline")?"none":"block"),zIndex:$.fn.menu.defaults.zIndex++,left:menu.css("left"),top:menu.css("top"),width:menu.outerWidth(),height:menu.outerHeight()}); -menu.css("z-index",$.fn.menu.defaults.zIndex++); -if(menu.hasClass("menu-top")){ -opts.onShow.call(_46a); -} -}); -}; -function _43d(menu){ -if(menu&&menu.length){ -_46f(menu); -menu.find("div.menu-item").each(function(){ -if(this.submenu){ -_43d(this.submenu); -} -$(this).removeClass("menu-active"); -}); -} -function _46f(m){ -m.stop(true,true); -if(m[0].shadow){ -m[0].shadow.hide(); -} -m.hide(); -}; -}; -function _470(_471,_472){ -var fn=$.isFunction(_472)?_472:function(item){ -for(var p in _472){ -if(item[p]!=_472[p]){ -return false; -} -} -return true; -}; -var _473=[]; -_474(_471,function(item){ -if(fn.call(_471,item)==true){ -_473.push(item); -} -}); -return _473; -}; -function _474(_475,cb){ -var done=false; -function nav(menu){ -menu.children("div.menu-item").each(function(){ -if(done){ -return; -} -var item=$(_475).menu("getItem",this); -if(cb.call(_475,item)==false){ -done=true; -} -if(this.submenu&&!done){ -nav(this.submenu); -} -}); -}; -nav($(_475)); -}; -function _44c(_476,_477,_478){ -var t=$(_477); -if(t.hasClass("menu-item")){ -var opts=t.data("menuitem").options; -opts.disabled=_478; -if(_478){ -t.addClass("menu-item-disabled"); -t[0].onclick=null; -}else{ -t.removeClass("menu-item-disabled"); -t[0].onclick=opts.onclick; -} -} -}; -function _479(_47a,_47b){ -var opts=$.data(_47a,"menu").options; -var menu=$(_47a); -if(_47b.parent){ -if(!_47b.parent.submenu){ -var _47c=$("
                                            ").appendTo("body"); -_47b.parent.submenu=_47c; -$("
                                            ").appendTo(_47b.parent); -_444(_47a,_47c); -} -menu=_47b.parent.submenu; -} -var div=$("
                                            ").appendTo(menu); -_446(_47a,div,_47b); -}; -function _47d(_47e,_47f){ -function _480(el){ -if(el.submenu){ -el.submenu.children("div.menu-item").each(function(){ -_480(this); -}); -var _481=el.submenu[0].shadow; -if(_481){ -_481.remove(); -} -el.submenu.remove(); -} -$(el).remove(); -}; -_480(_47f); -}; -function _482(_483,_484,_485){ -var menu=$(_484).parent(); -if(_485){ -$(_484).show(); -}else{ -$(_484).hide(); -} -_447(_483,menu); -}; -function _486(_487){ -$(_487).children("div.menu-item").each(function(){ -_47d(_487,this); -}); -if(_487.shadow){ -_487.shadow.remove(); -} -$(_487).remove(); -}; -$.fn.menu=function(_488,_489){ -if(typeof _488=="string"){ -return $.fn.menu.methods[_488](this,_489); -} -_488=_488||{}; -return this.each(function(){ -var _48a=$.data(this,"menu"); -if(_48a){ -$.extend(_48a.options,_488); -}else{ -_48a=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_488)}); -init(this); -} -$(this).css({left:_48a.options.left,top:_48a.options.top}); -}); -}; -$.fn.menu.methods={options:function(jq){ -return $.data(jq[0],"menu").options; -},show:function(jq,pos){ -return jq.each(function(){ -_469(this,pos); -}); -},hide:function(jq){ -return jq.each(function(){ -_45d(this); -}); -},destroy:function(jq){ -return jq.each(function(){ -_486(this); -}); -},setText:function(jq,_48b){ -return jq.each(function(){ -var item=$(_48b.target).data("menuitem").options; -item.text=_48b.text; -$(_48b.target).children("div.menu-text").html(_48b.text); -}); -},setIcon:function(jq,_48c){ -return jq.each(function(){ -var item=$(_48c.target).data("menuitem").options; -item.iconCls=_48c.iconCls; -$(_48c.target).children("div.menu-icon").remove(); -if(_48c.iconCls){ -$("
                                            ").addClass(_48c.iconCls).appendTo(_48c.target); -} -}); -},getItem:function(jq,_48d){ -var item=$(_48d).data("menuitem").options; -return $.extend({},item,{target:$(_48d)[0]}); -},findItem:function(jq,text){ -var _48e=jq.menu("findItems",text); -return _48e.length?_48e[0]:null; -},findItems:function(jq,text){ -if(typeof text=="string"){ -return _470(jq[0],function(item){ -return $("
                                            "+item.text+"
                                            ").text()==text; -}); -}else{ -return _470(jq[0],text); -} -},navItems:function(jq,cb){ -return jq.each(function(){ -_474(this,cb); -}); -},appendItem:function(jq,_48f){ -return jq.each(function(){ -_479(this,_48f); -}); -},removeItem:function(jq,_490){ -return jq.each(function(){ -_47d(this,_490); -}); -},enableItem:function(jq,_491){ -return jq.each(function(){ -_44c(this,_491,false); -}); -},disableItem:function(jq,_492){ -return jq.each(function(){ -_44c(this,_492,true); -}); -},showItem:function(jq,_493){ -return jq.each(function(){ -_482(this,_493,true); -}); -},hideItem:function(jq,_494){ -return jq.each(function(){ -_482(this,_494,false); -}); -},resize:function(jq,_495){ -return jq.each(function(){ -_447(this,_495?$(_495):$(this)); -}); -}}; -$.fn.menu.parseOptions=function(_496){ -return $.extend({},$.parser.parseOptions(_496,[{minWidth:"number",itemHeight:"number",duration:"number",hideOnUnhover:"boolean"},{fit:"boolean",inline:"boolean",noline:"boolean"}])); -}; -$.fn.menu.defaults={zIndex:110000,left:0,top:0,alignTo:null,align:"left",minWidth:150,itemHeight:32,duration:100,hideOnUnhover:true,inline:false,fit:false,noline:false,events:{mouseenter:_457,mouseleave:_45a,mouseover:_45e,mouseout:_461,click:_463},position:function(_497,left,top){ -return {left:left,top:top}; -},onShow:function(){ -},onHide:function(){ -},onClick:function(item){ -}}; -})(jQuery); -(function($){ -var _498=1; -function init(_499){ -$(_499).addClass("sidemenu"); -}; -function _49a(_49b,_49c){ -var opts=$(_49b).sidemenu("options"); -if(_49c){ -$.extend(opts,{width:_49c.width,height:_49c.height}); -} -$(_49b)._size(opts); -$(_49b).find(".accordion").accordion("resize"); -}; -function _49d(_49e,_49f,data){ -var opts=$(_49e).sidemenu("options"); -var tt=$("
                                              ").appendTo(_49f); -tt.tree({data:data,animate:opts.animate,onBeforeSelect:function(node){ -if(node.children){ -return false; -} -},onSelect:function(node){ -_4a0(_49e,node.id,true); -},onExpand:function(node){ -_4ad(_49e,node); -},onCollapse:function(node){ -_4ad(_49e,node); -},onClick:function(node){ -if(node.children){ -if(node.state=="open"){ -$(node.target).addClass("tree-node-nonleaf-collapsed"); -}else{ -$(node.target).removeClass("tree-node-nonleaf-collapsed"); -} -$(this).tree("toggle",node.target); -} -}}); -tt._unbind(".sidemenu")._bind("mouseleave.sidemenu",function(){ -$(_49f).trigger("mouseleave"); -}); -_4a0(_49e,opts.selectedItemId); -}; -function _4a1(_4a2,_4a3,data){ -var opts=$(_4a2).sidemenu("options"); -$(_4a3).tooltip({content:$("
                                              "),position:opts.floatMenuPosition,valign:"top",data:data,onUpdate:function(_4a4){ -var _4a5=$(this).tooltip("options"); -var data=_4a5.data; -_4a4.accordion({width:opts.floatMenuWidth,multiple:false}).accordion("add",{title:data.text,collapsed:false,collapsible:false}); -_49d(_4a2,_4a4.accordion("panels")[0],data.children); -},onShow:function(){ -var t=$(this); -var tip=t.tooltip("tip").addClass("sidemenu-tooltip"); -tip.children(".tooltip-content").addClass("sidemenu"); -tip.find(".accordion").accordion("resize"); -tip.add(tip.find("ul.tree"))._unbind(".sidemenu")._bind("mouseover.sidemenu",function(){ -t.tooltip("show"); -})._bind("mouseleave.sidemenu",function(){ -t.tooltip("hide"); -}); -t.tooltip("reposition"); -},onPosition:function(left,top){ -var tip=$(this).tooltip("tip"); -if(!opts.collapsed){ -tip.css({left:-999999}); -}else{ -if(top+tip.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -top=$(window)._outerHeight()+$(document).scrollTop()-tip.outerHeight(); -tip.css("top",top); -} -} -}}); -}; -function _4a6(_4a7,_4a8){ -$(_4a7).find(".sidemenu-tree").each(function(){ -_4a8($(this)); -}); -$(_4a7).find(".tooltip-f").each(function(){ -var tip=$(this).tooltip("tip"); -if(tip){ -tip.find(".sidemenu-tree").each(function(){ -_4a8($(this)); -}); -$(this).tooltip("reposition"); -} -}); -}; -function _4a0(_4a9,_4aa,_4ab){ -var _4ac=null; -var opts=$(_4a9).sidemenu("options"); -_4a6(_4a9,function(t){ -t.find("div.tree-node-selected").removeClass("tree-node-selected"); -var node=t.tree("find",_4aa); -if(node){ -$(node.target).addClass("tree-node-selected"); -opts.selectedItemId=node.id; -t.trigger("mouseleave.sidemenu"); -_4ac=node; -} -}); -if(_4ab&&_4ac){ -opts.onSelect.call(_4a9,_4ac); -} -}; -function _4ad(_4ae,item){ -_4a6(_4ae,function(t){ -var node=t.tree("find",item.id); -if(node){ -var _4af=t.tree("options"); -var _4b0=_4af.animate; -_4af.animate=false; -t.tree(item.state=="open"?"expand":"collapse",node.target); -_4af.animate=_4b0; -} -}); -}; -function _4b1(_4b2){ -var opts=$(_4b2).sidemenu("options"); -$(_4b2).empty(); -if(opts.data){ -$.easyui.forEach(opts.data,true,function(node){ -if(!node.id){ -node.id="_easyui_sidemenu_"+(_498++); -} -if(!node.iconCls){ -node.iconCls="sidemenu-default-icon"; -} -if(node.children){ -node.nodeCls="tree-node-nonleaf"; -if(!node.state){ -node.state="closed"; -} -if(node.state=="open"){ -node.nodeCls="tree-node-nonleaf"; -}else{ -node.nodeCls="tree-node-nonleaf tree-node-nonleaf-collapsed"; -} -} -}); -var acc=$("
                                              ").appendTo(_4b2); -acc.accordion({fit:opts.height=="auto"?false:true,border:opts.border,multiple:opts.multiple}); -var data=opts.data; -for(var i=0;i").addClass(opts.cls.arrow).appendTo(_4c2); -$("").addClass("m-btn-line").appendTo(_4c2); -} -$(_4c1).menubutton("resize"); -if(opts.menu){ -$(opts.menu).menu({duration:opts.duration}); -var _4c3=$(opts.menu).menu("options"); -var _4c4=_4c3.onShow; -var _4c5=_4c3.onHide; -$.extend(_4c3,{onShow:function(){ -var _4c6=$(this).menu("options"); -var btn=$(_4c6.alignTo); -var opts=btn.menubutton("options"); -btn.addClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1); -_4c4.call(this); -},onHide:function(){ -var _4c7=$(this).menu("options"); -var btn=$(_4c7.alignTo); -var opts=btn.menubutton("options"); -btn.removeClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1); -_4c5.call(this); -}}); -} -}; -function _4c8(_4c9){ -var opts=$.data(_4c9,"menubutton").options; -var btn=$(_4c9); -var t=btn.find("."+opts.cls.trigger); -if(!t.length){ -t=btn; -} -t._unbind(".menubutton"); -var _4ca=null; -t._bind(opts.showEvent+".menubutton",function(){ -if(!_4cb()){ -_4ca=setTimeout(function(){ -_4cc(_4c9); -},opts.duration); -return false; -} -})._bind(opts.hideEvent+".menubutton",function(){ -if(_4ca){ -clearTimeout(_4ca); -} -$(opts.menu).triggerHandler("mouseleave"); -}); -function _4cb(){ -return $(_4c9).linkbutton("options").disabled; -}; -}; -function _4cc(_4cd){ -var opts=$(_4cd).menubutton("options"); -if(opts.disabled||!opts.menu){ -return; -} -$("body>div.menu-top").menu("hide"); -var btn=$(_4cd); -var mm=$(opts.menu); -if(mm.length){ -mm.menu("options").alignTo=btn; -mm.menu("show",{alignTo:btn,align:opts.menuAlign}); -} -btn.blur(); -}; -$.fn.menubutton=function(_4ce,_4cf){ -if(typeof _4ce=="string"){ -var _4d0=$.fn.menubutton.methods[_4ce]; -if(_4d0){ -return _4d0(this,_4cf); -}else{ -return this.linkbutton(_4ce,_4cf); -} -} -_4ce=_4ce||{}; -return this.each(function(){ -var _4d1=$.data(this,"menubutton"); -if(_4d1){ -$.extend(_4d1.options,_4ce); -}else{ -$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_4ce)}); -$(this)._propAttr("disabled",false); -} -init(this); -_4c8(this); -}); -}; -$.fn.menubutton.methods={options:function(jq){ -var _4d2=jq.linkbutton("options"); -return $.extend($.data(jq[0],"menubutton").options,{toggle:_4d2.toggle,selected:_4d2.selected,disabled:_4d2.disabled}); -},destroy:function(jq){ -return jq.each(function(){ -var opts=$(this).menubutton("options"); -if(opts.menu){ -$(opts.menu).menu("destroy"); -} -$(this).remove(); -}); -}}; -$.fn.menubutton.parseOptions=function(_4d3){ -var t=$(_4d3); -return $.extend({},$.fn.linkbutton.parseOptions(_4d3),$.parser.parseOptions(_4d3,["menu",{plain:"boolean",hasDownArrow:"boolean",duration:"number"}])); -}; -$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,hasDownArrow:true,menu:null,menuAlign:"left",duration:100,showEvent:"mouseenter",hideEvent:"mouseleave",cls:{btn1:"m-btn-active",btn2:"m-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn"}}); -})(jQuery); -(function($){ -function init(_4d4){ -var opts=$.data(_4d4,"splitbutton").options; -$(_4d4).menubutton(opts); -$(_4d4).addClass("s-btn"); -}; -$.fn.splitbutton=function(_4d5,_4d6){ -if(typeof _4d5=="string"){ -var _4d7=$.fn.splitbutton.methods[_4d5]; -if(_4d7){ -return _4d7(this,_4d6); -}else{ -return this.menubutton(_4d5,_4d6); -} -} -_4d5=_4d5||{}; -return this.each(function(){ -var _4d8=$.data(this,"splitbutton"); -if(_4d8){ -$.extend(_4d8.options,_4d5); -}else{ -$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_4d5)}); -$(this)._propAttr("disabled",false); -} -init(this); -}); -}; -$.fn.splitbutton.methods={options:function(jq){ -var _4d9=jq.menubutton("options"); -var _4da=$.data(jq[0],"splitbutton").options; -$.extend(_4da,{disabled:_4d9.disabled,toggle:_4d9.toggle,selected:_4d9.selected}); -return _4da; -}}; -$.fn.splitbutton.parseOptions=function(_4db){ -var t=$(_4db); -return $.extend({},$.fn.linkbutton.parseOptions(_4db),$.parser.parseOptions(_4db,["menu",{plain:"boolean",duration:"number"}])); -}; -$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100,cls:{btn1:"m-btn-active s-btn-active",btn2:"m-btn-plain-active s-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn-line"}}); -})(jQuery); -(function($){ -var _4dc=1; -function init(_4dd){ -var _4de=$(""+""+""+""+""+""+""+"").insertAfter(_4dd); -var t=$(_4dd); -t.addClass("switchbutton-f").hide(); -var name=t.attr("name"); -if(name){ -t.removeAttr("name").attr("switchbuttonName",name); -_4de.find(".switchbutton-value").attr("name",name); -} -_4de._bind("_resize",function(e,_4df){ -if($(this).hasClass("easyui-fluid")||_4df){ -_4e0(_4dd); -} -return false; -}); -return _4de; -}; -function _4e0(_4e1,_4e2){ -var _4e3=$.data(_4e1,"switchbutton"); -var opts=_4e3.options; -var _4e4=_4e3.switchbutton; -if(_4e2){ -$.extend(opts,_4e2); -} -var _4e5=_4e4.is(":visible"); -if(!_4e5){ -_4e4.appendTo("body"); -} -_4e4._size(opts); -if(opts.label&&opts.labelPosition){ -if(opts.labelPosition=="top"){ -_4e3.label._size({width:opts.labelWidth},_4e4); -}else{ -_4e3.label._size({width:opts.labelWidth,height:_4e4.outerHeight()},_4e4); -_4e3.label.css("lineHeight",_4e4.outerHeight()+"px"); -} -} -var w=_4e4.width(); -var h=_4e4.height(); -var w=_4e4.outerWidth(); -var h=_4e4.outerHeight(); -var _4e6=parseInt(opts.handleWidth)||_4e4.height(); -var _4e7=w*2-_4e6; -_4e4.find(".switchbutton-inner").css({width:_4e7+"px",height:h+"px",lineHeight:h+"px"}); -_4e4.find(".switchbutton-handle")._outerWidth(_4e6)._outerHeight(h).css({marginLeft:-_4e6/2+"px"}); -_4e4.find(".switchbutton-on").css({width:(w-_4e6/2)+"px",textIndent:(opts.reversed?"":"-")+_4e6/2+"px"}); -_4e4.find(".switchbutton-off").css({width:(w-_4e6/2)+"px",textIndent:(opts.reversed?"-":"")+_4e6/2+"px"}); -opts.marginWidth=w-_4e6; -_4e8(_4e1,opts.checked,false); -if(!_4e5){ -_4e4.insertAfter(_4e1); -} -}; -function _4e9(_4ea){ -var _4eb=$.data(_4ea,"switchbutton"); -var opts=_4eb.options; -var _4ec=_4eb.switchbutton; -var _4ed=_4ec.find(".switchbutton-inner"); -var on=_4ed.find(".switchbutton-on").html(opts.onText); -var off=_4ed.find(".switchbutton-off").html(opts.offText); -var _4ee=_4ed.find(".switchbutton-handle").html(opts.handleText); -if(opts.reversed){ -off.prependTo(_4ed); -on.insertAfter(_4ee); -}else{ -on.prependTo(_4ed); -off.insertAfter(_4ee); -} -var _4ef="_easyui_switchbutton_"+(++_4dc); -var _4f0=_4ec.find(".switchbutton-value")._propAttr("checked",opts.checked).attr("id",_4ef); -_4f0._unbind(".switchbutton")._bind("change.switchbutton",function(e){ -return false; -}); -_4ec.removeClass("switchbutton-reversed").addClass(opts.reversed?"switchbutton-reversed":""); -if(opts.label){ -if(typeof opts.label=="object"){ -_4eb.label=$(opts.label); -_4eb.label.attr("for",_4ef); -}else{ -$(_4eb.label).remove(); -_4eb.label=$("").html(opts.label); -_4eb.label.css("textAlign",opts.labelAlign).attr("for",_4ef); -if(opts.labelPosition=="after"){ -_4eb.label.insertAfter(_4ec); -}else{ -_4eb.label.insertBefore(_4ea); -} -_4eb.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); -_4eb.label.addClass("textbox-label-"+opts.labelPosition); -} -}else{ -$(_4eb.label).remove(); -} -_4e8(_4ea,opts.checked); -_4f1(_4ea,opts.readonly); -_4f2(_4ea,opts.disabled); -$(_4ea).switchbutton("setValue",opts.value); -}; -function _4e8(_4f3,_4f4,_4f5){ -var _4f6=$.data(_4f3,"switchbutton"); -var opts=_4f6.options; -var _4f7=_4f6.switchbutton.find(".switchbutton-inner"); -var _4f8=_4f7.find(".switchbutton-on"); -var _4f9=opts.reversed?(_4f4?opts.marginWidth:0):(_4f4?0:opts.marginWidth); -var dir=_4f8.css("float").toLowerCase(); -var css={}; -css["margin-"+dir]=-_4f9+"px"; -_4f5?_4f7.animate(css,200):_4f7.css(css); -var _4fa=_4f7.find(".switchbutton-value"); -$(_4f3).add(_4fa)._propAttr("checked",_4f4); -if(opts.checked!=_4f4){ -opts.checked=_4f4; -opts.onChange.call(_4f3,opts.checked); -$(_4f3).closest("form").trigger("_change",[_4f3]); -} -}; -function _4f2(_4fb,_4fc){ -var _4fd=$.data(_4fb,"switchbutton"); -var opts=_4fd.options; -var _4fe=_4fd.switchbutton; -var _4ff=_4fe.find(".switchbutton-value"); -if(_4fc){ -opts.disabled=true; -$(_4fb).add(_4ff)._propAttr("disabled",true); -_4fe.addClass("switchbutton-disabled"); -_4fe.removeAttr("tabindex"); -}else{ -opts.disabled=false; -$(_4fb).add(_4ff)._propAttr("disabled",false); -_4fe.removeClass("switchbutton-disabled"); -_4fe.attr("tabindex",$(_4fb).attr("tabindex")||""); -} -}; -function _4f1(_500,mode){ -var _501=$.data(_500,"switchbutton"); -var opts=_501.options; -opts.readonly=mode==undefined?true:mode; -_501.switchbutton.removeClass("switchbutton-readonly").addClass(opts.readonly?"switchbutton-readonly":""); -}; -function _502(_503){ -var _504=$.data(_503,"switchbutton"); -var opts=_504.options; -_504.switchbutton._unbind(".switchbutton")._bind("click.switchbutton",function(){ -if(!opts.disabled&&!opts.readonly){ -_4e8(_503,opts.checked?false:true,true); -} -})._bind("keydown.switchbutton",function(e){ -if(e.which==13||e.which==32){ -if(!opts.disabled&&!opts.readonly){ -_4e8(_503,opts.checked?false:true,true); -return false; -} -} -}); -}; -$.fn.switchbutton=function(_505,_506){ -if(typeof _505=="string"){ -return $.fn.switchbutton.methods[_505](this,_506); -} -_505=_505||{}; -return this.each(function(){ -var _507=$.data(this,"switchbutton"); -if(_507){ -$.extend(_507.options,_505); -}else{ -_507=$.data(this,"switchbutton",{options:$.extend({},$.fn.switchbutton.defaults,$.fn.switchbutton.parseOptions(this),_505),switchbutton:init(this)}); -} -_507.options.originalChecked=_507.options.checked; -_4e9(this); -_4e0(this); -_502(this); -}); -}; -$.fn.switchbutton.methods={options:function(jq){ -var _508=jq.data("switchbutton"); -return $.extend(_508.options,{value:_508.switchbutton.find(".switchbutton-value").val()}); -},resize:function(jq,_509){ -return jq.each(function(){ -_4e0(this,_509); -}); -},enable:function(jq){ -return jq.each(function(){ -_4f2(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_4f2(this,true); -}); -},readonly:function(jq,mode){ -return jq.each(function(){ -_4f1(this,mode); -}); -},check:function(jq){ -return jq.each(function(){ -_4e8(this,true); -}); -},uncheck:function(jq){ -return jq.each(function(){ -_4e8(this,false); -}); -},clear:function(jq){ -return jq.each(function(){ -_4e8(this,false); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).switchbutton("options"); -_4e8(this,opts.originalChecked); -}); -},setValue:function(jq,_50a){ -return jq.each(function(){ -$(this).val(_50a); -$.data(this,"switchbutton").switchbutton.find(".switchbutton-value").val(_50a); -}); -}}; -$.fn.switchbutton.parseOptions=function(_50b){ -var t=$(_50b); -return $.extend({},$.parser.parseOptions(_50b,["onText","offText","handleText",{handleWidth:"number",reversed:"boolean"},"label","labelPosition","labelAlign",{labelWidth:"number"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)}); -}; -$.fn.switchbutton.defaults={handleWidth:"auto",width:60,height:30,checked:false,disabled:false,readonly:false,reversed:false,onText:"ON",offText:"OFF",handleText:"",value:"on",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",onChange:function(_50c){ -}}; -})(jQuery); -(function($){ -var _50d=1; -function init(_50e){ -var _50f=$(""+""+""+"").insertAfter(_50e); -var t=$(_50e); -t.addClass("radiobutton-f").hide(); -var name=t.attr("name"); -if(name){ -t.removeAttr("name").attr("radiobuttonName",name); -_50f.find(".radiobutton-value").attr("name",name); -} -return _50f; -}; -function _510(_511){ -var _512=$.data(_511,"radiobutton"); -var opts=_512.options; -var _513=_512.radiobutton; -var _514="_easyui_radiobutton_"+(++_50d); -var _515=_513.find(".radiobutton-value").attr("id",_514); -_515._unbind(".radiobutton")._bind("change.radiobutton",function(e){ -return false; -}); -if(opts.label){ -if(typeof opts.label=="object"){ -_512.label=$(opts.label); -_512.label.attr("for",_514); -}else{ -$(_512.label).remove(); -_512.label=$("").html(opts.label); -_512.label.css("textAlign",opts.labelAlign).attr("for",_514); -if(opts.labelPosition=="after"){ -_512.label.insertAfter(_513); -}else{ -_512.label.insertBefore(_511); -} -_512.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); -_512.label.addClass("textbox-label-"+opts.labelPosition); -} -}else{ -$(_512.label).remove(); -} -$(_511).radiobutton("setValue",opts.value); -_516(_511,opts.checked); -_517(_511,opts.readonly); -_518(_511,opts.disabled); -}; -function _519(_51a){ -var _51b=$.data(_51a,"radiobutton"); -var opts=_51b.options; -var _51c=_51b.radiobutton; -_51c._unbind(".radiobutton")._bind("click.radiobutton",function(){ -if(!opts.disabled&&!opts.readonly){ -_516(_51a,true); -} -}); -}; -function _51d(_51e){ -var _51f=$.data(_51e,"radiobutton"); -var opts=_51f.options; -var _520=_51f.radiobutton; -_520._size(opts,_520.parent()); -if(opts.label&&opts.labelPosition){ -if(opts.labelPosition=="top"){ -_51f.label._size({width:opts.labelWidth},_520); -}else{ -_51f.label._size({width:opts.labelWidth,height:_520.outerHeight()},_520); -_51f.label.css("lineHeight",_520.outerHeight()+"px"); -} -} -}; -function _516(_521,_522){ -if(_522){ -var f=$(_521).closest("form"); -var name=$(_521).attr("radiobuttonName"); -f.find(".radiobutton-f[radiobuttonName=\""+name+"\"]").each(function(){ -if(this!=_521){ -_523(this,false); -} -}); -_523(_521,true); -}else{ -_523(_521,false); -} -function _523(b,c){ -var _524=$(b).data("radiobutton"); -var opts=_524.options; -var _525=_524.radiobutton; -_525.find(".radiobutton-inner").css("display",c?"":"none"); -_525.find(".radiobutton-value")._propAttr("checked",c); -if(c){ -_525.addClass("radiobutton-checked"); -$(_524.label).addClass("textbox-label-checked"); -}else{ -_525.removeClass("radiobutton-checked"); -$(_524.label).removeClass("textbox-label-checked"); -} -if(opts.checked!=c){ -opts.checked=c; -opts.onChange.call($(b)[0],c); -$(b).closest("form").trigger("_change",[$(b)[0]]); -} -}; -}; -function _518(_526,_527){ -var _528=$.data(_526,"radiobutton"); -var opts=_528.options; -var _529=_528.radiobutton; -var rv=_529.find(".radiobutton-value"); -opts.disabled=_527; -if(_527){ -$(_526).add(rv)._propAttr("disabled",true); -_529.addClass("radiobutton-disabled"); -$(_528.label).addClass("textbox-label-disabled"); -}else{ -$(_526).add(rv)._propAttr("disabled",false); -_529.removeClass("radiobutton-disabled"); -$(_528.label).removeClass("textbox-label-disabled"); -} -}; -function _517(_52a,mode){ -var _52b=$.data(_52a,"radiobutton"); -var opts=_52b.options; -opts.readonly=mode==undefined?true:mode; -if(opts.readonly){ -_52b.radiobutton.addClass("radiobutton-readonly"); -$(_52b.label).addClass("textbox-label-readonly"); -}else{ -_52b.radiobutton.removeClass("radiobutton-readonly"); -$(_52b.label).removeClass("textbox-label-readonly"); -} -}; -$.fn.radiobutton=function(_52c,_52d){ -if(typeof _52c=="string"){ -return $.fn.radiobutton.methods[_52c](this,_52d); -} -_52c=_52c||{}; -return this.each(function(){ -var _52e=$.data(this,"radiobutton"); -if(_52e){ -$.extend(_52e.options,_52c); -}else{ -_52e=$.data(this,"radiobutton",{options:$.extend({},$.fn.radiobutton.defaults,$.fn.radiobutton.parseOptions(this),_52c),radiobutton:init(this)}); -} -_52e.options.originalChecked=_52e.options.checked; -_510(this); -_519(this); -_51d(this); -}); -}; -$.fn.radiobutton.methods={options:function(jq){ -var _52f=jq.data("radiobutton"); -return $.extend(_52f.options,{value:_52f.radiobutton.find(".radiobutton-value").val()}); -},setValue:function(jq,_530){ -return jq.each(function(){ -$(this).val(_530); -$.data(this,"radiobutton").radiobutton.find(".radiobutton-value").val(_530); -}); -},enable:function(jq){ -return jq.each(function(){ -_518(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_518(this,true); -}); -},readonly:function(jq,mode){ -return jq.each(function(){ -_517(this,mode); -}); -},check:function(jq){ -return jq.each(function(){ -_516(this,true); -}); -},uncheck:function(jq){ -return jq.each(function(){ -_516(this,false); -}); -},clear:function(jq){ -return jq.each(function(){ -_516(this,false); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).radiobutton("options"); -_516(this,opts.originalChecked); -}); -}}; -$.fn.radiobutton.parseOptions=function(_531){ -var t=$(_531); -return $.extend({},$.parser.parseOptions(_531,["label","labelPosition","labelAlign",{labelWidth:"number"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)}); -}; -$.fn.radiobutton.defaults={width:20,height:20,value:null,disabled:false,readonly:false,checked:false,label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",onChange:function(_532){ -}}; -})(jQuery); -(function($){ -var _533=1; -function init(_534){ -var _535=$(""+""+""+""+""+"").insertAfter(_534); -var t=$(_534); -t.addClass("checkbox-f").hide(); -var name=t.attr("name"); -if(name){ -t.removeAttr("name").attr("checkboxName",name); -_535.find(".checkbox-value").attr("name",name); -} -return _535; -}; -function _536(_537){ -var _538=$.data(_537,"checkbox"); -var opts=_538.options; -var _539=_538.checkbox; -var _53a="_easyui_checkbox_"+(++_533); -var _53b=_539.find(".checkbox-value").attr("id",_53a); -_53b._unbind(".checkbox")._bind("change.checkbox",function(e){ -return false; -}); -if(opts.label){ -if(typeof opts.label=="object"){ -_538.label=$(opts.label); -_538.label.attr("for",_53a); -}else{ -$(_538.label).remove(); -_538.label=$("").html(opts.label); -_538.label.css("textAlign",opts.labelAlign).attr("for",_53a); -if(opts.labelPosition=="after"){ -_538.label.insertAfter(_539); -}else{ -_538.label.insertBefore(_537); -} -_538.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); -_538.label.addClass("textbox-label-"+opts.labelPosition); -} -}else{ -$(_538.label).remove(); -} -$(_537).checkbox("setValue",opts.value); -_53c(_537,opts.checked); -_53d(_537,opts.readonly); -_53e(_537,opts.disabled); -}; -function _53f(_540){ -var _541=$.data(_540,"checkbox"); -var opts=_541.options; -var _542=_541.checkbox; -_542._unbind(".checkbox")._bind("click.checkbox",function(){ -if(!opts.disabled&&!opts.readonly){ -_53c(_540,!opts.checked); -} -}); -}; -function _543(_544){ -var _545=$.data(_544,"checkbox"); -var opts=_545.options; -var _546=_545.checkbox; -_546._size(opts,_546.parent()); -if(opts.label&&opts.labelPosition){ -if(opts.labelPosition=="top"){ -_545.label._size({width:opts.labelWidth},_546); -}else{ -_545.label._size({width:opts.labelWidth,height:_546.outerHeight()},_546); -_545.label.css("lineHeight",_546.outerHeight()+"px"); -} -} -}; -function _53c(_547,_548){ -var _549=$.data(_547,"checkbox"); -var opts=_549.options; -var _54a=_549.checkbox; -_54a.find(".checkbox-value")._propAttr("checked",_548); -var _54b=_54a.find(".checkbox-inner").css("display",_548?"":"none"); -if(_548){ -_54a.addClass("checkbox-checked"); -$(_549.label).addClass("textbox-label-checked"); -}else{ -_54a.removeClass("checkbox-checked"); -$(_549.label).removeClass("textbox-label-checked"); -} -if(opts.checked!=_548){ -opts.checked=_548; -opts.onChange.call(_547,_548); -$(_547).closest("form").trigger("_change",[_547]); -} -}; -function _53d(_54c,mode){ -var _54d=$.data(_54c,"checkbox"); -var opts=_54d.options; -opts.readonly=mode==undefined?true:mode; -if(opts.readonly){ -_54d.checkbox.addClass("checkbox-readonly"); -$(_54d.label).addClass("textbox-label-readonly"); -}else{ -_54d.checkbox.removeClass("checkbox-readonly"); -$(_54d.label).removeClass("textbox-label-readonly"); -} -}; -function _53e(_54e,_54f){ -var _550=$.data(_54e,"checkbox"); -var opts=_550.options; -var _551=_550.checkbox; -var rv=_551.find(".checkbox-value"); -opts.disabled=_54f; -if(_54f){ -$(_54e).add(rv)._propAttr("disabled",true); -_551.addClass("checkbox-disabled"); -$(_550.label).addClass("textbox-label-disabled"); -}else{ -$(_54e).add(rv)._propAttr("disabled",false); -_551.removeClass("checkbox-disabled"); -$(_550.label).removeClass("textbox-label-disabled"); -} -}; -$.fn.checkbox=function(_552,_553){ -if(typeof _552=="string"){ -return $.fn.checkbox.methods[_552](this,_553); -} -_552=_552||{}; -return this.each(function(){ -var _554=$.data(this,"checkbox"); -if(_554){ -$.extend(_554.options,_552); -}else{ -_554=$.data(this,"checkbox",{options:$.extend({},$.fn.checkbox.defaults,$.fn.checkbox.parseOptions(this),_552),checkbox:init(this)}); -} -_554.options.originalChecked=_554.options.checked; -_536(this); -_53f(this); -_543(this); -}); -}; -$.fn.checkbox.methods={options:function(jq){ -var _555=jq.data("checkbox"); -return $.extend(_555.options,{value:_555.checkbox.find(".checkbox-value").val()}); -},setValue:function(jq,_556){ -return jq.each(function(){ -$(this).val(_556); -$.data(this,"checkbox").checkbox.find(".checkbox-value").val(_556); -}); -},enable:function(jq){ -return jq.each(function(){ -_53e(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_53e(this,true); -}); -},readonly:function(jq,mode){ -return jq.each(function(){ -_53d(this,mode); -}); -},check:function(jq){ -return jq.each(function(){ -_53c(this,true); -}); -},uncheck:function(jq){ -return jq.each(function(){ -_53c(this,false); -}); -},clear:function(jq){ -return jq.each(function(){ -_53c(this,false); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).checkbox("options"); -_53c(this,opts.originalChecked); -}); -}}; -$.fn.checkbox.parseOptions=function(_557){ -var t=$(_557); -return $.extend({},$.parser.parseOptions(_557,["label","labelPosition","labelAlign",{labelWidth:"number"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)}); -}; -$.fn.checkbox.defaults={width:20,height:20,value:null,disabled:false,readonly:false,checked:false,label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",onChange:function(_558){ -}}; -})(jQuery); -(function($){ -var _559=1; -function _55a(_55b){ -var _55c=$.data(_55b,"radiogroup"); -var opts=_55c.options; -$(_55b).addClass("radiogroup").empty(); -var c=$("
                                              ").appendTo(_55b); -if(opts.dir=="h"){ -c.addClass("f-row"); -c.css("flex-wrap","wrap"); -}else{ -c.addClass("f-column"); -} -var name=opts.name||("radioname"+_559++); -for(var i=0;i").appendTo(c); -if(opts.itemStyle){ -_55d.css(opts.itemStyle); -} -var rb=$("").attr("name",name).appendTo(_55d); -rb.radiobutton($.extend({},{labelWidth:opts.labelWidth,labelPosition:opts.labelPosition,labelAlign:opts.labelAlign},opts.data[i],{checked:opts.data[i].value==opts.value,item:opts.data[i],onChange:function(){ -c.find(".radiobutton-f").each(function(){ -var _55e=$(this).radiobutton("options"); -if(_55e.checked){ -opts.value=_55e.item.value; -opts.onChange.call(_55b,_55e.item.value); -} -}); -}})); -var _55c=rb.data("radiobutton"); -if(_55c.options.labelWidth=="auto"){ -$(_55c.label).css("width","auto"); -} -} -}; -function _55f(_560,_561){ -$(_560).find(".radiobutton-f").each(function(){ -var _562=$(this).radiobutton("options"); -if(_562.item.value==_561){ -$(this).radiobutton("check"); -} -}); -}; -$.fn.radiogroup=function(_563,_564){ -if(typeof _563=="string"){ -return $.fn.radiogroup.methods[_563](this,_564); -} -_563=_563||{}; -return this.each(function(){ -var _565=$.data(this,"radiogroup"); -if(_565){ -$.extend(_565.options,_563); -}else{ -_565=$.data(this,"radiogroup",{options:$.extend({},$.fn.radiogroup.defaults,$.fn.radiogroup.parseOptions(this),_563)}); -} -_55a(this); -}); -}; -$.fn.radiogroup.methods={options:function(jq){ -return jq.data("radiogroup").options; -},setValue:function(jq,_566){ -return jq.each(function(){ -_55f(this,_566); -}); -},getValue:function(jq){ -return jq.radiogroup("options").value; -}}; -$.fn.radiogroup.parseOptions=function(_567){ -return $.extend({},$.parser.parseOptions(_567,["dir","name","value","labelPosition","labelAlign",{labelWidth:"number"}])); -}; -$.fn.radiogroup.defaults={dir:"h",name:null,value:null,labelWidth:"",labelPosition:"after",labelAlign:"left",itemStyle:{height:30},onChange:function(_568){ -}}; -})(jQuery); -(function($){ -var _569=1; -function _56a(_56b){ -var _56c=$.data(_56b,"checkgroup"); -var opts=_56c.options; -$(_56b).addClass("checkgroup").empty(); -var c=$("
                                              ").appendTo(_56b); -if(opts.dir=="h"){ -c.addClass("f-row"); -c.css("flex-wrap","wrap"); -}else{ -c.addClass("f-column"); -} -var name=opts.name||("checkname"+_569++); -for(var i=0;i").appendTo(c); -if(opts.itemStyle){ -_56d.css(opts.itemStyle); -} -var ck=$("").attr("name",name).appendTo(_56d); -ck.checkbox($.extend({},{labelWidth:opts.labelWidth,labelPosition:opts.labelPosition,labelAlign:opts.labelAlign},opts.data[i],{checked:$.inArray(opts.data[i].value,opts.value)>=0,item:opts.data[i],onChange:function(){ -var vv=[]; -c.find(".checkbox-f").each(function(){ -var _56e=$(this).checkbox("options"); -if(_56e.checked){ -vv.push(_56e.item.value); -} -}); -opts.value=vv; -opts.onChange.call(_56b,vv); -}})); -var _56c=ck.data("checkbox"); -if(_56c.options.labelWidth=="auto"){ -$(_56c.label).css("width","auto"); -} -} -}; -function _56f(_570,_571){ -var _572=$.data(_570,"checkgroup"); -var opts=_572.options; -var _573=opts.onChange; -opts.onChange=function(){ -}; -var _574=$.extend([],opts.value).sort().join(","); -$(_570).find(".checkbox-f").each(function(){ -var _575=$(this).checkbox("options"); -if($.inArray(_575.item.value,_571)>=0){ -$(this).checkbox("check"); -}else{ -$(this).checkbox("uncheck"); -} -}); -opts.onChange=_573; -var _576=$.extend([],opts.value).sort().join(","); -if(_576!=_574){ -opts.onChange.call(_570,opts.value); -} -}; -$.fn.checkgroup=function(_577,_578){ -if(typeof _577=="string"){ -return $.fn.checkgroup.methods[_577](this,_578); -} -_577=_577||{}; -return this.each(function(){ -var _579=$.data(this,"checkgroup"); -if(_579){ -$.extend(_579.options,_577); -}else{ -_579=$.data(this,"checkgroup",{options:$.extend({},$.fn.checkgroup.defaults,$.fn.checkgroup.parseOptions(this),_577)}); -} -_56a(this); -}); -}; -$.fn.checkgroup.methods={options:function(jq){ -return jq.data("checkgroup").options; -},setValue:function(jq,_57a){ -return jq.each(function(){ -_56f(this,_57a); -}); -},getValue:function(jq){ -return jq.checkgroup("options").value; -}}; -$.fn.checkgroup.parseOptions=function(_57b){ -return $.extend({},$.parser.parseOptions(_57b,["dir","name","value","labelPosition","labelAlign",{labelWidth:"number"}])); -}; -$.fn.checkgroup.defaults={dir:"h",name:null,value:[],labelWidth:"",labelPosition:"after",labelAlign:"left",itemStyle:{height:30},onChange:function(_57c){ -}}; -})(jQuery); -(function($){ -function init(_57d){ -$(_57d).addClass("validatebox-text"); -}; -function _57e(_57f){ -var _580=$.data(_57f,"validatebox"); -_580.validating=false; -if(_580.vtimer){ -clearTimeout(_580.vtimer); -} -if(_580.ftimer){ -clearTimeout(_580.ftimer); -} -$(_57f).tooltip("destroy"); -$(_57f)._unbind(); -$(_57f).remove(); -}; -function _581(_582){ -var opts=$.data(_582,"validatebox").options; -$(_582)._unbind(".validatebox"); -if(opts.novalidate||opts.disabled){ -return; -} -for(var _583 in opts.events){ -$(_582)._bind(_583+".validatebox",{target:_582},opts.events[_583]); -} -}; -function _584(e){ -var _585=e.data.target; -var _586=$.data(_585,"validatebox"); -var opts=_586.options; -if($(_585).attr("readonly")){ -return; -} -_586.validating=true; -_586.value=opts.val(_585); -(function f(){ -if(!$(_585).is(":visible")){ -_586.validating=false; -} -if(_586.validating){ -var _587=opts.val(_585); -if(_586.value!=_587){ -_586.value=_587; -if(_586.vtimer){ -clearTimeout(_586.vtimer); -} -_586.vtimer=setTimeout(function(){ -$(_585).validatebox("validate"); -},opts.delay); -}else{ -if(_586.message){ -opts.err(_585,_586.message); -} -} -_586.ftimer=setTimeout(f,opts.interval); -} -})(); -}; -function _588(e){ -var _589=e.data.target; -var _58a=$.data(_589,"validatebox"); -var opts=_58a.options; -_58a.validating=false; -if(_58a.vtimer){ -clearTimeout(_58a.vtimer); -_58a.vtimer=undefined; -} -if(_58a.ftimer){ -clearTimeout(_58a.ftimer); -_58a.ftimer=undefined; -} -if(opts.validateOnBlur){ -setTimeout(function(){ -$(_589).validatebox("validate"); -},0); -} -opts.err(_589,_58a.message,"hide"); -}; -function _58b(e){ -var _58c=e.data.target; -var _58d=$.data(_58c,"validatebox"); -_58d.options.err(_58c,_58d.message,"show"); -}; -function _58e(e){ -var _58f=e.data.target; -var _590=$.data(_58f,"validatebox"); -if(!_590.validating){ -_590.options.err(_58f,_590.message,"hide"); -} -}; -function _591(_592,_593,_594){ -var _595=$.data(_592,"validatebox"); -var opts=_595.options; -var t=$(_592); -if(_594=="hide"||!_593){ -t.tooltip("hide"); -}else{ -if((t.is(":focus")&&_595.validating)||_594=="show"){ -t.tooltip($.extend({},opts.tipOptions,{content:_593,position:opts.tipPosition,deltaX:opts.deltaX,deltaY:opts.deltaY})).tooltip("show"); -} -} -}; -function _596(_597){ -var _598=$.data(_597,"validatebox"); -var opts=_598.options; -var box=$(_597); -opts.onBeforeValidate.call(_597); -var _599=_59a(); -_599?box.removeClass("validatebox-invalid"):box.addClass("validatebox-invalid"); -opts.err(_597,_598.message); -opts.onValidate.call(_597,_599); -return _599; -function _59b(msg){ -_598.message=msg; -}; -function _59c(_59d,_59e){ -var _59f=opts.val(_597); -var _5a0=/([a-zA-Z_]+)(.*)/.exec(_59d); -var rule=opts.rules[_5a0[1]]; -if(rule&&_59f){ -var _5a1=_59e||opts.validParams||eval(_5a0[2]); -if(!rule["validator"].call(_597,_59f,_5a1)){ -var _5a2=rule["message"]; -if(_5a1){ -for(var i=0;i<_5a1.length;i++){ -_5a2=_5a2.replace(new RegExp("\\{"+i+"\\}","g"),_5a1[i]); -} -} -_59b(opts.invalidMessage||_5a2); -return false; -} -} -return true; -}; -function _59a(){ -_59b(""); -if(!opts._validateOnCreate){ -setTimeout(function(){ -opts._validateOnCreate=true; -},0); -return true; -} -if(opts.novalidate||opts.disabled){ -return true; -} -if(opts.required){ -if(opts.val(_597)==""){ -_59b(opts.missingMessage); -return false; -} -} -if(opts.validType){ -if($.isArray(opts.validType)){ -for(var i=0;i=_5b7[0]&&len<=_5b7[1]; -},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_5b8,_5b9){ -var data={}; -data[_5b9[1]]=_5b8; -var _5ba=$.ajax({url:_5b9[0],dataType:"json",data:data,async:false,cache:false,type:"post"}).responseText; -return _5ba.replace(/\s/g,"")=="true"; -},message:"Please fix this field."}},onBeforeValidate:function(){ -},onValidate:function(_5bb){ -}}; -})(jQuery); -(function($){ -var _5bc=0; -function init(_5bd){ -$(_5bd).addClass("textbox-f").hide(); -var span=$(""+""+""+"").insertAfter(_5bd); -var name=$(_5bd).attr("name"); -if(name){ -span.find("input.textbox-value").attr("name",name); -$(_5bd).removeAttr("name").attr("textboxName",name); -} -return span; -}; -function _5be(_5bf){ -var _5c0=$.data(_5bf,"textbox"); -var opts=_5c0.options; -var tb=_5c0.textbox; -var _5c1="_easyui_textbox_input"+(++_5bc); -tb.addClass(opts.cls); -tb.find(".textbox-text").remove(); -if(opts.multiline){ -$("").prependTo(tb); -}else{ -$("").prependTo(tb); -} -$("#"+_5c1).attr("tabindex",$(_5bf).attr("tabindex")||"").css("text-align",_5bf.style.textAlign||""); -tb.find(".textbox-addon").remove(); -var bb=opts.icons?$.extend(true,[],opts.icons):[]; -if(opts.iconCls){ -bb.push({iconCls:opts.iconCls,disabled:true}); -} -if(bb.length){ -var bc=$("").prependTo(tb); -bc.addClass("textbox-addon-"+opts.iconAlign); -for(var i=0;i"); -} -} -tb.find(".textbox-button").remove(); -if(opts.buttonText||opts.buttonIcon){ -var btn=$("").prependTo(tb); -btn.addClass("textbox-button-"+opts.buttonAlign).linkbutton({text:opts.buttonText,iconCls:opts.buttonIcon,onClick:function(){ -var t=$(this).parent().prev(); -t.textbox("options").onClickButton.call(t[0]); -}}); -} -if(opts.label){ -if(typeof opts.label=="object"){ -_5c0.label=$(opts.label); -_5c0.label.attr("for",_5c1); -}else{ -$(_5c0.label).remove(); -_5c0.label=$("").html(opts.label); -_5c0.label.css("textAlign",opts.labelAlign).attr("for",_5c1); -if(opts.labelPosition=="after"){ -_5c0.label.insertAfter(tb); -}else{ -_5c0.label.insertBefore(_5bf); -} -_5c0.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); -_5c0.label.addClass("textbox-label-"+opts.labelPosition); -} -}else{ -$(_5c0.label).remove(); -} -_5c2(_5bf); -_5c3(_5bf,opts.disabled); -_5c4(_5bf,opts.readonly); -}; -function _5c5(_5c6){ -var _5c7=$.data(_5c6,"textbox"); -var tb=_5c7.textbox; -tb.find(".textbox-text").validatebox("destroy"); -tb.remove(); -$(_5c7.label).remove(); -$(_5c6).remove(); -}; -function _5c8(_5c9,_5ca){ -var _5cb=$.data(_5c9,"textbox"); -var opts=_5cb.options; -var tb=_5cb.textbox; -var _5cc=tb.parent(); -if(_5ca){ -if(typeof _5ca=="object"){ -$.extend(opts,_5ca); -}else{ -opts.width=_5ca; -} -} -if(isNaN(parseInt(opts.width))){ -var c=$(_5c9).clone(); -c.css("visibility","hidden"); -c.insertAfter(_5c9); -opts.width=c.outerWidth(); -c.remove(); -} -if(opts.autoSize){ -$(_5c9).textbox("autoSize"); -opts.width=tb.css("width","").outerWidth(); -if(opts.labelPosition!="top"){ -opts.width+=$(_5cb.label).outerWidth(); -} -} -var _5cd=tb.is(":visible"); -if(!_5cd){ -tb.appendTo("body"); -} -var _5ce=tb.find(".textbox-text"); -var btn=tb.find(".textbox-button"); -var _5cf=tb.find(".textbox-addon"); -var _5d0=_5cf.find(".textbox-icon"); -if(opts.height=="auto"){ -_5ce.css({margin:"",paddingTop:"",paddingBottom:"",height:"",lineHeight:""}); -} -tb._size(opts,_5cc); -if(opts.label&&opts.labelPosition){ -if(opts.labelPosition=="top"){ -_5cb.label._size({width:opts.labelWidth=="auto"?tb.outerWidth():opts.labelWidth},tb); -if(opts.height!="auto"){ -tb._size("height",tb.outerHeight()-_5cb.label.outerHeight()); -} -}else{ -_5cb.label._size({width:opts.labelWidth,height:tb.outerHeight()},tb); -if(!opts.multiline){ -_5cb.label.css("lineHeight",_5cb.label.height()+"px"); -} -tb._size("width",tb.outerWidth()-_5cb.label.outerWidth()); -} -} -if(opts.buttonAlign=="left"||opts.buttonAlign=="right"){ -btn.linkbutton("resize",{height:tb.height()}); -}else{ -btn.linkbutton("resize",{width:"100%"}); -} -var _5d1=tb.width()-_5d0.length*opts.iconWidth-_5d2("left")-_5d2("right"); -var _5d3=opts.height=="auto"?_5ce.outerHeight():(tb.height()-_5d2("top")-_5d2("bottom")); -_5cf.css(opts.iconAlign,_5d2(opts.iconAlign)+"px"); -_5cf.css("top",_5d2("top")+"px"); -_5d0.css({width:opts.iconWidth+"px",height:_5d3+"px"}); -_5ce.css({paddingLeft:(_5c9.style.paddingLeft||""),paddingRight:(_5c9.style.paddingRight||""),marginLeft:_5d4("left"),marginRight:_5d4("right"),marginTop:_5d2("top"),marginBottom:_5d2("bottom")}); -if(opts.multiline){ -_5ce.css({paddingTop:(_5c9.style.paddingTop||""),paddingBottom:(_5c9.style.paddingBottom||"")}); -_5ce._outerHeight(_5d3); -}else{ -_5ce.css({paddingTop:0,paddingBottom:0,height:_5d3+"px",lineHeight:_5d3+"px"}); -} -_5ce._outerWidth(_5d1); -opts.onResizing.call(_5c9,opts.width,opts.height); -if(!_5cd){ -tb.insertAfter(_5c9); -} -opts.onResize.call(_5c9,opts.width,opts.height); -function _5d4(_5d5){ -return (opts.iconAlign==_5d5?_5cf._outerWidth():0)+_5d2(_5d5); -}; -function _5d2(_5d6){ -var w=0; -btn.filter(".textbox-button-"+_5d6).each(function(){ -if(_5d6=="left"||_5d6=="right"){ -w+=$(this).outerWidth(); -}else{ -w+=$(this).outerHeight(); -} -}); -return w; -}; -}; -function _5d7(_5d8){ -var opts=$(_5d8).textbox("options"); -var _5d9=$(_5d8).textbox("textbox"); -var span=$(_5d8).next(); -var tmp=$("").appendTo("body"); -tmp.attr("style",_5d9.attr("style")); -tmp.css({position:"absolute",top:-9999,left:-9999,width:"auto",fontFamily:_5d9.css("fontFamily"),fontSize:_5d9.css("fontSize"),fontWeight:_5d9.css("fontWeight"),padding:_5d9.css("padding"),whiteSpace:"nowrap"}); -var _5da=_5db(_5d9.val()); -var _5dc=_5db(opts.prompt||""); -tmp.remove(); -var _5dd=Math.min(Math.max(_5da,_5dc)+20,span.width()); -var _5dd=Math.max(_5da,_5dc); -_5d9._outerWidth(_5dd); -function _5db(val){ -var s=val.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"); -tmp.html(s); -return tmp.outerWidth(); -}; -}; -function _5c2(_5de){ -var opts=$(_5de).textbox("options"); -var _5df=$(_5de).textbox("textbox"); -_5df.validatebox($.extend({},opts,{deltaX:function(_5e0){ -return $(_5de).textbox("getTipX",_5e0); -},deltaY:function(_5e1){ -return $(_5de).textbox("getTipY",_5e1); -},onBeforeValidate:function(){ -opts.onBeforeValidate.call(_5de); -var box=$(this); -if(!box.is(":focus")){ -if(box.val()!==opts.value){ -opts.oldInputValue=box.val(); -box.val(opts.value); -} -} -},onValidate:function(_5e2){ -var box=$(this); -if(opts.oldInputValue!=undefined){ -box.val(opts.oldInputValue); -opts.oldInputValue=undefined; -} -var tb=box.parent(); -if(_5e2){ -tb.removeClass("textbox-invalid"); -}else{ -tb.addClass("textbox-invalid"); -} -opts.onValidate.call(_5de,_5e2); -}})); -}; -function _5e3(_5e4){ -var _5e5=$.data(_5e4,"textbox"); -var opts=_5e5.options; -var tb=_5e5.textbox; -var _5e6=tb.find(".textbox-text"); -_5e6.attr("placeholder",opts.prompt); -_5e6._unbind(".textbox"); -$(_5e5.label)._unbind(".textbox"); -if(!opts.disabled&&!opts.readonly){ -if(_5e5.label){ -$(_5e5.label)._bind("click.textbox",function(e){ -if(!opts.hasFocusMe){ -_5e6.focus(); -$(_5e4).textbox("setSelectionRange",{start:0,end:_5e6.val().length}); -} -}); -} -_5e6._bind("blur.textbox",function(e){ -if(!tb.hasClass("textbox-focused")){ -return; -} -opts.value=$(this).val(); -if(opts.value==""){ -$(this).val(opts.prompt).addClass("textbox-prompt"); -}else{ -$(this).removeClass("textbox-prompt"); -} -tb.removeClass("textbox-focused"); -tb.closest(".form-field").removeClass("form-field-focused"); -})._bind("focus.textbox",function(e){ -opts.hasFocusMe=true; -if(tb.hasClass("textbox-focused")){ -return; -} -if($(this).val()!=opts.value){ -$(this).val(opts.value); -} -$(this).removeClass("textbox-prompt"); -tb.addClass("textbox-focused"); -tb.closest(".form-field").addClass("form-field-focused"); -}); -for(var _5e7 in opts.inputEvents){ -_5e6._bind(_5e7+".textbox",{target:_5e4},opts.inputEvents[_5e7]); -} -} -var _5e8=tb.find(".textbox-addon"); -_5e8._unbind()._bind("click",{target:_5e4},function(e){ -var icon=$(e.target).closest("a.textbox-icon:not(.textbox-icon-disabled)"); -if(icon.length){ -var _5e9=parseInt(icon.attr("icon-index")); -var conf=opts.icons[_5e9]; -if(conf&&conf.handler){ -conf.handler.call(icon[0],e); -} -opts.onClickIcon.call(_5e4,_5e9); -} -}); -_5e8.find(".textbox-icon").each(function(_5ea){ -var conf=opts.icons[_5ea]; -var icon=$(this); -if(!conf||conf.disabled||opts.disabled||opts.readonly){ -icon.addClass("textbox-icon-disabled"); -}else{ -icon.removeClass("textbox-icon-disabled"); -} -}); -var btn=tb.find(".textbox-button"); -btn.linkbutton((opts.disabled||opts.readonly)?"disable":"enable"); -tb._unbind(".textbox")._bind("_resize.textbox",function(e,_5eb){ -if($(this).hasClass("easyui-fluid")||_5eb){ -_5c8(_5e4); -} -return false; -}); -}; -function _5c3(_5ec,_5ed){ -var _5ee=$.data(_5ec,"textbox"); -var opts=_5ee.options; -var tb=_5ee.textbox; -var _5ef=tb.find(".textbox-text"); -var ss=$(_5ec).add(tb.find(".textbox-value")); -opts.disabled=_5ed; -if(opts.disabled){ -_5ef.blur(); -_5ef.validatebox("disable"); -tb.addClass("textbox-disabled"); -ss._propAttr("disabled",true); -$(_5ee.label).addClass("textbox-label-disabled"); -}else{ -_5ef.validatebox("enable"); -tb.removeClass("textbox-disabled"); -ss._propAttr("disabled",false); -$(_5ee.label).removeClass("textbox-label-disabled"); -} -}; -function _5c4(_5f0,mode){ -var _5f1=$.data(_5f0,"textbox"); -var opts=_5f1.options; -var tb=_5f1.textbox; -var _5f2=tb.find(".textbox-text"); -opts.readonly=mode==undefined?true:mode; -if(opts.readonly){ -_5f2.triggerHandler("blur.textbox"); -} -_5f2.validatebox("readonly",opts.readonly); -if(opts.readonly){ -tb.addClass("textbox-readonly"); -$(_5f1.label).addClass("textbox-label-readonly"); -}else{ -tb.removeClass("textbox-readonly"); -$(_5f1.label).removeClass("textbox-label-readonly"); -} -}; -function _5f3(_5f4,mode){ -var _5f5=$.data(_5f4,"textbox"); -var opts=_5f5.options; -var tb=_5f5.textbox; -var _5f6=tb.find(".textbox-text"); -opts.editable=mode==undefined?true:mode; -_5f6.validatebox("setEditable",opts.editable); -_5c4(_5f4,opts.readonly); -}; -$.fn.textbox=function(_5f7,_5f8){ -if(typeof _5f7=="string"){ -var _5f9=$.fn.textbox.methods[_5f7]; -if(_5f9){ -return _5f9(this,_5f8); -}else{ -return this.each(function(){ -var _5fa=$(this).textbox("textbox"); -_5fa.validatebox(_5f7,_5f8); -}); -} -} -_5f7=_5f7||{}; -return this.each(function(){ -var _5fb=$.data(this,"textbox"); -if(_5fb){ -$.extend(_5fb.options,_5f7); -if(_5f7.value!=undefined){ -_5fb.options.originalValue=_5f7.value; -} -}else{ -_5fb=$.data(this,"textbox",{options:$.extend({},$.fn.textbox.defaults,$.fn.textbox.parseOptions(this),_5f7),textbox:init(this)}); -_5fb.options.originalValue=_5fb.options.value; -} -_5be(this); -_5e3(this); -if(_5fb.options.doSize){ -_5c8(this); -} -var _5fc=_5fb.options.value; -_5fb.options.value=""; -$(this).textbox("initValue",_5fc); -}); -}; -$.fn.textbox.methods={options:function(jq){ -return $.data(jq[0],"textbox").options; -},cloneFrom:function(jq,from){ -return jq.each(function(){ -var t=$(this); -if(t.data("textbox")){ -return; -} -if(!$(from).data("textbox")){ -$(from).textbox(); -} -var opts=$.extend(true,{},$(from).textbox("options")); -var name=t.attr("name")||""; -t.addClass("textbox-f").hide(); -t.removeAttr("name").attr("textboxName",name); -var span=$(from).next().clone().insertAfter(t); -var _5fd="_easyui_textbox_input"+(++_5bc); -span.find(".textbox-value").attr("name",name); -span.find(".textbox-text").attr("id",_5fd); -var _5fe=$($(from).textbox("label")).clone(); -if(_5fe.length){ -_5fe.attr("for",_5fd); -if(opts.labelPosition=="after"){ -_5fe.insertAfter(t.next()); -}else{ -_5fe.insertBefore(t); -} -} -$.data(this,"textbox",{options:opts,textbox:span,label:(_5fe.length?_5fe:undefined)}); -var _5ff=$(from).textbox("button"); -if(_5ff.length){ -t.textbox("button").linkbutton($.extend(true,{},_5ff.linkbutton("options"))); -} -_5e3(this); -_5c2(this); -}); -},textbox:function(jq){ -return $.data(jq[0],"textbox").textbox.find(".textbox-text"); -},button:function(jq){ -return $.data(jq[0],"textbox").textbox.find(".textbox-button"); -},label:function(jq){ -return $.data(jq[0],"textbox").label; -},destroy:function(jq){ -return jq.each(function(){ -_5c5(this); -}); -},resize:function(jq,_600){ -return jq.each(function(){ -_5c8(this,_600); -}); -},autoSize:function(jq){ -return jq.each(function(){ -_5d7(this); -}); -},disable:function(jq){ -return jq.each(function(){ -_5c3(this,true); -_5e3(this); -}); -},enable:function(jq){ -return jq.each(function(){ -_5c3(this,false); -_5e3(this); -}); -},readonly:function(jq,mode){ -return jq.each(function(){ -_5c4(this,mode); -_5e3(this); -}); -},setEditable:function(jq,mode){ -return jq.each(function(){ -_5f3(this,mode); -_5e3(this); -}); -},isValid:function(jq){ -return jq.textbox("textbox").validatebox("isValid"); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("setValue",""); -}); -},setText:function(jq,_601){ -return jq.each(function(){ -var opts=$(this).textbox("options"); -var _602=$(this).textbox("textbox"); -_601=_601==undefined?"":String(_601); -if($(this).textbox("getText")!=_601){ -_602.val(_601); -} -opts.value=_601; -if(!_602.is(":focus")){ -if(_601){ -_602.removeClass("textbox-prompt"); -}else{ -_602.val(opts.prompt).addClass("textbox-prompt"); -} -} -if(opts.value){ -$(this).closest(".form-field").removeClass("form-field-empty"); -}else{ -$(this).closest(".form-field").addClass("form-field-empty"); -} -$(this).textbox("validate"); -if(opts.autoSize){ -$(this).textbox("resize"); -} -}); -},initValue:function(jq,_603){ -return jq.each(function(){ -var _604=$.data(this,"textbox"); -$(this).textbox("setText",_603); -_604.textbox.find(".textbox-value").val(_603); -$(this).val(_603); -}); -},setValue:function(jq,_605){ -return jq.each(function(){ -var opts=$.data(this,"textbox").options; -var _606=$(this).textbox("getValue"); -$(this).textbox("initValue",_605); -if(_606!=_605){ -opts.onChange.call(this,_605,_606); -$(this).closest("form").trigger("_change",[this]); -} -}); -},getText:function(jq){ -var _607=jq.textbox("textbox"); -if(_607.is(":focus")){ -return _607.val(); -}else{ -return jq.textbox("options").value; -} -},getValue:function(jq){ -return jq.data("textbox").textbox.find(".textbox-value").val(); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).textbox("options"); -$(this).textbox("textbox").val(opts.originalValue); -$(this).textbox("setValue",opts.originalValue); -}); -},getIcon:function(jq,_608){ -return jq.data("textbox").textbox.find(".textbox-icon:eq("+_608+")"); -},getTipX:function(jq,_609){ -var _60a=jq.data("textbox"); -var opts=_60a.options; -var tb=_60a.textbox; -var _60b=tb.find(".textbox-text"); -var _609=_609||opts.tipPosition; -var p1=tb.offset(); -var p2=_60b.offset(); -var w1=tb.outerWidth(); -var w2=_60b.outerWidth(); -if(_609=="right"){ -return w1-w2-p2.left+p1.left; -}else{ -if(_609=="left"){ -return p1.left-p2.left; -}else{ -return (w1-w2-p2.left+p1.left)/2-(p2.left-p1.left)/2; -} -} -},getTipY:function(jq,_60c){ -var _60d=jq.data("textbox"); -var opts=_60d.options; -var tb=_60d.textbox; -var _60e=tb.find(".textbox-text"); -var _60c=_60c||opts.tipPosition; -var p1=tb.offset(); -var p2=_60e.offset(); -var h1=tb.outerHeight(); -var h2=_60e.outerHeight(); -if(_60c=="left"||_60c=="right"){ -return (h1-h2-p2.top+p1.top)/2-(p2.top-p1.top)/2; -}else{ -if(_60c=="bottom"){ -return (h1-h2-p2.top+p1.top); -}else{ -return (p1.top-p2.top); -} -} -},getSelectionStart:function(jq){ -return jq.textbox("getSelectionRange").start; -},getSelectionRange:function(jq){ -var _60f=jq.textbox("textbox")[0]; -var _610=0; -var end=0; -if(typeof _60f.selectionStart=="number"){ -_610=_60f.selectionStart; -end=_60f.selectionEnd; -}else{ -if(_60f.createTextRange){ -var s=document.selection.createRange(); -var _611=_60f.createTextRange(); -_611.setEndPoint("EndToStart",s); -_610=_611.text.length; -end=_610+s.text.length; -} -} -return {start:_610,end:end}; -},setSelectionRange:function(jq,_612){ -return jq.each(function(){ -var _613=$(this).textbox("textbox")[0]; -var _614=_612.start; -var end=_612.end; -if(_613.setSelectionRange){ -_613.setSelectionRange(_614,end); -}else{ -if(_613.createTextRange){ -var _615=_613.createTextRange(); -_615.collapse(); -_615.moveEnd("character",end); -_615.moveStart("character",_614); -_615.select(); -} -} -}); -},show:function(jq){ -return jq.each(function(){ -$(this).next().show(); -$($(this).textbox("label")).show(); -}); -},hide:function(jq){ -return jq.each(function(){ -$(this).next().hide(); -$($(this).textbox("label")).hide(); -}); -}}; -$.fn.textbox.parseOptions=function(_616){ -var t=$(_616); -return $.extend({},$.fn.validatebox.parseOptions(_616),$.parser.parseOptions(_616,["prompt","iconCls","iconAlign","buttonText","buttonIcon","buttonAlign","label","labelPosition","labelAlign","width","height",{multiline:"boolean",iconWidth:"number",labelWidth:"number",autoSize:"boolean"}]),{value:(t.val()||undefined),type:(t.attr("type")?t.attr("type"):undefined)}); -}; -$.fn.textbox.defaults=$.extend({},$.fn.validatebox.defaults,{doSize:true,autoSize:false,width:"auto",height:"auto",cls:null,prompt:"",value:"",type:"text",multiline:false,icons:[],iconCls:null,iconAlign:"right",iconWidth:26,buttonText:"",buttonIcon:null,buttonAlign:"right",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",inputEvents:{blur:function(e){ -var t=$(e.data.target); -var opts=t.textbox("options"); -if(t.textbox("getValue")!=opts.value){ -t.textbox("setValue",opts.value); -} -},keydown:function(e){ -if(e.keyCode==13){ -var t=$(e.data.target); -t.textbox("setValue",t.textbox("getText")); -} -if($(e.data.target).textbox("options").autoSize){ -setTimeout(function(){ -$(e.data.target).textbox("resize"); -},0); -} -}},onChange:function(_617,_618){ -},onResizing:function(_619,_61a){ -},onResize:function(_61b,_61c){ -},onClickButton:function(){ -},onClickIcon:function(_61d){ -}}); -})(jQuery); -(function($){ -function _61e(_61f){ -var _620=$.data(_61f,"passwordbox"); -var opts=_620.options; -var _621=$.extend(true,[],opts.icons); -if(opts.showEye){ -_621.push({iconCls:"passwordbox-open",handler:function(e){ -opts.revealed=!opts.revealed; -_622(_61f); -}}); -} -$(_61f).addClass("passwordbox-f").textbox($.extend({},opts,{icons:_621})); -_622(_61f); -}; -function _623(_624,_625,all){ -var _626=$(_624).data("passwordbox"); -var t=$(_624); -var opts=t.passwordbox("options"); -if(opts.revealed){ -t.textbox("setValue",_625); -return; -} -_626.converting=true; -var _627=unescape(opts.passwordChar); -var cc=_625.split(""); -var vv=t.passwordbox("getValue").split(""); -for(var i=0;i=0){ -vv.splice(_651,1); -} -}else{ -var _64f=_647(_64c,_64e.start); -var end=_650(_64c,_64e.end); -var _651=_64f-_649(_64c,_64f); -var _652=end-_649(_64c,end); -vv.splice(_651,_652-_651+1); -} -$(_64c).maskedbox("setValue",_640(_64c,vv.join(""))); -$(_64c).maskedbox("setSelectionRange",{start:_64f,end:_64f}); -}; -function _649(_653,pos){ -var opts=$(_653).maskedbox("options"); -var _654=0; -if(pos>=opts.mask.length){ -pos--; -} -for(var i=pos;i>=0;i--){ -if(opts.masks[opts.mask[i]]==undefined){ -_654++; -} -} -return _654; -}; -function _647(_655,pos){ -var opts=$(_655).maskedbox("options"); -var m=opts.mask[pos]; -var r=opts.masks[m]; -while(pos=0&&!r){ -pos--; -m=opts.mask[pos]; -r=opts.masks[m]; -} -return pos<0?0:pos; -}; -function _657(e){ -if(e.metaKey||e.ctrlKey){ -return; -} -var _658=e.data.target; -var opts=$(_658).maskedbox("options"); -var _659=[9,13,35,36,37,39]; -if($.inArray(e.keyCode,_659)!=-1){ -return true; -} -if(e.keyCode>=96&&e.keyCode<=105){ -e.keyCode-=48; -} -var c=String.fromCharCode(e.keyCode); -if(e.keyCode>=65&&e.keyCode<=90&&!e.shiftKey){ -c=c.toLowerCase(); -}else{ -if(e.keyCode==189){ -c="-"; -}else{ -if(e.keyCode==187){ -c="+"; -}else{ -if(e.keyCode==190){ -c="."; -} -} -} -} -if(e.keyCode==8){ -_64b(_658,true); -}else{ -if(e.keyCode==46){ -_64b(_658,false); -}else{ -_643(_658,c); -} -} -return false; -}; -$.extend($.fn.textbox.methods,{inputMask:function(jq,_65a){ -return jq.each(function(){ -var _65b=this; -var opts=$.extend({},$.fn.maskedbox.defaults,_65a); -$.data(_65b,"maskedbox",{options:opts}); -var _65c=$(_65b).textbox("textbox"); -_65c._unbind(".maskedbox"); -for(var _65d in opts.inputEvents){ -_65c._bind(_65d+".maskedbox",{target:_65b},opts.inputEvents[_65d]); -} -}); -}}); -$.fn.maskedbox=function(_65e,_65f){ -if(typeof _65e=="string"){ -var _660=$.fn.maskedbox.methods[_65e]; -if(_660){ -return _660(this,_65f); -}else{ -return this.textbox(_65e,_65f); -} -} -_65e=_65e||{}; -return this.each(function(){ -var _661=$.data(this,"maskedbox"); -if(_661){ -$.extend(_661.options,_65e); -}else{ -$.data(this,"maskedbox",{options:$.extend({},$.fn.maskedbox.defaults,$.fn.maskedbox.parseOptions(this),_65e)}); -} -_63a(this); -}); -}; -$.fn.maskedbox.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"maskedbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},initValue:function(jq,_662){ -return jq.each(function(){ -_662=_640(this,_63d(this,_662)); -$(this).textbox("initValue",_662); -}); -},setValue:function(jq,_663){ -return jq.each(function(){ -_663=_640(this,_63d(this,_663)); -$(this).textbox("setValue",_663); -}); -}}; -$.fn.maskedbox.parseOptions=function(_664){ -var t=$(_664); -return $.extend({},$.fn.textbox.parseOptions(_664),$.parser.parseOptions(_664,["mask","promptChar"]),{}); -}; -$.fn.maskedbox.defaults=$.extend({},$.fn.textbox.defaults,{mask:"",promptChar:"_",masks:{"9":"[0-9]","a":"[a-zA-Z]","*":"[0-9a-zA-Z]"},inputEvents:{keydown:_657}}); -})(jQuery); -(function($){ -var _665=0; -function _666(_667){ -var _668=$.data(_667,"filebox"); -var opts=_668.options; -opts.fileboxId="filebox_file_id_"+(++_665); -$(_667).addClass("filebox-f").textbox(opts); -$(_667).textbox("textbox").attr("readonly","readonly"); -_668.filebox=$(_667).next().addClass("filebox"); -var file=_669(_667); -var btn=$(_667).filebox("button"); -if(btn.length){ -$("").appendTo(btn); -if(btn.linkbutton("options").disabled){ -file._propAttr("disabled",true); -}else{ -file._propAttr("disabled",false); -} -} -}; -function _669(_66a){ -var _66b=$.data(_66a,"filebox"); -var opts=_66b.options; -_66b.filebox.find(".textbox-value").remove(); -opts.oldValue=""; -var file=$("").appendTo(_66b.filebox); -file.attr("id",opts.fileboxId).attr("name",$(_66a).attr("textboxName")||""); -file.attr("accept",opts.accept); -file.attr("capture",opts.capture); -if(opts.multiple){ -file.attr("multiple","multiple"); -} -file.change(function(){ -var _66c=this.value; -if(this.files){ -_66c=$.map(this.files,function(file){ -return file.name; -}).join(opts.separator); -} -$(_66a).filebox("setText",_66c); -opts.onChange.call(_66a,_66c,opts.oldValue); -opts.oldValue=_66c; -}); -return file; -}; -$.fn.filebox=function(_66d,_66e){ -if(typeof _66d=="string"){ -var _66f=$.fn.filebox.methods[_66d]; -if(_66f){ -return _66f(this,_66e); -}else{ -return this.textbox(_66d,_66e); -} -} -_66d=_66d||{}; -return this.each(function(){ -var _670=$.data(this,"filebox"); -if(_670){ -$.extend(_670.options,_66d); -}else{ -$.data(this,"filebox",{options:$.extend({},$.fn.filebox.defaults,$.fn.filebox.parseOptions(this),_66d)}); -} -_666(this); -}); -}; -$.fn.filebox.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"filebox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("clear"); -_669(this); -}); -},reset:function(jq){ -return jq.each(function(){ -$(this).filebox("clear"); -}); -},setValue:function(jq){ -return jq; -},setValues:function(jq){ -return jq; -},files:function(jq){ -return jq.next().find(".textbox-value")[0].files; -}}; -$.fn.filebox.parseOptions=function(_671){ -var t=$(_671); -return $.extend({},$.fn.textbox.parseOptions(_671),$.parser.parseOptions(_671,["accept","capture","separator"]),{multiple:(t.attr("multiple")?true:undefined)}); -}; -$.fn.filebox.defaults=$.extend({},$.fn.textbox.defaults,{buttonIcon:null,buttonText:"Choose File",buttonAlign:"right",inputEvents:{},accept:"",capture:"",separator:",",multiple:false}); -})(jQuery); -(function($){ -function _672(_673){ -var _674=$.data(_673,"searchbox"); -var opts=_674.options; -var _675=$.extend(true,[],opts.icons); -_675.push({iconCls:"searchbox-button",handler:function(e){ -var t=$(e.data.target); -var opts=t.searchbox("options"); -opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); -}}); -_676(); -var _677=_678(); -$(_673).addClass("searchbox-f").textbox($.extend({},opts,{icons:_675,buttonText:(_677?_677.text:"")})); -$(_673).attr("searchboxName",$(_673).attr("textboxName")); -_674.searchbox=$(_673).next(); -_674.searchbox.addClass("searchbox"); -_679(_677); -function _676(){ -if(opts.menu){ -_674.menu=$(opts.menu).menu(); -var _67a=_674.menu.menu("options"); -var _67b=_67a.onClick; -_67a.onClick=function(item){ -_679(item); -_67b.call(this,item); -}; -}else{ -if(_674.menu){ -_674.menu.menu("destroy"); -} -_674.menu=null; -} -}; -function _678(){ -if(_674.menu){ -var item=_674.menu.children("div.menu-item:first"); -_674.menu.children("div.menu-item").each(function(){ -var _67c=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); -if(_67c.selected){ -item=$(this); -return false; -} -}); -return _674.menu.menu("getItem",item[0]); -}else{ -return null; -} -}; -function _679(item){ -if(!item){ -return; -} -$(_673).textbox("button").menubutton({text:item.text,iconCls:(item.iconCls||null),menu:_674.menu,menuAlign:opts.buttonAlign,plain:false}); -_674.searchbox.find("input.textbox-value").attr("name",item.name||item.text); -$(_673).searchbox("resize"); -}; -}; -$.fn.searchbox=function(_67d,_67e){ -if(typeof _67d=="string"){ -var _67f=$.fn.searchbox.methods[_67d]; -if(_67f){ -return _67f(this,_67e); -}else{ -return this.textbox(_67d,_67e); -} -} -_67d=_67d||{}; -return this.each(function(){ -var _680=$.data(this,"searchbox"); -if(_680){ -$.extend(_680.options,_67d); -}else{ -$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_67d)}); -} -_672(this); -}); -}; -$.fn.searchbox.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"searchbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},menu:function(jq){ -return $.data(jq[0],"searchbox").menu; -},getName:function(jq){ -return $.data(jq[0],"searchbox").searchbox.find("input.textbox-value").attr("name"); -},selectName:function(jq,name){ -return jq.each(function(){ -var menu=$.data(this,"searchbox").menu; -if(menu){ -menu.children("div.menu-item").each(function(){ -var item=menu.menu("getItem",this); -if(item.name==name){ -$(this).trigger("click"); -return false; -} -}); -} -}); -},destroy:function(jq){ -return jq.each(function(){ -var menu=$(this).searchbox("menu"); -if(menu){ -menu.menu("destroy"); -} -$(this).textbox("destroy"); -}); -}}; -$.fn.searchbox.parseOptions=function(_681){ -var t=$(_681); -return $.extend({},$.fn.textbox.parseOptions(_681),$.parser.parseOptions(_681,["menu"]),{searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)}); -}; -$.fn.searchbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:$.extend({},$.fn.textbox.defaults.inputEvents,{keydown:function(e){ -if(e.keyCode==13){ -e.preventDefault(); -var t=$(e.data.target); -var opts=t.searchbox("options"); -t.searchbox("setValue",$(this).val()); -opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); -return false; -} -}}),buttonAlign:"left",menu:null,searcher:function(_682,name){ -}}); -})(jQuery); -(function($){ -function _683(_684,_685){ -var opts=$.data(_684,"form").options; -$.extend(opts,_685||{}); -var _686=$.extend({},opts.queryParams); -if(opts.onSubmit.call(_684,_686)==false){ -return; -} -var _687=$(_684).find(".textbox-text:focus"); -_687.triggerHandler("blur"); -_687.focus(); -var _688=null; -if(opts.dirty){ -var ff=[]; -$.map(opts.dirtyFields,function(f){ -if($(f).hasClass("textbox-f")){ -$(f).next().find(".textbox-value").each(function(){ -ff.push(this); -}); -}else{ -if($(f).hasClass("checkbox-f")){ -$(f).next().find(".checkbox-value").each(function(){ -ff.push(this); -}); -}else{ -if($(f).hasClass("radiobutton-f")){ -$(f).next().find(".radiobutton-value").each(function(){ -ff.push(this); -}); -}else{ -ff.push(f); -} -} -} -}); -_688=$(_684).find("input[name]:enabled,textarea[name]:enabled,select[name]:enabled").filter(function(){ -return $.inArray(this,ff)==-1; -}); -_688._propAttr("disabled",true); -} -if(opts.ajax){ -if(opts.iframe){ -_689(_684,_686); -}else{ -if(window.FormData!==undefined){ -_68a(_684,_686); -}else{ -_689(_684,_686); -} -} -}else{ -$(_684).submit(); -} -if(opts.dirty){ -_688._propAttr("disabled",false); -} -}; -function _689(_68b,_68c){ -var opts=$.data(_68b,"form").options; -var _68d="easyui_frame_"+(new Date().getTime()); -var _68e=$("").appendTo("body"); -_68e.attr("src",window.ActiveXObject?"javascript:false":"about:blank"); -_68e.css({position:"absolute",top:-1000,left:-1000}); -_68e.bind("load",cb); -_68f(_68c); -function _68f(_690){ -var form=$(_68b); -if(opts.url){ -form.attr("action",opts.url); -} -var t=form.attr("target"),a=form.attr("action"); -form.attr("target",_68d); -var _691=$(); -try{ -for(var n in _690){ -var _692=$("").val(_690[n]).appendTo(form); -_691=_691.add(_692); -} -_693(); -form[0].submit(); -} -finally{ -form.attr("action",a); -t?form.attr("target",t):form.removeAttr("target"); -_691.remove(); -} -}; -function _693(){ -var f=$("#"+_68d); -if(!f.length){ -return; -} -try{ -var s=f.contents()[0].readyState; -if(s&&s.toLowerCase()=="uninitialized"){ -setTimeout(_693,100); -} -} -catch(e){ -cb(); -} -}; -var _694=10; -function cb(){ -var f=$("#"+_68d); -if(!f.length){ -return; -} -f.unbind(); -var data=""; -try{ -var body=f.contents().find("body"); -data=body.html(); -if(data==""){ -if(--_694){ -setTimeout(cb,100); -return; -} -} -var ta=body.find(">textarea"); -if(ta.length){ -data=ta.val(); -}else{ -var pre=body.find(">pre"); -if(pre.length){ -data=pre.html(); -} -} -} -catch(e){ -} -opts.success.call(_68b,data); -setTimeout(function(){ -f.unbind(); -f.remove(); -},100); -}; -}; -function _68a(_695,_696){ -var opts=$.data(_695,"form").options; -var _697=new FormData($(_695)[0]); -for(var name in _696){ -_697.append(name,_696[name]); -} -$.ajax({url:opts.url,type:"post",xhr:function(){ -var xhr=$.ajaxSettings.xhr(); -if(xhr.upload){ -xhr.upload.addEventListener("progress",function(e){ -if(e.lengthComputable){ -var _698=e.total; -var _699=e.loaded||e.position; -var _69a=Math.ceil(_699*100/_698); -opts.onProgress.call(_695,_69a); -} -},false); -} -return xhr; -},data:_697,dataType:"html",cache:false,contentType:false,processData:false,complete:function(res){ -opts.success.call(_695,res.responseText); -}}); -}; -function load(_69b,data){ -var opts=$.data(_69b,"form").options; -if(typeof data=="string"){ -var _69c={}; -if(opts.onBeforeLoad.call(_69b,_69c)==false){ -return; -} -$.ajax({url:data,data:_69c,dataType:"json",success:function(data){ -_69d(data); -},error:function(){ -opts.onLoadError.apply(_69b,arguments); -}}); -}else{ -_69d(data); -} -function _69d(data){ -var form=$(_69b); -for(var name in data){ -var val=data[name]; -if(!_69e(name,val)){ -if(!_69f(name,val)){ -form.find("input[name=\""+name+"\"]").val(val); -form.find("textarea[name=\""+name+"\"]").val(val); -form.find("select[name=\""+name+"\"]").val(val); -} -} -} -opts.onLoadSuccess.call(_69b,data); -form.form("validate"); -}; -function _69e(name,val){ -var _6a0=["switchbutton","radiobutton","checkbox"]; -for(var i=0;i<_6a0.length;i++){ -var _6a1=_6a0[i]; -var cc=$(_69b).find("["+_6a1+"Name=\""+name+"\"]"); -if(cc.length){ -cc[_6a1]("uncheck"); -cc.each(function(){ -if(_6a2($(this)[_6a1]("options").value,val)){ -$(this)[_6a1]("check"); -} -}); -return true; -} -} -var cc=$(_69b).find("input[name=\""+name+"\"][type=radio], input[name=\""+name+"\"][type=checkbox]"); -if(cc.length){ -cc._propAttr("checked",false); -cc.each(function(){ -if(_6a2($(this).val(),val)){ -$(this)._propAttr("checked",true); -} -}); -return true; -} -return false; -}; -function _6a2(v,val){ -if(v==String(val)||$.inArray(v,$.isArray(val)?val:[val])>=0){ -return true; -}else{ -return false; -} -}; -function _69f(name,val){ -var _6a3=$(_69b).find("[textboxName=\""+name+"\"],[sliderName=\""+name+"\"]"); -if(_6a3.length){ -for(var i=0;i=0;i--){ -var type=opts.fieldTypes[i]; -var _6ab=form.find("."+type+"-f"); -if(_6ab.length&&_6ab[type]){ -_6ab[type]("reset"); -} -} -form.form("validate"); -}; -function _6ac(_6ad){ -var _6ae=$.data(_6ad,"form").options; -$(_6ad).unbind(".form"); -if(_6ae.ajax){ -$(_6ad).bind("submit.form",function(){ -setTimeout(function(){ -_683(_6ad,_6ae); -},0); -return false; -}); -} -$(_6ad).bind("_change.form",function(e,t){ -if($.inArray(t,_6ae.dirtyFields)==-1){ -_6ae.dirtyFields.push(t); -} -_6ae.onChange.call(this,t); -}).bind("change.form",function(e){ -var t=e.target; -if(!$(t).hasClass("textbox-text")){ -if($.inArray(t,_6ae.dirtyFields)==-1){ -_6ae.dirtyFields.push(t); -} -_6ae.onChange.call(this,t); -} -}); -_6af(_6ad,_6ae.novalidate); -}; -function _6b0(_6b1,_6b2){ -_6b2=_6b2||{}; -var _6b3=$.data(_6b1,"form"); -if(_6b3){ -$.extend(_6b3.options,_6b2); -}else{ -$.data(_6b1,"form",{options:$.extend({},$.fn.form.defaults,$.fn.form.parseOptions(_6b1),_6b2)}); -} -}; -function _6b4(_6b5){ -if($.fn.validatebox){ -var opts=$.data(_6b5,"form").options; -var t=$(_6b5); -t.find(".validatebox-text:not(:disabled)").validatebox("validate"); -var _6b6=t.find(".validatebox-invalid"); -if(opts.focusOnValidate){ -_6b6.filter(":not(:disabled):first").focus(); -} -return _6b6.length==0; -} -return true; -}; -function _6af(_6b7,_6b8){ -var opts=$.data(_6b7,"form").options; -opts.novalidate=_6b8; -$(_6b7).find(".validatebox-text:not(:disabled)").validatebox(_6b8?"disableValidation":"enableValidation"); -}; -$.fn.form=function(_6b9,_6ba){ -if(typeof _6b9=="string"){ -this.each(function(){ -_6b0(this); -}); -return $.fn.form.methods[_6b9](this,_6ba); -} -return this.each(function(){ -_6b0(this,_6b9); -_6ac(this); -}); -}; -$.fn.form.methods={options:function(jq){ -return $.data(jq[0],"form").options; -},submit:function(jq,_6bb){ -return jq.each(function(){ -_683(this,_6bb); -}); -},load:function(jq,data){ -return jq.each(function(){ -load(this,data); -}); -},clear:function(jq){ -return jq.each(function(){ -_6a5(this); -}); -},reset:function(jq){ -return jq.each(function(){ -_6a9(this); -}); -},validate:function(jq){ -return _6b4(jq[0]); -},disableValidation:function(jq){ -return jq.each(function(){ -_6af(this,true); -}); -},enableValidation:function(jq){ -return jq.each(function(){ -_6af(this,false); -}); -},resetValidation:function(jq){ -return jq.each(function(){ -$(this).find(".validatebox-text:not(:disabled)").validatebox("resetValidation"); -}); -},resetDirty:function(jq){ -return jq.each(function(){ -$(this).form("options").dirtyFields=[]; -}); -}}; -$.fn.form.parseOptions=function(_6bc){ -var t=$(_6bc); -return $.extend({},$.parser.parseOptions(_6bc,[{ajax:"boolean",dirty:"boolean"}]),{url:(t.attr("action")?t.attr("action"):undefined)}); -}; -$.fn.form.defaults={fieldTypes:["tagbox","combobox","combotree","combogrid","combotreegrid","datetimebox","datebox","timepicker","combo","datetimespinner","timespinner","numberspinner","spinner","slider","searchbox","numberbox","passwordbox","filebox","textbox","switchbutton","radiobutton","checkbox"],novalidate:false,focusOnValidate:true,ajax:true,iframe:true,dirty:false,dirtyFields:[],url:null,queryParams:{},onSubmit:function(_6bd){ -return $(this).form("validate"); -},onProgress:function(_6be){ -},success:function(data){ -},onBeforeLoad:function(_6bf){ -},onLoadSuccess:function(data){ -},onLoadError:function(){ -},onChange:function(_6c0){ -}}; -})(jQuery); -(function($){ -function _6c1(_6c2){ -var _6c3=$.data(_6c2,"numberbox"); -var opts=_6c3.options; -$(_6c2).addClass("numberbox-f").textbox(opts); -$(_6c2).textbox("textbox").css({imeMode:"disabled"}); -$(_6c2).attr("numberboxName",$(_6c2).attr("textboxName")); -_6c3.numberbox=$(_6c2).next(); -_6c3.numberbox.addClass("numberbox"); -var _6c4=opts.parser.call(_6c2,opts.value); -var _6c5=opts.formatter.call(_6c2,_6c4); -$(_6c2).numberbox("initValue",_6c4).numberbox("setText",_6c5); -}; -function _6c6(_6c7,_6c8){ -var _6c9=$.data(_6c7,"numberbox"); -var opts=_6c9.options; -opts.value=parseFloat(_6c8); -var _6c8=opts.parser.call(_6c7,_6c8); -var text=opts.formatter.call(_6c7,_6c8); -opts.value=_6c8; -$(_6c7).textbox("setText",text).textbox("setValue",_6c8); -text=opts.formatter.call(_6c7,$(_6c7).textbox("getValue")); -$(_6c7).textbox("setText",text); -}; -$.fn.numberbox=function(_6ca,_6cb){ -if(typeof _6ca=="string"){ -var _6cc=$.fn.numberbox.methods[_6ca]; -if(_6cc){ -return _6cc(this,_6cb); -}else{ -return this.textbox(_6ca,_6cb); -} -} -_6ca=_6ca||{}; -return this.each(function(){ -var _6cd=$.data(this,"numberbox"); -if(_6cd){ -$.extend(_6cd.options,_6ca); -}else{ -_6cd=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_6ca)}); -} -_6c1(this); -}); -}; -$.fn.numberbox.methods={options:function(jq){ -var opts=jq.data("textbox")?jq.textbox("options"):{}; -return $.extend($.data(jq[0],"numberbox").options,{width:opts.width,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).textbox("cloneFrom",from); -$.data(this,"numberbox",{options:$.extend(true,{},$(from).numberbox("options"))}); -$(this).addClass("numberbox-f"); -}); -},fix:function(jq){ -return jq.each(function(){ -var opts=$(this).numberbox("options"); -opts.value=null; -var _6ce=opts.parser.call(this,$(this).numberbox("getText")); -$(this).numberbox("setValue",_6ce); -}); -},setValue:function(jq,_6cf){ -return jq.each(function(){ -_6c6(this,_6cf); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("clear"); -$(this).numberbox("options").value=""; -}); -},reset:function(jq){ -return jq.each(function(){ -$(this).textbox("reset"); -$(this).numberbox("setValue",$(this).numberbox("getValue")); -}); -}}; -$.fn.numberbox.parseOptions=function(_6d0){ -var t=$(_6d0); -return $.extend({},$.fn.textbox.parseOptions(_6d0),$.parser.parseOptions(_6d0,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined)}); -}; -$.fn.numberbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{keypress:function(e){ -var _6d1=e.data.target; -var opts=$(_6d1).numberbox("options"); -return opts.filter.call(_6d1,e); -},blur:function(e){ -$(e.data.target).numberbox("fix"); -},keydown:function(e){ -if(e.keyCode==13){ -$(e.data.target).numberbox("fix"); -} -}},min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){ -var opts=$(this).numberbox("options"); -var s=$(this).numberbox("getText"); -if(e.metaKey||e.ctrlKey){ -return true; -} -if($.inArray(String(e.which),["46","8","13","0"])>=0){ -return true; -} -var tmp=$(""); -tmp.html(String.fromCharCode(e.which)); -var c=tmp.text(); -tmp.remove(); -if(!c){ -return true; -} -if(c=="-"&&opts.min!=null&&opts.min>=0){ -return false; -} -if(c=="-"||c==opts.decimalSeparator){ -return (s.indexOf(c)==-1)?true:false; -}else{ -if(c==opts.groupSeparator){ -return true; -}else{ -if("0123456789".indexOf(c)>=0){ -return true; -}else{ -return false; -} -} -} -},formatter:function(_6d2){ -if(!_6d2){ -return _6d2; -} -_6d2=_6d2+""; -var opts=$(this).numberbox("options"); -var s1=_6d2,s2=""; -var dpos=_6d2.indexOf("."); -if(dpos>=0){ -s1=_6d2.substring(0,dpos); -s2=_6d2.substring(dpos+1,_6d2.length); -} -if(opts.groupSeparator){ -var p=/(\d+)(\d{3})/; -while(p.test(s1)){ -s1=s1.replace(p,"$1"+opts.groupSeparator+"$2"); -} -} -if(s2){ -return opts.prefix+s1+opts.decimalSeparator+s2+opts.suffix; -}else{ -return opts.prefix+s1+opts.suffix; -} -},parser:function(s){ -s=s+""; -var opts=$(this).numberbox("options"); -if(opts.prefix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.prefix),"g"),"")); -} -if(opts.suffix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.suffix),"g"),"")); -} -if(parseFloat(s)!=opts.value){ -if(opts.groupSeparator){ -s=$.trim(s.replace(new RegExp("\\"+opts.groupSeparator,"g"),"")); -} -if(opts.decimalSeparator){ -s=$.trim(s.replace(new RegExp("\\"+opts.decimalSeparator,"g"),".")); -} -s=s.replace(/\s/g,""); -} -var val=parseFloat(s).toFixed(opts.precision); -if(isNaN(val)){ -val=""; -}else{ -if(typeof (opts.min)=="number"&&valopts.max){ -val=opts.max.toFixed(opts.precision); -} -} -} -return val; -}}); -})(jQuery); -(function($){ -function _6d3(_6d4,_6d5){ -var opts=$.data(_6d4,"calendar").options; -var t=$(_6d4); -if(_6d5){ -$.extend(opts,{width:_6d5.width,height:_6d5.height}); -} -t._size(opts,t.parent()); -t.find(".calendar-body")._outerHeight(t.height()-t.find(".calendar-header")._outerHeight()); -if(t.find(".calendar-menu").is(":visible")){ -_6d6(_6d4); -} -}; -function init(_6d7){ -$(_6d7).addClass("calendar").html("
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+""+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+""+""+""+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "); -$(_6d7)._bind("_resize",function(e,_6d8){ -if($(this).hasClass("easyui-fluid")||_6d8){ -_6d3(_6d7); -} -return false; -}); -}; -function _6d9(_6da){ -var opts=$.data(_6da,"calendar").options; -var menu=$(_6da).find(".calendar-menu"); -menu.find(".calendar-menu-year")._unbind(".calendar")._bind("keypress.calendar",function(e){ -if(e.keyCode==13){ -_6db(true); -} -}); -$(_6da)._unbind(".calendar")._bind("mouseover.calendar",function(e){ -var t=_6dc(e.target); -if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){ -t.addClass("calendar-nav-hover"); -} -})._bind("mouseout.calendar",function(e){ -var t=_6dc(e.target); -if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){ -t.removeClass("calendar-nav-hover"); -} -})._bind("click.calendar",function(e){ -var t=_6dc(e.target); -if(t.hasClass("calendar-menu-next")||t.hasClass("calendar-nextyear")){ -_6dd(1); -}else{ -if(t.hasClass("calendar-menu-prev")||t.hasClass("calendar-prevyear")){ -_6dd(-1); -}else{ -if(t.hasClass("calendar-menu-month")){ -menu.find(".calendar-selected").removeClass("calendar-selected"); -t.addClass("calendar-selected"); -_6db(true); -}else{ -if(t.hasClass("calendar-prevmonth")){ -_6de(-1); -}else{ -if(t.hasClass("calendar-nextmonth")){ -_6de(1); -}else{ -if(t.hasClass("calendar-text")){ -if(menu.is(":visible")){ -menu.hide(); -}else{ -_6d6(_6da); -} -}else{ -if(t.hasClass("calendar-day")){ -if(t.hasClass("calendar-disabled")){ -return; -} -var _6df=opts.current; -t.closest("div.calendar-body").find(".calendar-selected").removeClass("calendar-selected"); -t.addClass("calendar-selected"); -var _6e0=t.attr("abbr").split(","); -var y=parseInt(_6e0[0]); -var m=parseInt(_6e0[1]); -var d=parseInt(_6e0[2]); -opts.current=new opts.Date(y,m-1,d); -opts.onSelect.call(_6da,opts.current); -if(!_6df||_6df.getTime()!=opts.current.getTime()){ -opts.onChange.call(_6da,opts.current,_6df); -} -if(opts.year!=y||opts.month!=m){ -opts.year=y; -opts.month=m; -show(_6da); -} -} -} -} -} -} -} -} -}); -function _6dc(t){ -var day=$(t).closest(".calendar-day"); -if(day.length){ -return day; -}else{ -return $(t); -} -}; -function _6db(_6e1){ -var menu=$(_6da).find(".calendar-menu"); -var year=menu.find(".calendar-menu-year").val(); -var _6e2=menu.find(".calendar-selected").attr("abbr"); -if(!isNaN(year)){ -opts.year=parseInt(year); -opts.month=parseInt(_6e2); -show(_6da); -} -if(_6e1){ -menu.hide(); -} -}; -function _6dd(_6e3){ -opts.year+=_6e3; -show(_6da); -menu.find(".calendar-menu-year").val(opts.year); -}; -function _6de(_6e4){ -opts.month+=_6e4; -if(opts.month>12){ -opts.year++; -opts.month=1; -}else{ -if(opts.month<1){ -opts.year--; -opts.month=12; -} -} -show(_6da); -menu.find("td.calendar-selected").removeClass("calendar-selected"); -menu.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); -}; -}; -function _6d6(_6e5){ -var opts=$.data(_6e5,"calendar").options; -$(_6e5).find(".calendar-menu").show(); -if($(_6e5).find(".calendar-menu-month-inner").is(":empty")){ -$(_6e5).find(".calendar-menu-month-inner").empty(); -var t=$("
                                              ").appendTo($(_6e5).find(".calendar-menu-month-inner")); -var idx=0; -for(var i=0;i<3;i++){ -var tr=$("").appendTo(t); -for(var j=0;j<4;j++){ -$("").html(opts.months[idx++]).attr("abbr",idx).appendTo(tr); -} -} -} -var body=$(_6e5).find(".calendar-body"); -var sele=$(_6e5).find(".calendar-menu"); -var _6e6=sele.find(".calendar-menu-year-inner"); -var _6e7=sele.find(".calendar-menu-month-inner"); -_6e6.find("input").val(opts.year).focus(); -_6e7.find("td.calendar-selected").removeClass("calendar-selected"); -_6e7.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); -sele._outerWidth(body._outerWidth()); -sele._outerHeight(body._outerHeight()); -_6e7._outerHeight(sele.height()-_6e6._outerHeight()); -}; -function _6e8(_6e9,year,_6ea){ -var opts=$.data(_6e9,"calendar").options; -var _6eb=[]; -var _6ec=new opts.Date(year,_6ea,0).getDate(); -for(var i=1;i<=_6ec;i++){ -_6eb.push([year,_6ea,i]); -} -var _6ed=[],week=[]; -var _6ee=-1; -while(_6eb.length>0){ -var date=_6eb.shift(); -week.push(date); -var day=new opts.Date(date[0],date[1]-1,date[2]).getDay(); -if(_6ee==day){ -day=0; -}else{ -if(day==(opts.firstDay==0?7:opts.firstDay)-1){ -_6ed.push(week); -week=[]; -} -} -_6ee=day; -} -if(week.length){ -_6ed.push(week); -} -var _6ef=_6ed[0]; -if(_6ef.length<7){ -while(_6ef.length<7){ -var _6f0=_6ef[0]; -var date=new opts.Date(_6f0[0],_6f0[1]-1,_6f0[2]-1); -_6ef.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -}else{ -var _6f0=_6ef[0]; -var week=[]; -for(var i=1;i<=7;i++){ -var date=new opts.Date(_6f0[0],_6f0[1]-1,_6f0[2]-i); -week.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -_6ed.unshift(week); -} -var _6f1=_6ed[_6ed.length-1]; -while(_6f1.length<7){ -var _6f2=_6f1[_6f1.length-1]; -var date=new opts.Date(_6f2[0],_6f2[1]-1,_6f2[2]+1); -_6f1.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -if(_6ed.length<6){ -var _6f2=_6f1[_6f1.length-1]; -var week=[]; -for(var i=1;i<=7;i++){ -var date=new opts.Date(_6f2[0],_6f2[1]-1,_6f2[2]+i); -week.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -_6ed.push(week); -} -return _6ed; -}; -function show(_6f3){ -var opts=$.data(_6f3,"calendar").options; -if(opts.current&&!opts.validator.call(_6f3,opts.current)){ -opts.current=null; -} -var now=new opts.Date(); -var _6f4=now.getFullYear()+","+(now.getMonth()+1)+","+now.getDate(); -var _6f5=opts.current?(opts.current.getFullYear()+","+(opts.current.getMonth()+1)+","+opts.current.getDate()):""; -var _6f6=6-opts.firstDay; -var _6f7=_6f6+1; -if(_6f6>=7){ -_6f6-=7; -} -if(_6f7>=7){ -_6f7-=7; -} -$(_6f3).find(".calendar-title span").html(opts.months[opts.month-1]+" "+opts.year); -var body=$(_6f3).find("div.calendar-body"); -body.children("table").remove(); -var data=[""]; -data.push(""); -if(opts.showWeek){ -data.push(""); -} -for(var i=opts.firstDay;i"+opts.weeks[i]+""); -} -for(var i=0;i"+opts.weeks[i]+""); -} -data.push(""); -data.push(""); -var _6f8=_6e8(_6f3,opts.year,opts.month); -for(var i=0;i<_6f8.length;i++){ -var week=_6f8[i]; -var cls=""; -if(i==0){ -cls="calendar-first"; -}else{ -if(i==_6f8.length-1){ -cls="calendar-last"; -} -} -data.push(""); -if(opts.showWeek){ -var _6f9=opts.getWeekNumber(new opts.Date(week[0][0],parseInt(week[0][1])-1,week[0][2])); -data.push(""); -} -for(var j=0;j"+d+""); -} -data.push(""); -} -data.push(""); -data.push("
                                              "+opts.weekNumberHeader+"
                                              "+_6f9+"
                                              "); -body.append(data.join("")); -body.children("table.calendar-dtable").prependTo(body); -opts.onNavigate.call(_6f3,opts.year,opts.month); -}; -$.fn.calendar=function(_6fd,_6fe){ -if(typeof _6fd=="string"){ -return $.fn.calendar.methods[_6fd](this,_6fe); -} -_6fd=_6fd||{}; -return this.each(function(){ -var _6ff=$.data(this,"calendar"); -if(_6ff){ -$.extend(_6ff.options,_6fd); -}else{ -_6ff=$.data(this,"calendar",{options:$.extend({},$.fn.calendar.defaults,$.fn.calendar.parseOptions(this),_6fd)}); -init(this); -} -if(_6ff.options.border==false){ -$(this).addClass("calendar-noborder"); -} -_6d3(this); -_6d9(this); -show(this); -$(this).find("div.calendar-menu").hide(); -}); -}; -$.fn.calendar.methods={options:function(jq){ -return $.data(jq[0],"calendar").options; -},resize:function(jq,_700){ -return jq.each(function(){ -_6d3(this,_700); -}); -},moveTo:function(jq,date){ -return jq.each(function(){ -var opts=$(this).calendar("options"); -if(!date){ -var now=new opts.Date(); -$(this).calendar({year:now.getFullYear(),month:now.getMonth()+1,current:date}); -return; -} -if(opts.validator.call(this,date)){ -var _701=opts.current; -$(this).calendar({year:date.getFullYear(),month:date.getMonth()+1,current:date}); -if(!_701||_701.getTime()!=date.getTime()){ -opts.onChange.call(this,opts.current,_701); -} -} -}); -}}; -$.fn.calendar.parseOptions=function(_702){ -var t=$(_702); -return $.extend({},$.parser.parseOptions(_702,["weekNumberHeader",{firstDay:"number",fit:"boolean",border:"boolean",showWeek:"boolean"}])); -}; -$.fn.calendar.defaults={Date:Date,width:180,height:180,fit:false,border:true,showWeek:false,firstDay:0,weeks:["S","M","T","W","T","F","S"],months:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],year:new Date().getFullYear(),month:new Date().getMonth()+1,current:(function(){ -var d=new Date(); -return new Date(d.getFullYear(),d.getMonth(),d.getDate()); -})(),weekNumberHeader:"",getWeekNumber:function(date){ -var _703=new Date(date.getTime()); -_703.setDate(_703.getDate()+4-(_703.getDay()||7)); -var time=_703.getTime(); -_703.setMonth(0); -_703.setDate(1); -return Math.floor(Math.round((time-_703)/86400000)/7)+1; -},formatter:function(date){ -return date.getDate(); -},styler:function(date){ -return ""; -},validator:function(date){ -return true; -},onSelect:function(date){ -},onChange:function(_704,_705){ -},onNavigate:function(year,_706){ -}}; -})(jQuery); -(function($){ -function _707(_708){ -var _709=$.data(_708,"spinner"); -var opts=_709.options; -var _70a=$.extend(true,[],opts.icons); -if(opts.spinAlign=="left"||opts.spinAlign=="right"){ -opts.spinArrow=true; -opts.iconAlign=opts.spinAlign; -var _70b={iconCls:"spinner-button-updown",handler:function(e){ -var spin=$(e.target).closest(".spinner-button-top,.spinner-button-bottom"); -_715(e.data.target,spin.hasClass("spinner-button-bottom")); -}}; -if(opts.spinAlign=="left"){ -_70a.unshift(_70b); -}else{ -_70a.push(_70b); -} -}else{ -opts.spinArrow=false; -if(opts.spinAlign=="vertical"){ -if(opts.buttonAlign!="top"){ -opts.buttonAlign="bottom"; -} -opts.clsLeft="textbox-button-bottom"; -opts.clsRight="textbox-button-top"; -}else{ -opts.clsLeft="textbox-button-left"; -opts.clsRight="textbox-button-right"; -} -} -$(_708).addClass("spinner-f").textbox($.extend({},opts,{icons:_70a,doSize:false,onResize:function(_70c,_70d){ -if(!opts.spinArrow){ -var span=$(this).next(); -var btn=span.find(".textbox-button:not(.spinner-button)"); -if(btn.length){ -var _70e=btn.outerWidth(); -var _70f=btn.outerHeight(); -var _710=span.find(".spinner-button."+opts.clsLeft); -var _711=span.find(".spinner-button."+opts.clsRight); -if(opts.buttonAlign=="right"){ -_711.css("marginRight",_70e+"px"); -}else{ -if(opts.buttonAlign=="left"){ -_710.css("marginLeft",_70e+"px"); -}else{ -if(opts.buttonAlign=="top"){ -_711.css("marginTop",_70f+"px"); -}else{ -_710.css("marginBottom",_70f+"px"); -} -} -} -} -} -opts.onResize.call(this,_70c,_70d); -}})); -$(_708).attr("spinnerName",$(_708).attr("textboxName")); -_709.spinner=$(_708).next(); -_709.spinner.addClass("spinner"); -if(opts.spinArrow){ -var _712=_709.spinner.find(".spinner-button-updown"); -_712.append(""+""+""+""+""+""); -}else{ -var _713=$("").addClass(opts.clsLeft).appendTo(_709.spinner); -var _714=$("").addClass(opts.clsRight).appendTo(_709.spinner); -_713.linkbutton({iconCls:opts.reversed?"spinner-button-up":"spinner-button-down",onClick:function(){ -_715(_708,!opts.reversed); -}}); -_714.linkbutton({iconCls:opts.reversed?"spinner-button-down":"spinner-button-up",onClick:function(){ -_715(_708,opts.reversed); -}}); -if(opts.disabled){ -$(_708).spinner("disable"); -} -if(opts.readonly){ -$(_708).spinner("readonly"); -} -} -$(_708).spinner("resize"); -}; -function _715(_716,down){ -var opts=$(_716).spinner("options"); -opts.spin.call(_716,down); -opts[down?"onSpinDown":"onSpinUp"].call(_716); -$(_716).spinner("validate"); -}; -$.fn.spinner=function(_717,_718){ -if(typeof _717=="string"){ -var _719=$.fn.spinner.methods[_717]; -if(_719){ -return _719(this,_718); -}else{ -return this.textbox(_717,_718); -} -} -_717=_717||{}; -return this.each(function(){ -var _71a=$.data(this,"spinner"); -if(_71a){ -$.extend(_71a.options,_717); -}else{ -_71a=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_717)}); -} -_707(this); -}); -}; -$.fn.spinner.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"spinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -}}; -$.fn.spinner.parseOptions=function(_71b){ -return $.extend({},$.fn.textbox.parseOptions(_71b),$.parser.parseOptions(_71b,["min","max","spinAlign",{increment:"number",reversed:"boolean"}])); -}; -$.fn.spinner.defaults=$.extend({},$.fn.textbox.defaults,{min:null,max:null,increment:1,spinAlign:"right",reversed:false,spin:function(down){ -},onSpinUp:function(){ -},onSpinDown:function(){ -}}); -})(jQuery); -(function($){ -function _71c(_71d){ -$(_71d).addClass("numberspinner-f"); -var opts=$.data(_71d,"numberspinner").options; -$(_71d).numberbox($.extend({},opts,{doSize:false})).spinner(opts); -$(_71d).numberbox("setValue",opts.value); -}; -function _71e(_71f,down){ -var opts=$.data(_71f,"numberspinner").options; -var v=parseFloat($(_71f).numberbox("getValue")||opts.value)||0; -if(down){ -v-=opts.increment; -}else{ -v+=opts.increment; -} -$(_71f).numberbox("setValue",v); -}; -$.fn.numberspinner=function(_720,_721){ -if(typeof _720=="string"){ -var _722=$.fn.numberspinner.methods[_720]; -if(_722){ -return _722(this,_721); -}else{ -return this.numberbox(_720,_721); -} -} -_720=_720||{}; -return this.each(function(){ -var _723=$.data(this,"numberspinner"); -if(_723){ -$.extend(_723.options,_720); -}else{ -$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_720)}); -} -_71c(this); -}); -}; -$.fn.numberspinner.methods={options:function(jq){ -var opts=jq.numberbox("options"); -return $.extend($.data(jq[0],"numberspinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -}}; -$.fn.numberspinner.parseOptions=function(_724){ -return $.extend({},$.fn.spinner.parseOptions(_724),$.fn.numberbox.parseOptions(_724),{}); -}; -$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(down){ -_71e(this,down); -}}); -})(jQuery); -(function($){ -function _725(_726){ -var opts=$.data(_726,"timespinner").options; -$(_726).addClass("timespinner-f").spinner(opts); -var _727=opts.formatter.call(_726,opts.parser.call(_726,opts.value)); -$(_726).timespinner("initValue",_727); -}; -function _728(e){ -var _729=e.data.target; -var opts=$.data(_729,"timespinner").options; -var _72a=$(_729).timespinner("getSelectionStart"); -for(var i=0;i=_72b[0]&&_72a<=_72b[1]){ -_72c(_729,i); -return; -} -} -}; -function _72c(_72d,_72e){ -var opts=$.data(_72d,"timespinner").options; -if(_72e!=undefined){ -opts.highlight=_72e; -} -var _72f=opts.selections[opts.highlight]; -if(_72f){ -var tb=$(_72d).timespinner("textbox"); -$(_72d).timespinner("setSelectionRange",{start:_72f[0],end:_72f[1]}); -tb.focus(); -} -}; -function _730(_731,_732){ -var opts=$.data(_731,"timespinner").options; -var _732=opts.parser.call(_731,_732); -var text=opts.formatter.call(_731,_732); -$(_731).spinner("setValue",text); -}; -function _733(_734,down){ -var opts=$.data(_734,"timespinner").options; -var s=$(_734).timespinner("getValue"); -var _735=opts.selections[opts.highlight]; -var s1=s.substring(0,_735[0]); -var s2=s.substring(_735[0],_735[1]); -var s3=s.substring(_735[1]); -if(s2==opts.ampm[0]){ -s2=opts.ampm[1]; -}else{ -if(s2==opts.ampm[1]){ -s2=opts.ampm[0]; -}else{ -s2=parseInt(s2,10)||0; -if(opts.selections.length-4==opts.highlight&&opts.hour12){ -if(s2==12){ -s2=0; -}else{ -if(s2==11&&!down){ -var tmp=s3.replace(opts.ampm[0],opts.ampm[1]); -if(s3!=tmp){ -s3=tmp; -}else{ -s3=s3.replace(opts.ampm[1],opts.ampm[0]); -} -} -} -} -s2=s2+opts.increment*(down?-1:1); -} -} -var v=s1+s2+s3; -$(_734).timespinner("setValue",v); -_72c(_734); -}; -$.fn.timespinner=function(_736,_737){ -if(typeof _736=="string"){ -var _738=$.fn.timespinner.methods[_736]; -if(_738){ -return _738(this,_737); -}else{ -return this.spinner(_736,_737); -} -} -_736=_736||{}; -return this.each(function(){ -var _739=$.data(this,"timespinner"); -if(_739){ -$.extend(_739.options,_736); -}else{ -$.data(this,"timespinner",{options:$.extend({},$.fn.timespinner.defaults,$.fn.timespinner.parseOptions(this),_736)}); -} -_725(this); -}); -}; -$.fn.timespinner.methods={options:function(jq){ -var opts=jq.data("spinner")?jq.spinner("options"):{}; -return $.extend($.data(jq[0],"timespinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},setValue:function(jq,_73a){ -return jq.each(function(){ -_730(this,_73a); -}); -},getHours:function(jq){ -var opts=$.data(jq[0],"timespinner").options; -var date=opts.parser.call(jq[0],jq.timespinner("getValue")); -return date?date.getHours():null; -},getMinutes:function(jq){ -var opts=$.data(jq[0],"timespinner").options; -var date=opts.parser.call(jq[0],jq.timespinner("getValue")); -return date?date.getMinutes():null; -},getSeconds:function(jq){ -var opts=$.data(jq[0],"timespinner").options; -var date=opts.parser.call(jq[0],jq.timespinner("getValue")); -return date?date.getSeconds():null; -}}; -$.fn.timespinner.parseOptions=function(_73b){ -return $.extend({},$.fn.spinner.parseOptions(_73b),$.parser.parseOptions(_73b,["separator",{hour12:"boolean",showSeconds:"boolean",highlight:"number"}])); -}; -$.fn.timespinner.defaults=$.extend({},$.fn.spinner.defaults,{inputEvents:$.extend({},$.fn.spinner.defaults.inputEvents,{click:function(e){ -_728.call(this,e); -},blur:function(e){ -var t=$(e.data.target); -t.timespinner("setValue",t.timespinner("getText")); -},keydown:function(e){ -if(e.keyCode==13){ -var t=$(e.data.target); -t.timespinner("setValue",t.timespinner("getText")); -} -}}),formatter:function(date){ -if(!date){ -return ""; -} -var opts=$(this).timespinner("options"); -var hour=date.getHours(); -var _73c=date.getMinutes(); -var _73d=date.getSeconds(); -var ampm=""; -if(opts.hour12){ -ampm=hour>=12?opts.ampm[1]:opts.ampm[0]; -hour=hour%12; -if(hour==0){ -hour=12; -} -} -var tt=[_73e(hour),_73e(_73c)]; -if(opts.showSeconds){ -tt.push(_73e(_73d)); -} -var s=tt.join(opts.separator)+" "+ampm; -return $.trim(s); -function _73e(_73f){ -return (_73f<10?"0":"")+_73f; -}; -},parser:function(s){ -var opts=$(this).timespinner("options"); -var date=_740(s); -if(date){ -var min=_740(opts.min); -var max=_740(opts.max); -if(min&&min>date){ -date=min; -} -if(max&&max"]; -for(var i=0;i<_757.length;i++){ -_756.cache[_757[i][0]]={width:_757[i][1]}; -} -var _758=0; -for(var s in _756.cache){ -var item=_756.cache[s]; -item.index=_758++; -ss.push(s+"{width:"+item.width+"}"); -} -ss.push(""); -$(ss.join("\n")).appendTo(cc); -cc.children("style[easyui]:not(:last)").remove(); -},getRule:function(_759){ -var _75a=cc.children("style[easyui]:last")[0]; -var _75b=_75a.styleSheet?_75a.styleSheet:(_75a.sheet||document.styleSheets[document.styleSheets.length-1]); -var _75c=_75b.cssRules||_75b.rules; -return _75c[_759]; -},set:function(_75d,_75e){ -var item=_756.cache[_75d]; -if(item){ -item.width=_75e; -var rule=this.getRule(item.index); -if(rule){ -rule.style["width"]=_75e; -} -} -},remove:function(_75f){ -var tmp=[]; -for(var s in _756.cache){ -if(s.indexOf(_75f)==-1){ -tmp.push([s,_756.cache[s].width]); -} -} -_756.cache={}; -this.add(tmp); -},dirty:function(_760){ -if(_760){ -_756.dirty.push(_760); -} -},clean:function(){ -for(var i=0;i<_756.dirty.length;i++){ -this.remove(_756.dirty[i]); -} -_756.dirty=[]; -}}; -}; -function _761(_762,_763){ -var _764=$.data(_762,"datagrid"); -var opts=_764.options; -var _765=_764.panel; -if(_763){ -$.extend(opts,_763); -} -if(opts.fit==true){ -var p=_765.panel("panel").parent(); -opts.width=p.width(); -opts.height=p.height(); -} -_765.panel("resize",opts); -}; -function _766(_767){ -var _768=$.data(_767,"datagrid"); -var opts=_768.options; -var dc=_768.dc; -var wrap=_768.panel; -if(!wrap.is(":visible")){ -return; -} -var _769=wrap.width(); -var _76a=wrap.height(); -var view=dc.view; -var _76b=dc.view1; -var _76c=dc.view2; -var _76d=_76b.children("div.datagrid-header"); -var _76e=_76c.children("div.datagrid-header"); -var _76f=_76d.find("table"); -var _770=_76e.find("table"); -view.width(_769); -var _771=_76d.children("div.datagrid-header-inner").show(); -_76b.width(_771.find("table").width()); -if(!opts.showHeader){ -_771.hide(); -} -_76c.width(_769-_76b._outerWidth()); -_76b.children()._outerWidth(_76b.width()); -_76c.children()._outerWidth(_76c.width()); -var all=_76d.add(_76e).add(_76f).add(_770); -all.css("height",""); -var hh=Math.max(_76f.height(),_770.height()); -all._outerHeight(hh); -view.children(".datagrid-empty").css("top",hh+"px"); -dc.body1.add(dc.body2).children("table.datagrid-btable-frozen").css({position:"absolute",top:dc.header2._outerHeight()}); -var _772=dc.body2.children("table.datagrid-btable-frozen")._outerHeight(); -var _773=_772+_76e._outerHeight()+_76c.children(".datagrid-footer")._outerHeight(); -wrap.children(":not(.datagrid-view,.datagrid-mask,.datagrid-mask-msg)").each(function(){ -_773+=$(this)._outerHeight(); -}); -var _774=wrap.outerHeight()-wrap.height(); -var _775=wrap._size("minHeight")||""; -var _776=wrap._size("maxHeight")||""; -_76b.add(_76c).children("div.datagrid-body").css({marginTop:_772,height:(isNaN(parseInt(opts.height))?"":(_76a-_773)),minHeight:(_775?_775-_774-_773:""),maxHeight:(_776?_776-_774-_773:"")}); -view.height(_76c.height()); -}; -function _777(_778,_779,_77a){ -var rows=$.data(_778,"datagrid").data.rows; -var opts=$.data(_778,"datagrid").options; -var dc=$.data(_778,"datagrid").dc; -var tmp=$("").appendTo("body"); -var _77b=tmp.outerHeight(); -tmp.remove(); -if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight||_77a)){ -if(_779!=undefined){ -var tr1=opts.finder.getTr(_778,_779,"body",1); -var tr2=opts.finder.getTr(_778,_779,"body",2); -_77c(tr1,tr2); -}else{ -var tr1=opts.finder.getTr(_778,0,"allbody",1); -var tr2=opts.finder.getTr(_778,0,"allbody",2); -_77c(tr1,tr2); -if(opts.showFooter){ -var tr1=opts.finder.getTr(_778,0,"allfooter",1); -var tr2=opts.finder.getTr(_778,0,"allfooter",2); -_77c(tr1,tr2); -} -} -} -_766(_778); -if(opts.height=="auto"){ -var _77d=dc.body1.parent(); -var _77e=dc.body2; -var _77f=_780(_77e); -var _781=_77f.height; -if(_77f.width>_77e.width()){ -_781+=18; -} -_781-=parseInt(_77e.css("marginTop"))||0; -_77d.height(_781); -_77e.height(_781); -dc.view.height(dc.view2.height()); -} -dc.body2.triggerHandler("scroll"); -function _77c(trs1,trs2){ -for(var i=0;i"); -} -_789(true); -_789(false); -_766(_786); -function _789(_78a){ -var _78b=_78a?1:2; -var tr=opts.finder.getTr(_786,_787,"body",_78b); -(_78a?dc.body1:dc.body2).children("table.datagrid-btable-frozen").append(tr); -}; -}; -function _78c(_78d,_78e){ -function _78f(){ -var _790=[]; -var _791=[]; -$(_78d).children("thead").each(function(){ -var opt=$.parser.parseOptions(this,[{frozen:"boolean"}]); -$(this).find("tr").each(function(){ -var cols=[]; -$(this).find("th").each(function(){ -var th=$(this); -var col=$.extend({},$.parser.parseOptions(this,["id","field","align","halign","order","width",{sortable:"boolean",checkbox:"boolean",resizable:"boolean",fixed:"boolean"},{rowspan:"number",colspan:"number"}]),{title:(th.html()||undefined),hidden:(th.attr("hidden")?true:undefined),hformatter:(th.attr("hformatter")?eval(th.attr("hformatter")):undefined),hstyler:(th.attr("hstyler")?eval(th.attr("hstyler")):undefined),formatter:(th.attr("formatter")?eval(th.attr("formatter")):undefined),styler:(th.attr("styler")?eval(th.attr("styler")):undefined),sorter:(th.attr("sorter")?eval(th.attr("sorter")):undefined)}); -if(col.width&&String(col.width).indexOf("%")==-1){ -col.width=parseInt(col.width); -} -if(th.attr("editor")){ -var s=$.trim(th.attr("editor")); -if(s.substr(0,1)=="{"){ -col.editor=eval("("+s+")"); -}else{ -col.editor=s; -} -} -cols.push(col); -}); -opt.frozen?_790.push(cols):_791.push(cols); -}); -}); -return [_790,_791]; -}; -var _792=$("
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+""+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+"
                                              "+""+"
                                              "+"
                                              "+"
                                              "+"
                                              ").insertAfter(_78d); -_792.panel({doSize:false,cls:"datagrid"}); -$(_78d).addClass("datagrid-f").hide().appendTo(_792.children("div.datagrid-view")); -var cc=_78f(); -var view=_792.children("div.datagrid-view"); -var _793=view.children("div.datagrid-view1"); -var _794=view.children("div.datagrid-view2"); -return {panel:_792,frozenColumns:cc[0],columns:cc[1],dc:{view:view,view1:_793,view2:_794,header1:_793.children("div.datagrid-header").children("div.datagrid-header-inner"),header2:_794.children("div.datagrid-header").children("div.datagrid-header-inner"),body1:_793.children("div.datagrid-body").children("div.datagrid-body-inner"),body2:_794.children("div.datagrid-body"),footer1:_793.children("div.datagrid-footer").children("div.datagrid-footer-inner"),footer2:_794.children("div.datagrid-footer").children("div.datagrid-footer-inner")}}; -}; -function _795(_796){ -var _797=$.data(_796,"datagrid"); -var opts=_797.options; -var dc=_797.dc; -var _798=_797.panel; -_797.ss=$(_796).datagrid("createStyleSheet"); -_798.panel($.extend({},opts,{id:null,doSize:false,onResize:function(_799,_79a){ -if($.data(_796,"datagrid")){ -_766(_796); -$(_796).datagrid("fitColumns"); -opts.onResize.call(_798,_799,_79a); -} -},onExpand:function(){ -if($.data(_796,"datagrid")){ -$(_796).datagrid("fixRowHeight").datagrid("fitColumns"); -opts.onExpand.call(_798); -} -}})); -var _79b=$(_796).attr("id")||""; -if(_79b){ -_79b+="_"; -} -_797.rowIdPrefix=_79b+"datagrid-row-r"+(++_74c); -_797.cellClassPrefix=_79b+"datagrid-cell-c"+_74c; -_79c(dc.header1,opts.frozenColumns,true); -_79c(dc.header2,opts.columns,false); -_79d(); -dc.header1.add(dc.header2).css("display",opts.showHeader?"block":"none"); -dc.footer1.add(dc.footer2).css("display",opts.showFooter?"block":"none"); -if(opts.toolbar){ -if($.isArray(opts.toolbar)){ -$("div.datagrid-toolbar",_798).remove(); -var tb=$("
                                              ").prependTo(_798); -var tr=tb.find("tr"); -for(var i=0;i
                                              ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var tool=$("").appendTo(td); -tool[0].onclick=eval(btn.handler||function(){ -}); -tool.linkbutton($.extend({},btn,{plain:true})); -} -} -}else{ -$(opts.toolbar).addClass("datagrid-toolbar").prependTo(_798); -$(opts.toolbar).show(); -} -}else{ -$("div.datagrid-toolbar",_798).remove(); -} -$("div.datagrid-pager",_798).remove(); -if(opts.pagination){ -var _79e=$("
                                              "); -if(opts.pagePosition=="bottom"){ -_79e.appendTo(_798); -}else{ -if(opts.pagePosition=="top"){ -_79e.addClass("datagrid-pager-top").prependTo(_798); -}else{ -var ptop=$("
                                              ").prependTo(_798); -_79e.appendTo(_798); -_79e=_79e.add(ptop); -} -} -_79e.pagination({total:0,pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_79f,_7a0){ -opts.pageNumber=_79f||1; -opts.pageSize=_7a0; -_79e.pagination("refresh",{pageNumber:_79f,pageSize:_7a0}); -_7ea(_796); -}}); -opts.pageSize=_79e.pagination("options").pageSize; -} -function _79c(_7a1,_7a2,_7a3){ -if(!_7a2){ -return; -} -$(_7a1).show(); -$(_7a1).empty(); -var tmp=$("
                                              ").appendTo("body"); -tmp._outerWidth(99); -var _7a4=100-parseInt(tmp[0].style.width); -tmp.remove(); -var _7a5=[]; -var _7a6=[]; -var _7a7=[]; -if(opts.sortName){ -_7a5=opts.sortName.split(","); -_7a6=opts.sortOrder.split(","); -} -var t=$("
                                              ").appendTo(_7a1); -for(var i=0;i<_7a2.length;i++){ -var tr=$("").appendTo($("tbody",t)); -var cols=_7a2[i]; -for(var j=0;j").appendTo(tr); -if(col.checkbox){ -td.attr("field",col.field); -$("
                                              ").html("").appendTo(td); -}else{ -if(col.field){ -td.attr("field",col.field); -td.append("
                                              "); -td.find("span:first").html(col.hformatter?col.hformatter(col.title,col):col.title); -var cell=td.find("div.datagrid-cell"); -var pos=_74d(_7a5,col.field); -if(pos>=0){ -cell.addClass("datagrid-sort-"+_7a6[pos]); -} -if(col.sortable){ -cell.addClass("datagrid-sort"); -} -if(col.resizable==false){ -cell.attr("resizable","false"); -} -if(col.width){ -var _7aa=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0)); -col.deltaWidth=_7a4; -col.boxWidth=_7aa-_7a4; -}else{ -col.auto=true; -} -cell.css("text-align",(col.halign||col.align||"")); -col.cellClass=_797.cellClassPrefix+"-"+col.field.replace(/[\.|\s]/g,"-"); -cell.addClass(col.cellClass); -}else{ -$("
                                              ").html(col.hformatter?col.hformatter(col.title,col):col.title).appendTo(td); -} -} -if(col.hidden){ -td.hide(); -_7a7.push(col.field); -} -} -} -if(_7a3&&opts.rownumbers){ -var td=$("
                                              "); -if($("tr",t).length==0){ -td.wrap("").parent().appendTo($("tbody",t)); -}else{ -td.prependTo($("tr:first",t)); -} -} -for(var i=0;i<_7a7.length;i++){ -_7ec(_796,_7a7[i],-1); -} -}; -function _79d(){ -var _7ab=[[".datagrid-header-rownumber",(opts.rownumberWidth-1)+"px"],[".datagrid-cell-rownumber",(opts.rownumberWidth-1)+"px"]]; -var _7ac=_7ad(_796,true).concat(_7ad(_796)); -for(var i=0;i<_7ac.length;i++){ -var col=_7ae(_796,_7ac[i]); -if(col&&!col.checkbox){ -_7ab.push(["."+col.cellClass,col.boxWidth?col.boxWidth+"px":"auto"]); -} -} -_797.ss.add(_7ab); -_797.ss.dirty(_797.cellSelectorPrefix); -_797.cellSelectorPrefix="."+_797.cellClassPrefix; -}; -}; -function _7af(_7b0){ -var _7b1=$.data(_7b0,"datagrid"); -var _7b2=_7b1.panel; -var opts=_7b1.options; -var dc=_7b1.dc; -var _7b3=dc.header1.add(dc.header2); -_7b3._unbind(".datagrid"); -for(var _7b4 in opts.headerEvents){ -_7b3._bind(_7b4+".datagrid",opts.headerEvents[_7b4]); -} -var _7b5=_7b3.find("div.datagrid-cell"); -var _7b6=opts.resizeHandle=="right"?"e":(opts.resizeHandle=="left"?"w":"e,w"); -_7b5.each(function(){ -$(this).resizable({handles:_7b6,edge:opts.resizeEdge,disabled:($(this).attr("resizable")?$(this).attr("resizable")=="false":false),minWidth:25,onStartResize:function(e){ -_7b1.resizing=true; -_7b3.css("cursor",$("body").css("cursor")); -if(!_7b1.proxy){ -_7b1.proxy=$("
                                              ").appendTo(dc.view); -} -if(e.data.dir=="e"){ -e.data.deltaEdge=$(this)._outerWidth()-(e.pageX-$(this).offset().left); -}else{ -e.data.deltaEdge=$(this).offset().left-e.pageX-1; -} -_7b1.proxy.css({left:e.pageX-$(_7b2).offset().left-1+e.data.deltaEdge,display:"none"}); -setTimeout(function(){ -if(_7b1.proxy){ -_7b1.proxy.show(); -} -},500); -},onResize:function(e){ -_7b1.proxy.css({left:e.pageX-$(_7b2).offset().left-1+e.data.deltaEdge,display:"block"}); -return false; -},onStopResize:function(e){ -_7b3.css("cursor",""); -$(this).css("height",""); -var _7b7=$(this).parent().attr("field"); -var col=_7ae(_7b0,_7b7); -col.width=$(this)._outerWidth()+1; -col.boxWidth=col.width-col.deltaWidth; -col.auto=undefined; -$(this).css("width",""); -$(_7b0).datagrid("fixColumnSize",_7b7); -_7b1.proxy.remove(); -_7b1.proxy=null; -if($(this).parents("div:first.datagrid-header").parent().hasClass("datagrid-view1")){ -_766(_7b0); -} -$(_7b0).datagrid("fitColumns"); -opts.onResizeColumn.call(_7b0,_7b7,col.width); -setTimeout(function(){ -_7b1.resizing=false; -},0); -}}); -}); -var bb=dc.body1.add(dc.body2); -bb._unbind(); -for(var _7b4 in opts.rowEvents){ -bb._bind(_7b4,opts.rowEvents[_7b4]); -} -dc.body1._bind("mousewheel DOMMouseScroll MozMousePixelScroll",function(e){ -e.preventDefault(); -var e1=e.originalEvent||window.event; -var _7b8=e1.wheelDelta||e1.detail*(-1); -if("deltaY" in e1){ -_7b8=e1.deltaY*-1; -} -var dg=$(e.target).closest("div.datagrid-view").children(".datagrid-f"); -var dc=dg.data("datagrid").dc; -dc.body2.scrollTop(dc.body2.scrollTop()-_7b8); -}); -dc.body2._bind("scroll",function(){ -var b1=dc.view1.children("div.datagrid-body"); -var stv=$(this).scrollTop(); -$(this).scrollTop(stv); -b1.scrollTop(stv); -var c1=dc.body1.children(":first"); -var c2=dc.body2.children(":first"); -if(c1.length&&c2.length){ -var top1=c1.offset().top; -var top2=c2.offset().top; -if(top1!=top2){ -b1.scrollTop(b1.scrollTop()+top1-top2); -} -} -dc.view2.children("div.datagrid-header,div.datagrid-footer")._scrollLeft($(this)._scrollLeft()); -dc.body2.children("table.datagrid-btable-frozen").css("left",-$(this)._scrollLeft()); -}); -}; -function _7b9(_7ba){ -return function(e){ -var td=$(e.target).closest("td[field]"); -if(td.length){ -var _7bb=_7bc(td); -if(!$(_7bb).data("datagrid").resizing&&_7ba){ -td.addClass("datagrid-header-over"); -}else{ -td.removeClass("datagrid-header-over"); -} -} -}; -}; -function _7bd(e){ -var _7be=_7bc(e.target); -var opts=$(_7be).datagrid("options"); -var ck=$(e.target).closest("input[type=checkbox]"); -if(ck.length){ -if(opts.singleSelect&&opts.selectOnCheck){ -return false; -} -if(ck.is(":checked")){ -_7bf(_7be); -}else{ -_7c0(_7be); -} -e.stopPropagation(); -}else{ -var cell=$(e.target).closest(".datagrid-cell"); -if(cell.length){ -var p1=cell.offset().left+5; -var p2=cell.offset().left+cell._outerWidth()-5; -if(e.pageXp1){ -_7c1(_7be,cell.parent().attr("field")); -} -} -} -}; -function _7c2(e){ -var _7c3=_7bc(e.target); -var opts=$(_7c3).datagrid("options"); -var cell=$(e.target).closest(".datagrid-cell"); -if(cell.length){ -var p1=cell.offset().left+5; -var p2=cell.offset().left+cell._outerWidth()-5; -var cond=opts.resizeHandle=="right"?(e.pageX>p2):(opts.resizeHandle=="left"?(e.pageXp2)); -if(cond){ -var _7c4=cell.parent().attr("field"); -var col=_7ae(_7c3,_7c4); -if(col.resizable==false){ -return; -} -$(_7c3).datagrid("autoSizeColumn",_7c4); -col.auto=false; -} -} -}; -function _7c5(e){ -var _7c6=_7bc(e.target); -var opts=$(_7c6).datagrid("options"); -var td=$(e.target).closest("td[field]"); -opts.onHeaderContextMenu.call(_7c6,e,td.attr("field")); -}; -function _7c7(_7c8){ -return function(e){ -var tr=_7c9(e.target); -if(!tr){ -return; -} -var _7ca=_7bc(tr); -if($.data(_7ca,"datagrid").resizing){ -return; -} -var _7cb=_7cc(tr); -if(_7c8){ -_7cd(_7ca,_7cb); -}else{ -var opts=$.data(_7ca,"datagrid").options; -opts.finder.getTr(_7ca,_7cb).removeClass("datagrid-row-over"); -} -}; -}; -function _7ce(e){ -var tr=_7c9(e.target); -if(!tr){ -return; -} -var _7cf=_7bc(tr); -var opts=$.data(_7cf,"datagrid").options; -var _7d0=_7cc(tr); -var tt=$(e.target); -if(tt.parent().hasClass("datagrid-cell-check")){ -if(opts.singleSelect&&opts.selectOnCheck){ -tt._propAttr("checked",!tt.is(":checked")); -_7d1(_7cf,_7d0); -}else{ -if(tt.is(":checked")){ -tt._propAttr("checked",false); -_7d1(_7cf,_7d0); -}else{ -tt._propAttr("checked",true); -_7d2(_7cf,_7d0); -} -} -}else{ -var row=opts.finder.getRow(_7cf,_7d0); -var td=tt.closest("td[field]",tr); -if(td.length){ -var _7d3=td.attr("field"); -opts.onClickCell.call(_7cf,_7d0,_7d3,row[_7d3]); -} -if(opts.singleSelect==true){ -_7d4(_7cf,_7d0); -}else{ -if(opts.ctrlSelect){ -if(e.metaKey||e.ctrlKey){ -if(tr.hasClass("datagrid-row-selected")){ -_7d5(_7cf,_7d0); -}else{ -_7d4(_7cf,_7d0); -} -}else{ -if(e.shiftKey){ -$(_7cf).datagrid("clearSelections"); -var _7d6=Math.min(opts.lastSelectedIndex||0,_7d0); -var _7d7=Math.max(opts.lastSelectedIndex||0,_7d0); -for(var i=_7d6;i<=_7d7;i++){ -_7d4(_7cf,i); -} -}else{ -$(_7cf).datagrid("clearSelections"); -_7d4(_7cf,_7d0); -opts.lastSelectedIndex=_7d0; -} -} -}else{ -if(tr.hasClass("datagrid-row-selected")){ -_7d5(_7cf,_7d0); -}else{ -_7d4(_7cf,_7d0); -} -} -} -opts.onClickRow.apply(_7cf,_750(_7cf,[_7d0,row])); -} -}; -function _7d8(e){ -var tr=_7c9(e.target); -if(!tr){ -return; -} -var _7d9=_7bc(tr); -var opts=$.data(_7d9,"datagrid").options; -var _7da=_7cc(tr); -var row=opts.finder.getRow(_7d9,_7da); -var td=$(e.target).closest("td[field]",tr); -if(td.length){ -var _7db=td.attr("field"); -opts.onDblClickCell.call(_7d9,_7da,_7db,row[_7db]); -} -opts.onDblClickRow.apply(_7d9,_750(_7d9,[_7da,row])); -}; -function _7dc(e){ -var tr=_7c9(e.target); -if(tr){ -var _7dd=_7bc(tr); -var opts=$.data(_7dd,"datagrid").options; -var _7de=_7cc(tr); -var row=opts.finder.getRow(_7dd,_7de); -opts.onRowContextMenu.call(_7dd,e,_7de,row); -}else{ -var body=_7c9(e.target,".datagrid-body"); -if(body){ -var _7dd=_7bc(body); -var opts=$.data(_7dd,"datagrid").options; -opts.onRowContextMenu.call(_7dd,e,-1,null); -} -} -}; -function _7bc(t){ -return $(t).closest("div.datagrid-view").children(".datagrid-f")[0]; -}; -function _7c9(t,_7df){ -var tr=$(t).closest(_7df||"tr.datagrid-row"); -if(tr.length&&tr.parent().length){ -return tr; -}else{ -return undefined; -} -}; -function _7cc(tr){ -if(tr.attr("datagrid-row-index")){ -return parseInt(tr.attr("datagrid-row-index")); -}else{ -return tr.attr("node-id"); -} -}; -function _7c1(_7e0,_7e1){ -var _7e2=$.data(_7e0,"datagrid"); -var opts=_7e2.options; -_7e1=_7e1||{}; -var _7e3={sortName:opts.sortName,sortOrder:opts.sortOrder}; -if(typeof _7e1=="object"){ -$.extend(_7e3,_7e1); -} -var _7e4=[]; -var _7e5=[]; -if(_7e3.sortName){ -_7e4=_7e3.sortName.split(","); -_7e5=_7e3.sortOrder.split(","); -} -if(typeof _7e1=="string"){ -var _7e6=_7e1; -var col=_7ae(_7e0,_7e6); -if(!col.sortable||_7e2.resizing){ -return; -} -var _7e7=col.order||"asc"; -var pos=_74d(_7e4,_7e6); -if(pos>=0){ -var _7e8=_7e5[pos]=="asc"?"desc":"asc"; -if(opts.multiSort&&_7e8==_7e7){ -_7e4.splice(pos,1); -_7e5.splice(pos,1); -}else{ -_7e5[pos]=_7e8; -} -}else{ -if(opts.multiSort){ -_7e4.push(_7e6); -_7e5.push(_7e7); -}else{ -_7e4=[_7e6]; -_7e5=[_7e7]; -} -} -_7e3.sortName=_7e4.join(","); -_7e3.sortOrder=_7e5.join(","); -} -if(opts.onBeforeSortColumn.call(_7e0,_7e3.sortName,_7e3.sortOrder)==false){ -return; -} -$.extend(opts,_7e3); -var dc=_7e2.dc; -var _7e9=dc.header1.add(dc.header2); -_7e9.find("div.datagrid-cell").removeClass("datagrid-sort-asc datagrid-sort-desc"); -for(var i=0;i<_7e4.length;i++){ -var col=_7ae(_7e0,_7e4[i]); -_7e9.find("div."+col.cellClass).addClass("datagrid-sort-"+_7e5[i]); -} -if(opts.remoteSort){ -_7ea(_7e0); -}else{ -_7eb(_7e0,$(_7e0).datagrid("getData")); -} -opts.onSortColumn.call(_7e0,opts.sortName,opts.sortOrder); -}; -function _7ec(_7ed,_7ee,_7ef){ -_7f0(true); -_7f0(false); -function _7f0(_7f1){ -var aa=_7f2(_7ed,_7f1); -if(aa.length){ -var _7f3=aa[aa.length-1]; -var _7f4=_74d(_7f3,_7ee); -if(_7f4>=0){ -for(var _7f5=0;_7f5=_7fa.find("table").width()){ -dc.body2.css("overflow-x","hidden"); -} -if(!opts.showHeader){ -_7fb.hide(); -} -function _7fe(){ -if(!opts.fitColumns){ -return; -} -if(!_7f9.leftWidth){ -_7f9.leftWidth=0; -} -var _7ff=0; -var cc=[]; -var _800=_7ad(_7f8,false); -for(var i=0;i<_800.length;i++){ -var col=_7ae(_7f8,_800[i]); -if(_801(col)){ -_7ff+=col.width; -cc.push({field:col.field,col:col,addingWidth:0}); -} -} -if(!_7ff){ -return; -} -cc[cc.length-1].addingWidth-=_7f9.leftWidth; -_7fb.show(); -var _802=_7fa.width()-_7fa.find("table").width()-opts.scrollbarSize+_7f9.leftWidth; -var rate=_802/_7ff; -if(!opts.showHeader){ -_7fb.hide(); -} -for(var i=0;i0){ -c.col.boxWidth+=c.addingWidth; -c.col.width+=c.addingWidth; -} -} -_7f9.leftWidth=_802; -$(_7f8).datagrid("fixColumnSize"); -}; -function _7fd(){ -var _804=false; -var _805=_7ad(_7f8,true).concat(_7ad(_7f8,false)); -$.map(_805,function(_806){ -var col=_7ae(_7f8,_806); -if(String(col.width||"").indexOf("%")>=0){ -var _807=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0))-col.deltaWidth; -if(_807>0){ -col.boxWidth=_807; -_804=true; -} -} -}); -if(_804){ -$(_7f8).datagrid("fixColumnSize"); -} -}; -function _7fc(fit){ -var _808=dc.header1.add(dc.header2).find(".datagrid-cell-group"); -if(_808.length){ -_808.each(function(){ -$(this)._outerWidth(fit?$(this).parent().width():10); -}); -if(fit){ -_766(_7f8); -} -} -}; -function _801(col){ -if(String(col.width||"").indexOf("%")>=0){ -return false; -} -if(!col.hidden&&!col.checkbox&&!col.auto&&!col.fixed){ -return true; -} -}; -}; -function _809(_80a,_80b){ -var _80c=$.data(_80a,"datagrid"); -var opts=_80c.options; -var dc=_80c.dc; -var tmp=$("
                                              ").appendTo("body"); -if(_80b){ -_761(_80b); -$(_80a).datagrid("fitColumns"); -}else{ -var _80d=false; -var _80e=_7ad(_80a,true).concat(_7ad(_80a,false)); -for(var i=0;i<_80e.length;i++){ -var _80b=_80e[i]; -var col=_7ae(_80a,_80b); -if(col.auto){ -_761(_80b); -_80d=true; -} -} -if(_80d){ -$(_80a).datagrid("fitColumns"); -} -} -tmp.remove(); -function _761(_80f){ -var _810=dc.view.find("div.datagrid-header td[field=\""+_80f+"\"] div.datagrid-cell"); -_810.css("width",""); -var col=$(_80a).datagrid("getColumnOption",_80f); -col.width=undefined; -col.boxWidth=undefined; -col.auto=true; -$(_80a).datagrid("fixColumnSize",_80f); -var _811=Math.max(_812("header"),_812("allbody"),_812("allfooter"))+1; -_810._outerWidth(_811-1); -col.width=_811; -col.boxWidth=parseInt(_810[0].style.width); -col.deltaWidth=_811-col.boxWidth; -_810.css("width",""); -$(_80a).datagrid("fixColumnSize",_80f); -opts.onResizeColumn.call(_80a,_80f,col.width); -function _812(type){ -var _813=0; -if(type=="header"){ -_813=_814(_810); -}else{ -opts.finder.getTr(_80a,0,type).find("td[field=\""+_80f+"\"] div.datagrid-cell").each(function(){ -var w=_814($(this)); -if(_8131){ -var col=_7ae(_81d,td.attr("field")); -var _81f=col.boxWidth+col.deltaWidth-1; -for(var i=1;i<_81e;i++){ -td=td.next(); -col=_7ae(_81d,td.attr("field")); -_81f+=col.boxWidth+col.deltaWidth; -} -$(this).children("div.datagrid-cell")._outerWidth(_81f); -} -}); -}; -function _81b(_820){ -var dc=$.data(_820,"datagrid").dc; -dc.view.find("div.datagrid-editable").each(function(){ -var cell=$(this); -var _821=cell.parent().attr("field"); -var col=$(_820).datagrid("getColumnOption",_821); -cell._outerWidth(col.boxWidth+col.deltaWidth-1); -var ed=$.data(this,"datagrid.editor"); -if(ed.actions.resize){ -ed.actions.resize(ed.target,cell.width()); -} -}); -}; -function _7ae(_822,_823){ -function find(_824){ -if(_824){ -for(var i=0;i<_824.length;i++){ -var cc=_824[i]; -for(var j=0;j=0){ -var _82d=col.field||col.id||""; -for(var c=0;c<(col.colspan||1);c++){ -for(var r=0;r<(col.rowspan||1);r++){ -aa[_82a+r][_82b]=_82d; -} -_82b++; -} -} -}); -} -return aa; -function _829(){ -var _82e=0; -$.map(_827[0]||[],function(col){ -_82e+=col.colspan||1; -}); -return _82e; -}; -function _82c(a){ -for(var i=0;ib?1:-1); -}; -r=_835(r1[sn],r2[sn],r1,r2)*(so=="asc"?1:-1); -if(r!=0){ -return r; -} -} -return r; -}); -} -if(opts.view.onBeforeRender){ -opts.view.onBeforeRender.call(opts.view,_831,data.rows); -} -opts.view.render.call(opts.view,_831,dc.body2,false); -opts.view.render.call(opts.view,_831,dc.body1,true); -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,_831,dc.footer2,false); -opts.view.renderFooter.call(opts.view,_831,dc.footer1,true); -} -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,_831); -} -_832.ss.clean(); -var _836=$(_831).datagrid("getPager"); -if(_836.length){ -var _837=_836.pagination("options"); -if(_837.total!=data.total){ -_836.pagination("refresh",{pageNumber:opts.pageNumber,total:data.total}); -if(opts.pageNumber!=_837.pageNumber&&_837.pageNumber>0){ -opts.pageNumber=_837.pageNumber; -_7ea(_831); -} -} -} -_777(_831); -dc.body2.triggerHandler("scroll"); -$(_831).datagrid("setSelectionState"); -$(_831).datagrid("autoSizeColumn"); -opts.onLoadSuccess.call(_831,data); -}; -function _838(_839){ -var _83a=$.data(_839,"datagrid"); -var opts=_83a.options; -var dc=_83a.dc; -dc.header1.add(dc.header2).find("input[type=checkbox]")._propAttr("checked",false); -if(opts.idField){ -var _83b=$.data(_839,"treegrid")?true:false; -var _83c=opts.onSelect; -var _83d=opts.onCheck; -opts.onSelect=opts.onCheck=function(){ -}; -var rows=opts.finder.getRows(_839); -for(var i=0;i_84e.height()-_84f){ -_84e.scrollTop(_84e.scrollTop()+top+tr._outerHeight()-_84e.height()+_84f); -} -} -} -}; -function _7cd(_851,_852){ -var _853=$.data(_851,"datagrid"); -var opts=_853.options; -opts.finder.getTr(_851,_853.highlightIndex).removeClass("datagrid-row-over"); -opts.finder.getTr(_851,_852).addClass("datagrid-row-over"); -_853.highlightIndex=_852; -}; -function _7d4(_854,_855,_856,_857){ -var _858=$.data(_854,"datagrid"); -var opts=_858.options; -var row=opts.finder.getRow(_854,_855); -if(!row){ -return; -} -var tr=opts.finder.getTr(_854,_855); -if(tr.hasClass("datagrid-row-selected")){ -return; -} -if(opts.onBeforeSelect.apply(_854,_750(_854,[_855,row]))==false){ -return; -} -if(opts.singleSelect){ -_859(_854,true); -_858.selectedRows=[]; -} -if(!_856&&opts.checkOnSelect){ -_7d1(_854,_855,true); -} -if(opts.idField){ -_74f(_858.selectedRows,opts.idField,row); -} -tr.addClass("datagrid-row-selected"); -if(_858.selectingData){ -_858.selectingData.push(row); -} -opts.onSelect.apply(_854,_750(_854,[_855,row])); -if(!_857&&opts.scrollOnSelect){ -_849(_854,_855); -} -}; -function _7d5(_85a,_85b,_85c){ -var _85d=$.data(_85a,"datagrid"); -var dc=_85d.dc; -var opts=_85d.options; -var row=opts.finder.getRow(_85a,_85b); -if(!row){ -return; -} -var tr=opts.finder.getTr(_85a,_85b); -if(!tr.hasClass("datagrid-row-selected")){ -return; -} -if(opts.onBeforeUnselect.apply(_85a,_750(_85a,[_85b,row]))==false){ -return; -} -if(!_85c&&opts.checkOnSelect){ -_7d2(_85a,_85b,true); -} -tr.removeClass("datagrid-row-selected"); -if(opts.idField){ -_74e(_85d.selectedRows,opts.idField,row[opts.idField]); -} -if(_85d.selectingData){ -_85d.selectingData.push(row); -} -opts.onUnselect.apply(_85a,_750(_85a,[_85b,row])); -}; -function _85e(_85f,_860){ -var _861=$.data(_85f,"datagrid"); -var opts=_861.options; -var _862=$.data(_85f,"treegrid")?true:false; -var _863=opts.scrollOnSelect; -opts.scrollOnSelect=false; -_861.selectingData=[]; -if(!_860&&opts.checkOnSelect){ -_7bf(_85f,true); -} -var rows=opts.finder.getRows(_85f); -for(var i=0;i"); -cell.children("table")._bind("click dblclick contextmenu",function(e){ -e.stopPropagation(); -}); -$.data(cell[0],"datagrid.editor",{actions:_8a8,target:_8a8.init(cell.find("td"),$.extend({height:opts.editorHeight},_8a7)),field:_8a5,type:_8a6,oldHtml:_8a9}); -} -} -}); -_777(_8a3,_8a4,true); -}; -function _89a(_8ab,_8ac){ -var opts=$.data(_8ab,"datagrid").options; -var tr=opts.finder.getTr(_8ab,_8ac); -tr.children("td").each(function(){ -var cell=$(this).find("div.datagrid-editable"); -if(cell.length){ -var ed=$.data(cell[0],"datagrid.editor"); -if(ed.actions.destroy){ -ed.actions.destroy(ed.target); -} -cell.html(ed.oldHtml); -$.removeData(cell[0],"datagrid.editor"); -cell.removeClass("datagrid-editable"); -cell.css("width",""); -} -}); -}; -function _88d(_8ad,_8ae){ -var tr=$.data(_8ad,"datagrid").options.finder.getTr(_8ad,_8ae); -if(!tr.hasClass("datagrid-row-editing")){ -return true; -} -var vbox=tr.find(".validatebox-text"); -vbox.validatebox("validate"); -vbox.trigger("mouseleave"); -var _8af=tr.find(".validatebox-invalid"); -return _8af.length==0; -}; -function _8b0(_8b1,_8b2){ -var _8b3=$.data(_8b1,"datagrid").insertedRows; -var _8b4=$.data(_8b1,"datagrid").deletedRows; -var _8b5=$.data(_8b1,"datagrid").updatedRows; -if(!_8b2){ -var rows=[]; -rows=rows.concat(_8b3); -rows=rows.concat(_8b4); -rows=rows.concat(_8b5); -return rows; -}else{ -if(_8b2=="inserted"){ -return _8b3; -}else{ -if(_8b2=="deleted"){ -return _8b4; -}else{ -if(_8b2=="updated"){ -return _8b5; -} -} -} -} -return []; -}; -function _8b6(_8b7,_8b8){ -var _8b9=$.data(_8b7,"datagrid"); -var opts=_8b9.options; -var data=_8b9.data; -var _8ba=_8b9.insertedRows; -var _8bb=_8b9.deletedRows; -$(_8b7).datagrid("cancelEdit",_8b8); -var row=opts.finder.getRow(_8b7,_8b8); -if(_74d(_8ba,row)>=0){ -_74e(_8ba,row); -}else{ -_8bb.push(row); -} -_74e(_8b9.selectedRows,opts.idField,row[opts.idField]); -_74e(_8b9.checkedRows,opts.idField,row[opts.idField]); -opts.view.deleteRow.call(opts.view,_8b7,_8b8); -if(opts.height=="auto"){ -_777(_8b7); -} -$(_8b7).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _8bc(_8bd,_8be){ -var data=$.data(_8bd,"datagrid").data; -var view=$.data(_8bd,"datagrid").options.view; -var _8bf=$.data(_8bd,"datagrid").insertedRows; -view.insertRow.call(view,_8bd,_8be.index,_8be.row); -_8bf.push(_8be.row); -$(_8bd).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _8c0(_8c1,row){ -var data=$.data(_8c1,"datagrid").data; -var view=$.data(_8c1,"datagrid").options.view; -var _8c2=$.data(_8c1,"datagrid").insertedRows; -view.insertRow.call(view,_8c1,null,row); -_8c2.push(row); -$(_8c1).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _8c3(_8c4,_8c5){ -var _8c6=$.data(_8c4,"datagrid"); -var opts=_8c6.options; -var row=opts.finder.getRow(_8c4,_8c5.index); -var _8c7=false; -_8c5.row=_8c5.row||{}; -for(var _8c8 in _8c5.row){ -if(row[_8c8]!==_8c5.row[_8c8]){ -_8c7=true; -break; -} -} -if(_8c7){ -if(_74d(_8c6.insertedRows,row)==-1){ -if(_74d(_8c6.updatedRows,row)==-1){ -_8c6.updatedRows.push(row); -} -} -opts.view.updateRow.call(opts.view,_8c4,_8c5.index,_8c5.row); -} -}; -function _8c9(_8ca){ -var _8cb=$.data(_8ca,"datagrid"); -var data=_8cb.data; -var rows=data.rows; -var _8cc=[]; -for(var i=0;i=0){ -(_8d9=="s"?_7d4:_7d1)(_8d0,_8da,true); -} -} -}; -for(var i=0;i0){ -$(this).datagrid("loadData",data); -}else{ -$(this).datagrid("autoSizeColumn"); -} -} -_7ea(this); -}); -}; -function _8ea(_8eb){ -var _8ec={}; -$.map(_8eb,function(name){ -_8ec[name]=_8ed(name); -}); -return _8ec; -function _8ed(name){ -function isA(_8ee){ -return $.data($(_8ee)[0],name)!=undefined; -}; -return {init:function(_8ef,_8f0){ -var _8f1=$("").appendTo(_8ef); -if(_8f1[name]&&name!="text"){ -return _8f1[name](_8f0); -}else{ -return _8f1; -} -},destroy:function(_8f2){ -if(isA(_8f2,name)){ -$(_8f2)[name]("destroy"); -} -},getValue:function(_8f3){ -if(isA(_8f3,name)){ -var opts=$(_8f3)[name]("options"); -if(opts.multiple){ -return $(_8f3)[name]("getValues").join(opts.separator); -}else{ -return $(_8f3)[name]("getValue"); -} -}else{ -return $(_8f3).val(); -} -},setValue:function(_8f4,_8f5){ -if(isA(_8f4,name)){ -var opts=$(_8f4)[name]("options"); -if(opts.multiple){ -if(_8f5){ -$(_8f4)[name]("setValues",_8f5.split(opts.separator)); -}else{ -$(_8f4)[name]("clear"); -} -}else{ -$(_8f4)[name]("setValue",_8f5); -} -}else{ -$(_8f4).val(_8f5); -} -},resize:function(_8f6,_8f7){ -if(isA(_8f6,name)){ -$(_8f6)[name]("resize",_8f7); -}else{ -$(_8f6)._size({width:_8f7,height:$.fn.datagrid.defaults.editorHeight}); -} -}}; -}; -}; -var _8f8=$.extend({},_8ea(["text","textbox","passwordbox","filebox","numberbox","numberspinner","combobox","combotree","combogrid","combotreegrid","datebox","datetimebox","timespinner","datetimespinner"]),{textarea:{init:function(_8f9,_8fa){ -var _8fb=$("").appendTo(_8f9); -_8fb.css("vertical-align","middle")._outerHeight(_8fa.height); -return _8fb; -},getValue:function(_8fc){ -return $(_8fc).val(); -},setValue:function(_8fd,_8fe){ -$(_8fd).val(_8fe); -},resize:function(_8ff,_900){ -$(_8ff)._outerWidth(_900); -}},checkbox:{init:function(_901,_902){ -var _903=$("").appendTo(_901); -_903.val(_902.on); -_903.attr("offval",_902.off); -return _903; -},getValue:function(_904){ -if($(_904).is(":checked")){ -return $(_904).val(); -}else{ -return $(_904).attr("offval"); -} -},setValue:function(_905,_906){ -var _907=false; -if($(_905).val()==_906){ -_907=true; -} -$(_905)._propAttr("checked",_907); -}},validatebox:{init:function(_908,_909){ -var _90a=$("").appendTo(_908); -_90a.validatebox(_909); -return _90a; -},destroy:function(_90b){ -$(_90b).validatebox("destroy"); -},getValue:function(_90c){ -return $(_90c).val(); -},setValue:function(_90d,_90e){ -$(_90d).val(_90e); -},resize:function(_90f,_910){ -$(_90f)._outerWidth(_910)._outerHeight($.fn.datagrid.defaults.editorHeight); -}}}); -$.fn.datagrid.methods={options:function(jq){ -var _911=$.data(jq[0],"datagrid").options; -var _912=$.data(jq[0],"datagrid").panel.panel("options"); -var opts=$.extend(_911,{width:_912.width,height:_912.height,closed:_912.closed,collapsed:_912.collapsed,minimized:_912.minimized,maximized:_912.maximized}); -return opts; -},setSelectionState:function(jq){ -return jq.each(function(){ -_838(this); -}); -},createStyleSheet:function(jq){ -return _752(jq[0]); -},getPanel:function(jq){ -return $.data(jq[0],"datagrid").panel; -},getPager:function(jq){ -return $.data(jq[0],"datagrid").panel.children("div.datagrid-pager"); -},getColumnFields:function(jq,_913){ -return _7ad(jq[0],_913); -},getColumnOption:function(jq,_914){ -return _7ae(jq[0],_914); -},resize:function(jq,_915){ -return jq.each(function(){ -_761(this,_915); -}); -},load:function(jq,_916){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -if(typeof _916=="string"){ -opts.url=_916; -_916=null; -} -opts.pageNumber=1; -var _917=$(this).datagrid("getPager"); -_917.pagination("refresh",{pageNumber:1}); -_7ea(this,_916); -}); -},reload:function(jq,_918){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -if(typeof _918=="string"){ -opts.url=_918; -_918=null; -} -_7ea(this,_918); -}); -},reloadFooter:function(jq,_919){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -var dc=$.data(this,"datagrid").dc; -if(_919){ -$.data(this,"datagrid").footer=_919; -} -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,this,dc.footer2,false); -opts.view.renderFooter.call(opts.view,this,dc.footer1,true); -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,this); -} -$(this).datagrid("fixRowHeight"); -} -}); -},loading:function(jq){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -$(this).datagrid("getPager").pagination("loading"); -if(opts.loadMsg){ -var _91a=$(this).datagrid("getPanel"); -if(!_91a.children("div.datagrid-mask").length){ -$("
                                              ").appendTo(_91a); -var msg=$("
                                              ").html(opts.loadMsg).appendTo(_91a); -msg._outerHeight(40); -msg.css({marginLeft:(-msg.outerWidth()/2),lineHeight:(msg.height()+"px")}); -} -} -}); -},loaded:function(jq){ -return jq.each(function(){ -$(this).datagrid("getPager").pagination("loaded"); -var _91b=$(this).datagrid("getPanel"); -_91b.children("div.datagrid-mask-msg").remove(); -_91b.children("div.datagrid-mask").remove(); -}); -},fitColumns:function(jq){ -return jq.each(function(){ -_7f7(this); -}); -},fixColumnSize:function(jq,_91c){ -return jq.each(function(){ -_815(this,_91c); -}); -},fixRowHeight:function(jq,_91d){ -return jq.each(function(){ -_777(this,_91d); -}); -},freezeRow:function(jq,_91e){ -return jq.each(function(){ -_785(this,_91e); -}); -},autoSizeColumn:function(jq,_91f){ -return jq.each(function(){ -_809(this,_91f); -}); -},loadData:function(jq,data){ -return jq.each(function(){ -_7eb(this,data); -_8c9(this); -}); -},getData:function(jq){ -return $.data(jq[0],"datagrid").data; -},getRows:function(jq){ -return $.data(jq[0],"datagrid").data.rows; -},getFooterRows:function(jq){ -return $.data(jq[0],"datagrid").footer; -},getRowIndex:function(jq,id){ -return _840(jq[0],id); -},getChecked:function(jq){ -return _846(jq[0]); -},getSelected:function(jq){ -var rows=_843(jq[0]); -return rows.length>0?rows[0]:null; -},getSelections:function(jq){ -return _843(jq[0]); -},clearSelections:function(jq){ -return jq.each(function(){ -var _920=$.data(this,"datagrid"); -var _921=_920.selectedRows; -var _922=_920.checkedRows; -_921.splice(0,_921.length); -_859(this); -if(_920.options.checkOnSelect){ -_922.splice(0,_922.length); -} -}); -},clearChecked:function(jq){ -return jq.each(function(){ -var _923=$.data(this,"datagrid"); -var _924=_923.selectedRows; -var _925=_923.checkedRows; -_925.splice(0,_925.length); -_7c0(this); -if(_923.options.selectOnCheck){ -_924.splice(0,_924.length); -} -}); -},scrollTo:function(jq,_926){ -return jq.each(function(){ -_849(this,_926); -}); -},highlightRow:function(jq,_927){ -return jq.each(function(){ -_7cd(this,_927); -_849(this,_927); -}); -},selectAll:function(jq){ -return jq.each(function(){ -_85e(this); -}); -},unselectAll:function(jq){ -return jq.each(function(){ -_859(this); -}); -},selectRow:function(jq,_928){ -return jq.each(function(){ -_7d4(this,_928); -}); -},selectRecord:function(jq,id){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -if(opts.idField){ -var _929=_840(this,id); -if(_929>=0){ -$(this).datagrid("selectRow",_929); -} -} -}); -},unselectRow:function(jq,_92a){ -return jq.each(function(){ -_7d5(this,_92a); -}); -},checkRow:function(jq,_92b){ -return jq.each(function(){ -_7d1(this,_92b); -}); -},uncheckRow:function(jq,_92c){ -return jq.each(function(){ -_7d2(this,_92c); -}); -},checkAll:function(jq){ -return jq.each(function(){ -_7bf(this); -}); -},uncheckAll:function(jq){ -return jq.each(function(){ -_7c0(this); -}); -},beginEdit:function(jq,_92d){ -return jq.each(function(){ -_888(this,_92d); -}); -},endEdit:function(jq,_92e){ -return jq.each(function(){ -_88e(this,_92e,false); -}); -},cancelEdit:function(jq,_92f){ -return jq.each(function(){ -_88e(this,_92f,true); -}); -},getEditors:function(jq,_930){ -return _89b(jq[0],_930); -},getEditor:function(jq,_931){ -return _89f(jq[0],_931); -},refreshRow:function(jq,_932){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -opts.view.refreshRow.call(opts.view,this,_932); -}); -},validateRow:function(jq,_933){ -return _88d(jq[0],_933); -},updateRow:function(jq,_934){ -return jq.each(function(){ -_8c3(this,_934); -}); -},appendRow:function(jq,row){ -return jq.each(function(){ -_8c0(this,row); -}); -},insertRow:function(jq,_935){ -return jq.each(function(){ -_8bc(this,_935); -}); -},deleteRow:function(jq,_936){ -return jq.each(function(){ -_8b6(this,_936); -}); -},getChanges:function(jq,_937){ -return _8b0(jq[0],_937); -},acceptChanges:function(jq){ -return jq.each(function(){ -_8cd(this); -}); -},rejectChanges:function(jq){ -return jq.each(function(){ -_8cf(this); -}); -},mergeCells:function(jq,_938){ -return jq.each(function(){ -_8e1(this,_938); -}); -},showColumn:function(jq,_939){ -return jq.each(function(){ -var col=$(this).datagrid("getColumnOption",_939); -if(col.hidden){ -col.hidden=false; -$(this).datagrid("getPanel").find("td[field=\""+_939+"\"]").show(); -_7ec(this,_939,1); -$(this).datagrid("fitColumns"); -} -}); -},hideColumn:function(jq,_93a){ -return jq.each(function(){ -var col=$(this).datagrid("getColumnOption",_93a); -if(!col.hidden){ -col.hidden=true; -$(this).datagrid("getPanel").find("td[field=\""+_93a+"\"]").hide(); -_7ec(this,_93a,-1); -$(this).datagrid("fitColumns"); -} -}); -},sort:function(jq,_93b){ -return jq.each(function(){ -_7c1(this,_93b); -}); -},gotoPage:function(jq,_93c){ -return jq.each(function(){ -var _93d=this; -var page,cb; -if(typeof _93c=="object"){ -page=_93c.page; -cb=_93c.callback; -}else{ -page=_93c; -} -$(_93d).datagrid("options").pageNumber=page; -$(_93d).datagrid("getPager").pagination("refresh",{pageNumber:page}); -_7ea(_93d,null,function(){ -if(cb){ -cb.call(_93d,page); -} -}); -}); -}}; -$.fn.datagrid.parseOptions=function(_93e){ -var t=$(_93e); -return $.extend({},$.fn.panel.parseOptions(_93e),$.parser.parseOptions(_93e,["url","toolbar","idField","sortName","sortOrder","pagePosition","resizeHandle",{sharedStyleSheet:"boolean",fitColumns:"boolean",autoRowHeight:"boolean",striped:"boolean",nowrap:"boolean"},{rownumbers:"boolean",singleSelect:"boolean",ctrlSelect:"boolean",checkOnSelect:"boolean",selectOnCheck:"boolean"},{pagination:"boolean",pageSize:"number",pageNumber:"number"},{multiSort:"boolean",remoteSort:"boolean",showHeader:"boolean",showFooter:"boolean"},{scrollbarSize:"number",scrollOnSelect:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined),loadMsg:(t.attr("loadMsg")!=undefined?t.attr("loadMsg"):undefined),rowStyler:(t.attr("rowStyler")?eval(t.attr("rowStyler")):undefined)}); -}; -$.fn.datagrid.parseData=function(_93f){ -var t=$(_93f); -var data={total:0,rows:[]}; -var _940=t.datagrid("getColumnFields",true).concat(t.datagrid("getColumnFields",false)); -t.find("tbody tr").each(function(){ -data.total++; -var row={}; -$.extend(row,$.parser.parseOptions(this,["iconCls","state"])); -for(var i=0;i<_940.length;i++){ -row[_940[i]]=$(this).find("td:eq("+i+")").html(); -} -data.rows.push(row); -}); -return data; -}; -var _941={render:function(_942,_943,_944){ -var rows=$(_942).datagrid("getRows"); -$(_943).empty().html(this.renderTable(_942,0,rows,_944)); -},renderFooter:function(_945,_946,_947){ -var opts=$.data(_945,"datagrid").options; -var rows=$.data(_945,"datagrid").footer||[]; -var _948=$(_945).datagrid("getColumnFields",_947); -var _949=[""]; -for(var i=0;i"); -_949.push(this.renderRow.call(this,_945,_948,_947,i,rows[i])); -_949.push(""); -} -_949.push("
                                              "); -$(_946).html(_949.join("")); -},renderTable:function(_94a,_94b,rows,_94c){ -var _94d=$.data(_94a,"datagrid"); -var opts=_94d.options; -if(_94c){ -if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ -return ""; -} -} -var _94e=$(_94a).datagrid("getColumnFields",_94c); -var _94f=[""]; -for(var i=0;i"); -_94f.push(this.renderRow.call(this,_94a,_94e,_94c,_94b,row)); -_94f.push(""); -_94b++; -} -_94f.push("
                                              "); -return _94f.join(""); -},renderRow:function(_952,_953,_954,_955,_956){ -var opts=$.data(_952,"datagrid").options; -var cc=[]; -if(_954&&opts.rownumbers){ -var _957=_955+1; -if(opts.pagination){ -_957+=(opts.pageNumber-1)*opts.pageSize; -} -cc.push("
                                              "+_957+"
                                              "); -} -for(var i=0;i<_953.length;i++){ -var _958=_953[i]; -var col=$(_952).datagrid("getColumnOption",_958); -if(col){ -var _959=_956[_958]; -var css=col.styler?(col.styler.call(_952,_959,_956,_955)||""):""; -var cs=this.getStyleValue(css); -var cls=cs.c?"class=\""+cs.c+"\"":""; -var _95a=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); -cc.push(""); -var _95a=""; -if(!col.checkbox){ -if(col.align){ -_95a+="text-align:"+col.align+";"; -} -if(!opts.nowrap){ -_95a+="white-space:normal;height:auto;"; -}else{ -if(opts.autoRowHeight){ -_95a+="height:auto;"; -} -} -} -cc.push("
                                              "); -if(col.checkbox){ -cc.push(""); -}else{ -if(col.formatter){ -cc.push(col.formatter(_959,_956,_955)); -}else{ -cc.push(_959); -} -} -cc.push("
                                              "); -cc.push(""); -} -} -return cc.join(""); -},getStyleValue:function(css){ -var _95b=""; -var _95c=""; -if(typeof css=="string"){ -_95c=css; -}else{ -if(css){ -_95b=css["class"]||""; -_95c=css["style"]||""; -} -} -return {c:_95b,s:_95c}; -},refreshRow:function(_95d,_95e){ -this.updateRow.call(this,_95d,_95e,{}); -},updateRow:function(_95f,_960,row){ -var opts=$.data(_95f,"datagrid").options; -var _961=opts.finder.getRow(_95f,_960); -$.extend(_961,row); -var cs=_962.call(this,_960); -var _963=cs.s; -var cls="datagrid-row "+(_960%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c; -function _962(_964){ -var css=opts.rowStyler?opts.rowStyler.call(_95f,_964,_961):""; -return this.getStyleValue(css); -}; -function _965(_966){ -var tr=opts.finder.getTr(_95f,_960,"body",(_966?1:2)); -if(!tr.length){ -return; -} -var _967=$(_95f).datagrid("getColumnFields",_966); -var _968=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); -tr.html(this.renderRow.call(this,_95f,_967,_966,_960,_961)); -var _969=(tr.hasClass("datagrid-row-checked")?" datagrid-row-checked":"")+(tr.hasClass("datagrid-row-selected")?" datagrid-row-selected":""); -tr.attr("style",_963).attr("class",cls+_969); -if(_968){ -tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); -} -}; -_965.call(this,true); -_965.call(this,false); -$(_95f).datagrid("fixRowHeight",_960); -},insertRow:function(_96a,_96b,row){ -var _96c=$.data(_96a,"datagrid"); -var opts=_96c.options; -var dc=_96c.dc; -var data=_96c.data; -if(_96b==undefined||_96b==null){ -_96b=data.rows.length; -} -if(_96b>data.rows.length){ -_96b=data.rows.length; -} -function _96d(_96e){ -var _96f=_96e?1:2; -for(var i=data.rows.length-1;i>=_96b;i--){ -var tr=opts.finder.getTr(_96a,i,"body",_96f); -tr.attr("datagrid-row-index",i+1); -tr.attr("id",_96c.rowIdPrefix+"-"+_96f+"-"+(i+1)); -if(_96e&&opts.rownumbers){ -var _970=i+2; -if(opts.pagination){ -_970+=(opts.pageNumber-1)*opts.pageSize; -} -tr.find("div.datagrid-cell-rownumber").html(_970); -} -if(opts.striped){ -tr.removeClass("datagrid-row-alt").addClass((i+1)%2?"datagrid-row-alt":""); -} -} -}; -function _971(_972){ -var _973=_972?1:2; -var _974=$(_96a).datagrid("getColumnFields",_972); -var _975=_96c.rowIdPrefix+"-"+_973+"-"+_96b; -var tr=""; -if(_96b>=data.rows.length){ -if(data.rows.length){ -opts.finder.getTr(_96a,"","last",_973).after(tr); -}else{ -var cc=_972?dc.body1:dc.body2; -cc.html(""+tr+"
                                              "); -} -}else{ -opts.finder.getTr(_96a,_96b+1,"body",_973).before(tr); -} -}; -_96d.call(this,true); -_96d.call(this,false); -_971.call(this,true); -_971.call(this,false); -data.total+=1; -data.rows.splice(_96b,0,row); -this.setEmptyMsg(_96a); -this.refreshRow.call(this,_96a,_96b); -},deleteRow:function(_976,_977){ -var _978=$.data(_976,"datagrid"); -var opts=_978.options; -var data=_978.data; -function _979(_97a){ -var _97b=_97a?1:2; -for(var i=_977+1;i").appendTo(_982.dc.view); -d.html(opts.emptyMsg).css("top",h+"px"); -} -} -},renderEmptyRow:function(_984){ -var opts=$(_984).datagrid("options"); -var cols=$.map($(_984).datagrid("getColumnFields"),function(_985){ -return $(_984).datagrid("getColumnOption",_985); -}); -$.map(cols,function(col){ -col.formatter1=col.formatter; -col.styler1=col.styler; -col.formatter=col.styler=undefined; -}); -var _986=opts.rowStyler; -opts.rowStyler=function(){ -}; -var _987=$.data(_984,"datagrid").dc.body2; -_987.html(this.renderTable(_984,0,[{}],false)); -_987.find("tbody *").css({height:1,borderColor:"transparent",background:"transparent"}); -var tr=_987.find(".datagrid-row"); -tr.removeClass("datagrid-row").removeAttr("datagrid-row-index"); -tr.find(".datagrid-cell,.datagrid-cell-check").empty(); -$.map(cols,function(col){ -col.formatter=col.formatter1; -col.styler=col.styler1; -col.formatter1=col.styler1=undefined; -}); -opts.rowStyler=_986; -}}; -$.fn.datagrid.defaults=$.extend({},$.fn.panel.defaults,{sharedStyleSheet:false,frozenColumns:undefined,columns:undefined,fitColumns:false,resizeHandle:"right",resizeEdge:5,autoRowHeight:true,toolbar:null,striped:false,method:"post",nowrap:true,idField:null,url:null,data:null,loadMsg:"Processing, please wait ...",emptyMsg:"",rownumbers:false,singleSelect:false,ctrlSelect:false,selectOnCheck:true,checkOnSelect:true,pagination:false,pagePosition:"bottom",pageNumber:1,pageSize:10,pageList:[10,20,30,40,50],queryParams:{},sortName:null,sortOrder:"asc",multiSort:false,remoteSort:true,showHeader:true,showFooter:false,scrollOnSelect:true,scrollbarSize:18,rownumberWidth:30,editorHeight:31,headerEvents:{mouseover:_7b9(true),mouseout:_7b9(false),click:_7bd,dblclick:_7c2,contextmenu:_7c5},rowEvents:{mouseover:_7c7(true),mouseout:_7c7(false),click:_7ce,dblclick:_7d8,contextmenu:_7dc},rowStyler:function(_988,_989){ -},loader:function(_98a,_98b,_98c){ -var opts=$(this).datagrid("options"); -if(!opts.url){ -return false; -} -$.ajax({type:opts.method,url:opts.url,data:_98a,dataType:"json",success:function(data){ -_98b(data); -},error:function(){ -_98c.apply(this,arguments); -}}); -},loadFilter:function(data){ -return data; -},editors:_8f8,finder:{getTr:function(_98d,_98e,type,_98f){ -type=type||"body"; -_98f=_98f||0; -var _990=$.data(_98d,"datagrid"); -var dc=_990.dc; -var opts=_990.options; -if(_98f==0){ -var tr1=opts.finder.getTr(_98d,_98e,type,1); -var tr2=opts.finder.getTr(_98d,_98e,type,2); -return tr1.add(tr2); -}else{ -if(type=="body"){ -var tr=$("#"+_990.rowIdPrefix+"-"+_98f+"-"+_98e); -if(!tr.length){ -tr=(_98f==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index="+_98e+"]"); -} -return tr; -}else{ -if(type=="footer"){ -return (_98f==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index="+_98e+"]"); -}else{ -if(type=="selected"){ -return (_98f==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-selected"); -}else{ -if(type=="highlight"){ -return (_98f==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-over"); -}else{ -if(type=="checked"){ -return (_98f==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-checked"); -}else{ -if(type=="editing"){ -return (_98f==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-editing"); -}else{ -if(type=="last"){ -return (_98f==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]:last"); -}else{ -if(type=="allbody"){ -return (_98f==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]"); -}else{ -if(type=="allfooter"){ -return (_98f==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index]"); -} -} -} -} -} -} -} -} -} -} -},getRow:function(_991,p){ -var _992=(typeof p=="object")?p.attr("datagrid-row-index"):p; -return $.data(_991,"datagrid").data.rows[parseInt(_992)]; -},getRows:function(_993){ -return $(_993).datagrid("getRows"); -}},view:_941,onBeforeLoad:function(_994){ -},onLoadSuccess:function(){ -},onLoadError:function(){ -},onClickRow:function(_995,_996){ -},onDblClickRow:function(_997,_998){ -},onClickCell:function(_999,_99a,_99b){ -},onDblClickCell:function(_99c,_99d,_99e){ -},onBeforeSortColumn:function(sort,_99f){ -},onSortColumn:function(sort,_9a0){ -},onResizeColumn:function(_9a1,_9a2){ -},onBeforeSelect:function(_9a3,_9a4){ -},onSelect:function(_9a5,_9a6){ -},onBeforeUnselect:function(_9a7,_9a8){ -},onUnselect:function(_9a9,_9aa){ -},onSelectAll:function(rows){ -},onUnselectAll:function(rows){ -},onBeforeCheck:function(_9ab,_9ac){ -},onCheck:function(_9ad,_9ae){ -},onBeforeUncheck:function(_9af,_9b0){ -},onUncheck:function(_9b1,_9b2){ -},onCheckAll:function(rows){ -},onUncheckAll:function(rows){ -},onBeforeEdit:function(_9b3,_9b4){ -},onBeginEdit:function(_9b5,_9b6){ -},onEndEdit:function(_9b7,_9b8,_9b9){ -},onAfterEdit:function(_9ba,_9bb,_9bc){ -},onCancelEdit:function(_9bd,_9be){ -},onHeaderContextMenu:function(e,_9bf){ -},onRowContextMenu:function(e,_9c0,_9c1){ -}}); -})(jQuery); -(function($){ -var _9c2; -$(document)._unbind(".propertygrid")._bind("mousedown.propertygrid",function(e){ -var p=$(e.target).closest("div.datagrid-view,div.combo-panel"); -if(p.length){ -return; -} -_9c3(_9c2); -_9c2=undefined; -}); -function _9c4(_9c5){ -var _9c6=$.data(_9c5,"propertygrid"); -var opts=$.data(_9c5,"propertygrid").options; -$(_9c5).datagrid($.extend({},opts,{cls:"propertygrid",view:(opts.showGroup?opts.groupView:opts.view),onBeforeEdit:function(_9c7,row){ -if(opts.onBeforeEdit.call(_9c5,_9c7,row)==false){ -return false; -} -var dg=$(this); -var row=dg.datagrid("getRows")[_9c7]; -var col=dg.datagrid("getColumnOption","value"); -col.editor=row.editor; -},onClickCell:function(_9c8,_9c9,_9ca){ -if(_9c2!=this){ -_9c3(_9c2); -_9c2=this; -} -if(opts.editIndex!=_9c8){ -_9c3(_9c2); -$(this).datagrid("beginEdit",_9c8); -var ed=$(this).datagrid("getEditor",{index:_9c8,field:_9c9}); -if(!ed){ -ed=$(this).datagrid("getEditor",{index:_9c8,field:"value"}); -} -if(ed){ -var t=$(ed.target); -var _9cb=t.data("textbox")?t.textbox("textbox"):t; -_9cb.focus(); -opts.editIndex=_9c8; -} -} -opts.onClickCell.call(_9c5,_9c8,_9c9,_9ca); -},loadFilter:function(data){ -_9c3(this); -return opts.loadFilter.call(this,data); -}})); -}; -function _9c3(_9cc){ -var t=$(_9cc); -if(!t.length){ -return; -} -var opts=$.data(_9cc,"propertygrid").options; -opts.finder.getTr(_9cc,null,"editing").each(function(){ -var _9cd=parseInt($(this).attr("datagrid-row-index")); -if(t.datagrid("validateRow",_9cd)){ -t.datagrid("endEdit",_9cd); -}else{ -t.datagrid("cancelEdit",_9cd); -} -}); -opts.editIndex=undefined; -}; -$.fn.propertygrid=function(_9ce,_9cf){ -if(typeof _9ce=="string"){ -var _9d0=$.fn.propertygrid.methods[_9ce]; -if(_9d0){ -return _9d0(this,_9cf); -}else{ -return this.datagrid(_9ce,_9cf); -} -} -_9ce=_9ce||{}; -return this.each(function(){ -var _9d1=$.data(this,"propertygrid"); -if(_9d1){ -$.extend(_9d1.options,_9ce); -}else{ -var opts=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_9ce); -opts.frozenColumns=$.extend(true,[],opts.frozenColumns); -opts.columns=$.extend(true,[],opts.columns); -$.data(this,"propertygrid",{options:opts}); -} -_9c4(this); -}); -}; -$.fn.propertygrid.methods={options:function(jq){ -return $.data(jq[0],"propertygrid").options; -}}; -$.fn.propertygrid.parseOptions=function(_9d2){ -return $.extend({},$.fn.datagrid.parseOptions(_9d2),$.parser.parseOptions(_9d2,[{showGroup:"boolean"}])); -}; -var _9d3=$.extend({},$.fn.datagrid.defaults.view,{render:function(_9d4,_9d5,_9d6){ -var _9d7=[]; -var _9d8=this.groups; -for(var i=0;i<_9d8.length;i++){ -_9d7.push(this.renderGroup.call(this,_9d4,i,_9d8[i],_9d6)); -} -$(_9d5).html(_9d7.join("")); -},renderGroup:function(_9d9,_9da,_9db,_9dc){ -var _9dd=$.data(_9d9,"datagrid"); -var opts=_9dd.options; -var _9de=$(_9d9).datagrid("getColumnFields",_9dc); -var _9df=opts.frozenColumns&&opts.frozenColumns.length; -if(_9dc){ -if(!(opts.rownumbers||_9df)){ -return ""; -} -} -var _9e0=[]; -var css=opts.groupStyler.call(_9d9,_9db.value,_9db.rows); -var cs=_9e1(css,"datagrid-group"); -_9e0.push("
                                              "); -if((_9dc&&(opts.rownumbers||opts.frozenColumns.length))||(!_9dc&&!(opts.rownumbers||opts.frozenColumns.length))){ -_9e0.push(""); -_9e0.push(" "); -_9e0.push(""); -} -if((_9dc&&_9df)||(!_9dc)){ -_9e0.push(""); -_9e0.push(opts.groupFormatter.call(_9d9,_9db.value,_9db.rows)); -_9e0.push(""); -} -_9e0.push("
                                              "); -_9e0.push(""); -var _9e2=_9db.startIndex; -for(var j=0;j<_9db.rows.length;j++){ -var css=opts.rowStyler?opts.rowStyler.call(_9d9,_9e2,_9db.rows[j]):""; -var _9e3=""; -var _9e4=""; -if(typeof css=="string"){ -_9e4=css; -}else{ -if(css){ -_9e3=css["class"]||""; -_9e4=css["style"]||""; -} -} -var cls="class=\"datagrid-row "+(_9e2%2&&opts.striped?"datagrid-row-alt ":" ")+_9e3+"\""; -var _9e5=_9e4?"style=\""+_9e4+"\"":""; -var _9e6=_9dd.rowIdPrefix+"-"+(_9dc?1:2)+"-"+_9e2; -_9e0.push(""); -_9e0.push(this.renderRow.call(this,_9d9,_9de,_9dc,_9e2,_9db.rows[j])); -_9e0.push(""); -_9e2++; -} -_9e0.push("
                                              "); -return _9e0.join(""); -function _9e1(css,cls){ -var _9e7=""; -var _9e8=""; -if(typeof css=="string"){ -_9e8=css; -}else{ -if(css){ -_9e7=css["class"]||""; -_9e8=css["style"]||""; -} -} -return "class=\""+cls+(_9e7?" "+_9e7:"")+"\" "+"style=\""+_9e8+"\""; -}; -},bindEvents:function(_9e9){ -var _9ea=$.data(_9e9,"datagrid"); -var dc=_9ea.dc; -var body=dc.body1.add(dc.body2); -var _9eb=($.data(body[0],"events")||$._data(body[0],"events")).click[0].handler; -body._unbind("click")._bind("click",function(e){ -var tt=$(e.target); -var _9ec=tt.closest("span.datagrid-row-expander"); -if(_9ec.length){ -var _9ed=_9ec.closest("div.datagrid-group").attr("group-index"); -if(_9ec.hasClass("datagrid-row-collapse")){ -$(_9e9).datagrid("collapseGroup",_9ed); -}else{ -$(_9e9).datagrid("expandGroup",_9ed); -} -}else{ -_9eb(e); -} -e.stopPropagation(); -}); -},onBeforeRender:function(_9ee,rows){ -var _9ef=$.data(_9ee,"datagrid"); -var opts=_9ef.options; -_9f0(); -var _9f1=[]; -for(var i=0;i"+".datagrid-group{height:"+opts.groupHeight+"px;overflow:hidden;font-weight:bold;border-bottom:1px solid #ccc;white-space:nowrap;word-break:normal;}"+".datagrid-group-title,.datagrid-group-expander{display:inline-block;vertical-align:bottom;height:100%;line-height:"+opts.groupHeight+"px;padding:0 4px;}"+".datagrid-group-title{position:relative;}"+".datagrid-group-expander{width:"+opts.expanderWidth+"px;text-align:center;padding:0}"+".datagrid-group-expander .datagrid-row-expander{margin:"+Math.floor((opts.groupHeight-16)/2)+"px 0;display:inline-block;width:16px;height:16px;cursor:pointer}"+""); -} -}; -},onAfterRender:function(_9f8){ -$.fn.datagrid.defaults.view.onAfterRender.call(this,_9f8); -var view=this; -var _9f9=$.data(_9f8,"datagrid"); -var opts=_9f9.options; -if(!_9f9.onResizeColumn){ -_9f9.onResizeColumn=opts.onResizeColumn; -} -if(!_9f9.onResize){ -_9f9.onResize=opts.onResize; -} -opts.onResizeColumn=function(_9fa,_9fb){ -view.resizeGroup(_9f8); -_9f9.onResizeColumn.call(_9f8,_9fa,_9fb); -}; -opts.onResize=function(_9fc,_9fd){ -view.resizeGroup(_9f8); -_9f9.onResize.call($(_9f8).datagrid("getPanel")[0],_9fc,_9fd); -}; -view.resizeGroup(_9f8); -}}); -$.extend($.fn.datagrid.methods,{groups:function(jq){ -return jq.datagrid("options").view.groups; -},expandGroup:function(jq,_9fe){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -var view=$.data(this,"datagrid").dc.view; -var _9ff=view.find(_9fe!=undefined?"div.datagrid-group[group-index=\""+_9fe+"\"]":"div.datagrid-group"); -var _a00=_9ff.find("span.datagrid-row-expander"); -if(_a00.hasClass("datagrid-row-expand")){ -_a00.removeClass("datagrid-row-expand").addClass("datagrid-row-collapse"); -_9ff.next("table").show(); -} -$(this).datagrid("fixRowHeight"); -if(opts.onExpandGroup){ -opts.onExpandGroup.call(this,_9fe); -} -}); -},collapseGroup:function(jq,_a01){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -var view=$.data(this,"datagrid").dc.view; -var _a02=view.find(_a01!=undefined?"div.datagrid-group[group-index=\""+_a01+"\"]":"div.datagrid-group"); -var _a03=_a02.find("span.datagrid-row-expander"); -if(_a03.hasClass("datagrid-row-collapse")){ -_a03.removeClass("datagrid-row-collapse").addClass("datagrid-row-expand"); -_a02.next("table").hide(); -} -$(this).datagrid("fixRowHeight"); -if(opts.onCollapseGroup){ -opts.onCollapseGroup.call(this,_a01); -} -}); -},scrollToGroup:function(jq,_a04){ -return jq.each(function(){ -var _a05=$.data(this,"datagrid"); -var dc=_a05.dc; -var grow=dc.body2.children("div.datagrid-group[group-index=\""+_a04+"\"]"); -if(grow.length){ -var _a06=grow.outerHeight(); -var _a07=dc.view2.children("div.datagrid-header")._outerHeight(); -var _a08=dc.body2.outerHeight(true)-dc.body2.outerHeight(); -var top=grow.position().top-_a07-_a08; -if(top<0){ -dc.body2.scrollTop(dc.body2.scrollTop()+top); -}else{ -if(top+_a06>dc.body2.height()-18){ -dc.body2.scrollTop(dc.body2.scrollTop()+top+_a06-dc.body2.height()+18); -} -} -} -}); -}}); -$.extend(_9d3,{refreshGroupTitle:function(_a09,_a0a){ -var _a0b=$.data(_a09,"datagrid"); -var opts=_a0b.options; -var dc=_a0b.dc; -var _a0c=this.groups[_a0a]; -var span=dc.body1.add(dc.body2).children("div.datagrid-group[group-index="+_a0a+"]").find("span.datagrid-group-title"); -span.html(opts.groupFormatter.call(_a09,_a0c.value,_a0c.rows)); -},resizeGroup:function(_a0d,_a0e){ -var _a0f=$.data(_a0d,"datagrid"); -var dc=_a0f.dc; -var ht=dc.header2.find("table"); -var fr=ht.find("tr.datagrid-filter-row").hide(); -var ww=dc.body2.children("table.datagrid-btable:first").width(); -if(_a0e==undefined){ -var _a10=dc.body2.children("div.datagrid-group"); -}else{ -var _a10=dc.body2.children("div.datagrid-group[group-index="+_a0e+"]"); -} -_a10._outerWidth(ww); -var opts=_a0f.options; -if(opts.frozenColumns&&opts.frozenColumns.length){ -var _a11=dc.view1.width()-opts.expanderWidth; -var _a12=dc.view1.css("direction").toLowerCase()=="rtl"; -_a10.find(".datagrid-group-title").css(_a12?"right":"left",-_a11+"px"); -} -if(fr.length){ -if(opts.showFilterBar){ -fr.show(); -} -} -},insertRow:function(_a13,_a14,row){ -var _a15=$.data(_a13,"datagrid"); -var opts=_a15.options; -var dc=_a15.dc; -var _a16=null; -var _a17; -if(!_a15.data.rows.length){ -$(_a13).datagrid("loadData",[row]); -return; -} -for(var i=0;i_a16.startIndex+_a16.rows.length){ -_a14=_a16.startIndex+_a16.rows.length; -} -} -$.fn.datagrid.defaults.view.insertRow.call(this,_a13,_a14,row); -if(_a14>=_a16.startIndex+_a16.rows.length){ -_a18(_a14,true); -_a18(_a14,false); -} -_a16.rows.splice(_a14-_a16.startIndex,0,row); -}else{ -_a16={value:row[opts.groupField],rows:[row],startIndex:_a15.data.rows.length}; -_a17=this.groups.length; -dc.body1.append(this.renderGroup.call(this,_a13,_a17,_a16,true)); -dc.body2.append(this.renderGroup.call(this,_a13,_a17,_a16,false)); -this.groups.push(_a16); -_a15.data.rows.push(row); -} -this.setGroupIndex(_a13); -this.refreshGroupTitle(_a13,_a17); -this.resizeGroup(_a13); -function _a18(_a19,_a1a){ -var _a1b=_a1a?1:2; -var _a1c=opts.finder.getTr(_a13,_a19-1,"body",_a1b); -var tr=opts.finder.getTr(_a13,_a19,"body",_a1b); -tr.insertAfter(_a1c); -}; -},updateRow:function(_a1d,_a1e,row){ -var opts=$.data(_a1d,"datagrid").options; -$.fn.datagrid.defaults.view.updateRow.call(this,_a1d,_a1e,row); -var tb=opts.finder.getTr(_a1d,_a1e,"body",2).closest("table.datagrid-btable"); -var _a1f=parseInt(tb.prev().attr("group-index")); -this.refreshGroupTitle(_a1d,_a1f); -},deleteRow:function(_a20,_a21){ -var _a22=$.data(_a20,"datagrid"); -var opts=_a22.options; -var dc=_a22.dc; -var body=dc.body1.add(dc.body2); -var tb=opts.finder.getTr(_a20,_a21,"body",2).closest("table.datagrid-btable"); -var _a23=parseInt(tb.prev().attr("group-index")); -$.fn.datagrid.defaults.view.deleteRow.call(this,_a20,_a21); -var _a24=this.groups[_a23]; -if(_a24.rows.length>1){ -_a24.rows.splice(_a21-_a24.startIndex,1); -this.refreshGroupTitle(_a20,_a23); -}else{ -body.children("div.datagrid-group[group-index="+_a23+"]").remove(); -for(var i=_a23+1;i").insertBefore(tr.find(".tree-title")); -} -if(row.checkState=="checked"){ -_a4c(_a60,_a61,true,true); -}else{ -if(row.checkState=="unchecked"){ -_a4c(_a60,_a61,false,true); -}else{ -var flag=_a5e(row); -if(flag===0){ -_a4c(_a60,_a61,false,true); -}else{ -if(flag===1){ -_a4c(_a60,_a61,true,true); -} -} -} -} -}else{ -ck.remove(); -row.checkState=undefined; -row.checked=undefined; -_a55(_a60,row); -} -}; -function _a62(_a63,_a64){ -var opts=$.data(_a63,"treegrid").options; -var tr1=opts.finder.getTr(_a63,_a64,"body",1); -var tr2=opts.finder.getTr(_a63,_a64,"body",2); -var _a65=$(_a63).datagrid("getColumnFields",true).length+(opts.rownumbers?1:0); -var _a66=$(_a63).datagrid("getColumnFields",false).length; -_a67(tr1,_a65); -_a67(tr2,_a66); -function _a67(tr,_a68){ -$(""+""+"
                                              "+""+"").insertAfter(tr); -}; -}; -function _a69(_a6a,_a6b,data,_a6c,_a6d){ -var _a6e=$.data(_a6a,"treegrid"); -var opts=_a6e.options; -var dc=_a6e.dc; -data=opts.loadFilter.call(_a6a,data,_a6b); -var node=find(_a6a,_a6b); -if(node){ -var _a6f=opts.finder.getTr(_a6a,_a6b,"body",1); -var _a70=opts.finder.getTr(_a6a,_a6b,"body",2); -var cc1=_a6f.next("tr.treegrid-tr-tree").children("td").children("div"); -var cc2=_a70.next("tr.treegrid-tr-tree").children("td").children("div"); -if(!_a6c){ -node.children=[]; -} -}else{ -var cc1=dc.body1; -var cc2=dc.body2; -if(!_a6c){ -_a6e.data=[]; -} -} -if(!_a6c){ -cc1.empty(); -cc2.empty(); -} -if(opts.view.onBeforeRender){ -opts.view.onBeforeRender.call(opts.view,_a6a,_a6b,data); -} -opts.view.render.call(opts.view,_a6a,cc1,true); -opts.view.render.call(opts.view,_a6a,cc2,false); -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,_a6a,dc.footer1,true); -opts.view.renderFooter.call(opts.view,_a6a,dc.footer2,false); -} -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,_a6a); -} -if(!_a6b&&opts.pagination){ -var _a71=$.data(_a6a,"treegrid").total; -var _a72=$(_a6a).datagrid("getPager"); -var _a73=_a72.pagination("options"); -if(_a73.total!=data.total){ -_a72.pagination("refresh",{pageNumber:opts.pageNumber,total:data.total}); -if(opts.pageNumber!=_a73.pageNumber&&_a73.pageNumber>0){ -opts.pageNumber=_a73.pageNumber; -_a3a(_a6a); -} -} -} -_a3b(_a6a); -_a43(_a6a); -$(_a6a).treegrid("showLines"); -$(_a6a).treegrid("setSelectionState"); -$(_a6a).treegrid("autoSizeColumn"); -if(!_a6d){ -opts.onLoadSuccess.call(_a6a,node,data); -} -}; -function _a3a(_a74,_a75,_a76,_a77,_a78){ -var opts=$.data(_a74,"treegrid").options; -var body=$(_a74).datagrid("getPanel").find("div.datagrid-body"); -if(_a75==undefined&&opts.queryParams){ -opts.queryParams.id=undefined; -} -if(_a76){ -opts.queryParams=_a76; -} -var _a79=$.extend({},opts.queryParams); -if(opts.pagination){ -$.extend(_a79,{page:opts.pageNumber,rows:opts.pageSize}); -} -if(opts.sortName){ -$.extend(_a79,{sort:opts.sortName,order:opts.sortOrder}); -} -var row=find(_a74,_a75); -if(opts.onBeforeLoad.call(_a74,row,_a79)==false){ -return; -} -var _a7a=body.find("tr[node-id=\""+_a75+"\"] span.tree-folder"); -_a7a.addClass("tree-loading"); -$(_a74).treegrid("loading"); -var _a7b=opts.loader.call(_a74,_a79,function(data){ -_a7a.removeClass("tree-loading"); -$(_a74).treegrid("loaded"); -_a69(_a74,_a75,data,_a77); -if(_a78){ -_a78(); -} -},function(){ -_a7a.removeClass("tree-loading"); -$(_a74).treegrid("loaded"); -opts.onLoadError.apply(_a74,arguments); -if(_a78){ -_a78(); -} -}); -if(_a7b==false){ -_a7a.removeClass("tree-loading"); -$(_a74).treegrid("loaded"); -} -}; -function _a7c(_a7d){ -var _a7e=_a7f(_a7d); -return _a7e.length?_a7e[0]:null; -}; -function _a7f(_a80){ -return $.data(_a80,"treegrid").data; -}; -function _a5d(_a81,_a82){ -var row=find(_a81,_a82); -if(row._parentId){ -return find(_a81,row._parentId); -}else{ -return null; -} -}; -function _a3f(_a83,_a84){ -var data=$.data(_a83,"treegrid").data; -if(_a84){ -var _a85=find(_a83,_a84); -data=_a85?(_a85.children||[]):[]; -} -var _a86=[]; -$.easyui.forEach(data,true,function(node){ -_a86.push(node); -}); -return _a86; -}; -function _a87(_a88,_a89){ -var opts=$.data(_a88,"treegrid").options; -var tr=opts.finder.getTr(_a88,_a89); -var node=tr.children("td[field=\""+opts.treeField+"\"]"); -return node.find("span.tree-indent,span.tree-hit").length; -}; -function find(_a8a,_a8b){ -var _a8c=$.data(_a8a,"treegrid"); -var opts=_a8c.options; -var _a8d=null; -$.easyui.forEach(_a8c.data,true,function(node){ -if(node[opts.idField]==_a8b){ -_a8d=node; -return false; -} -}); -return _a8d; -}; -function _a8e(_a8f,_a90){ -var opts=$.data(_a8f,"treegrid").options; -var row=find(_a8f,_a90); -var tr=opts.finder.getTr(_a8f,_a90); -var hit=tr.find("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-collapsed")){ -return; -} -if(opts.onBeforeCollapse.call(_a8f,row)==false){ -return; -} -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -hit.next().removeClass("tree-folder-open"); -row.state="closed"; -tr=tr.next("tr.treegrid-tr-tree"); -var cc=tr.children("td").children("div"); -if(opts.animate){ -cc.slideUp("normal",function(){ -$(_a8f).treegrid("autoSizeColumn"); -_a3b(_a8f,_a90); -opts.onCollapse.call(_a8f,row); -}); -}else{ -cc.hide(); -$(_a8f).treegrid("autoSizeColumn"); -_a3b(_a8f,_a90); -opts.onCollapse.call(_a8f,row); -} -}; -function _a91(_a92,_a93){ -var opts=$.data(_a92,"treegrid").options; -var tr=opts.finder.getTr(_a92,_a93); -var hit=tr.find("span.tree-hit"); -var row=find(_a92,_a93); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -return; -} -if(opts.onBeforeExpand.call(_a92,row)==false){ -return; -} -hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); -hit.next().addClass("tree-folder-open"); -var _a94=tr.next("tr.treegrid-tr-tree"); -if(_a94.length){ -var cc=_a94.children("td").children("div"); -_a95(cc); -}else{ -_a62(_a92,row[opts.idField]); -var _a94=tr.next("tr.treegrid-tr-tree"); -var cc=_a94.children("td").children("div"); -cc.hide(); -var _a96=$.extend({},opts.queryParams||{}); -_a96.id=row[opts.idField]; -_a3a(_a92,row[opts.idField],_a96,true,function(){ -if(cc.is(":empty")){ -_a94.remove(); -}else{ -_a95(cc); -} -}); -} -function _a95(cc){ -row.state="open"; -if(opts.animate){ -cc.slideDown("normal",function(){ -$(_a92).treegrid("autoSizeColumn"); -_a3b(_a92,_a93); -opts.onExpand.call(_a92,row); -}); -}else{ -cc.show(); -$(_a92).treegrid("autoSizeColumn"); -_a3b(_a92,_a93); -opts.onExpand.call(_a92,row); -} -}; -}; -function _a4b(_a97,_a98){ -var opts=$.data(_a97,"treegrid").options; -var tr=opts.finder.getTr(_a97,_a98); -var hit=tr.find("span.tree-hit"); -if(hit.hasClass("tree-expanded")){ -_a8e(_a97,_a98); -}else{ -_a91(_a97,_a98); -} -}; -function _a99(_a9a,_a9b){ -var opts=$.data(_a9a,"treegrid").options; -var _a9c=_a3f(_a9a,_a9b); -if(_a9b){ -_a9c.unshift(find(_a9a,_a9b)); -} -for(var i=0;i<_a9c.length;i++){ -_a8e(_a9a,_a9c[i][opts.idField]); -} -}; -function _a9d(_a9e,_a9f){ -var opts=$.data(_a9e,"treegrid").options; -var _aa0=_a3f(_a9e,_a9f); -if(_a9f){ -_aa0.unshift(find(_a9e,_a9f)); -} -for(var i=0;i<_aa0.length;i++){ -_a91(_a9e,_aa0[i][opts.idField]); -} -}; -function _aa1(_aa2,_aa3){ -var opts=$.data(_aa2,"treegrid").options; -var ids=[]; -var p=_a5d(_aa2,_aa3); -while(p){ -var id=p[opts.idField]; -ids.unshift(id); -p=_a5d(_aa2,id); -} -for(var i=0;i").insertBefore(_aa8); -if(hit.prev().length){ -hit.prev().remove(); -} -} -} -_a69(_aa5,_aa6.parent,_aa6.data,_aa7.data.length>0,true); -}; -function _aa9(_aaa,_aab){ -var ref=_aab.before||_aab.after; -var opts=$.data(_aaa,"treegrid").options; -var _aac=_a5d(_aaa,ref); -_aa4(_aaa,{parent:(_aac?_aac[opts.idField]:null),data:[_aab.data]}); -var _aad=_aac?_aac.children:$(_aaa).treegrid("getRoots"); -for(var i=0;i<_aad.length;i++){ -if(_aad[i][opts.idField]==ref){ -var _aae=_aad[_aad.length-1]; -_aad.splice(_aab.before?i:(i+1),0,_aae); -_aad.splice(_aad.length-1,1); -break; -} -} -_aaf(true); -_aaf(false); -_a43(_aaa); -$(_aaa).treegrid("showLines"); -function _aaf(_ab0){ -var _ab1=_ab0?1:2; -var tr=opts.finder.getTr(_aaa,_aab.data[opts.idField],"body",_ab1); -var _ab2=tr.closest("table.datagrid-btable"); -tr=tr.parent().children(); -var dest=opts.finder.getTr(_aaa,ref,"body",_ab1); -if(_aab.before){ -tr.insertBefore(dest); -}else{ -var sub=dest.next("tr.treegrid-tr-tree"); -tr.insertAfter(sub.length?sub:dest); -} -_ab2.remove(); -}; -}; -function _ab3(_ab4,_ab5){ -var _ab6=$.data(_ab4,"treegrid"); -var opts=_ab6.options; -var prow=_a5d(_ab4,_ab5); -$(_ab4).datagrid("deleteRow",_ab5); -$.easyui.removeArrayItem(_ab6.checkedRows,opts.idField,_ab5); -_a43(_ab4); -if(prow){ -_a5f(_ab4,prow[opts.idField]); -} -_ab6.total-=1; -$(_ab4).datagrid("getPager").pagination("refresh",{total:_ab6.total}); -$(_ab4).treegrid("showLines"); -}; -function _ab7(_ab8){ -var t=$(_ab8); -var opts=t.treegrid("options"); -if(opts.lines){ -t.treegrid("getPanel").addClass("tree-lines"); -}else{ -t.treegrid("getPanel").removeClass("tree-lines"); -return; -} -t.treegrid("getPanel").find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); -t.treegrid("getPanel").find("div.datagrid-cell").removeClass("tree-node-last tree-root-first tree-root-one"); -var _ab9=t.treegrid("getRoots"); -if(_ab9.length>1){ -_aba(_ab9[0]).addClass("tree-root-first"); -}else{ -if(_ab9.length==1){ -_aba(_ab9[0]).addClass("tree-root-one"); -} -} -_abb(_ab9); -_abc(_ab9); -function _abb(_abd){ -$.map(_abd,function(node){ -if(node.children&&node.children.length){ -_abb(node.children); -}else{ -var cell=_aba(node); -cell.find(".tree-icon").prev().addClass("tree-join"); -} -}); -if(_abd.length){ -var cell=_aba(_abd[_abd.length-1]); -cell.addClass("tree-node-last"); -cell.find(".tree-join").removeClass("tree-join").addClass("tree-joinbottom"); -} -}; -function _abc(_abe){ -$.map(_abe,function(node){ -if(node.children&&node.children.length){ -_abc(node.children); -} -}); -for(var i=0;i<_abe.length-1;i++){ -var node=_abe[i]; -var _abf=t.treegrid("getLevel",node[opts.idField]); -var tr=opts.finder.getTr(_ab8,node[opts.idField]); -var cc=tr.next().find("tr.datagrid-row td[field=\""+opts.treeField+"\"] div.datagrid-cell"); -cc.find("span:eq("+(_abf-1)+")").addClass("tree-line"); -} -}; -function _aba(node){ -var tr=opts.finder.getTr(_ab8,node[opts.idField]); -var cell=tr.find("td[field=\""+opts.treeField+"\"] div.datagrid-cell"); -return cell; -}; -}; -$.fn.treegrid=function(_ac0,_ac1){ -if(typeof _ac0=="string"){ -var _ac2=$.fn.treegrid.methods[_ac0]; -if(_ac2){ -return _ac2(this,_ac1); -}else{ -return this.datagrid(_ac0,_ac1); -} -} -_ac0=_ac0||{}; -return this.each(function(){ -var _ac3=$.data(this,"treegrid"); -if(_ac3){ -$.extend(_ac3.options,_ac0); -}else{ -_ac3=$.data(this,"treegrid",{options:$.extend({},$.fn.treegrid.defaults,$.fn.treegrid.parseOptions(this),_ac0),data:[],checkedRows:[],tmpIds:[]}); -} -_a2a(this); -if(_ac3.options.data){ -$(this).treegrid("loadData",_ac3.options.data); -} -_a3a(this); -}); -}; -$.fn.treegrid.methods={options:function(jq){ -return $.data(jq[0],"treegrid").options; -},resize:function(jq,_ac4){ -return jq.each(function(){ -$(this).datagrid("resize",_ac4); -}); -},fixRowHeight:function(jq,_ac5){ -return jq.each(function(){ -_a3b(this,_ac5); -}); -},loadData:function(jq,data){ -return jq.each(function(){ -_a69(this,data.parent,data); -}); -},load:function(jq,_ac6){ -return jq.each(function(){ -$(this).treegrid("options").pageNumber=1; -$(this).treegrid("getPager").pagination({pageNumber:1}); -$(this).treegrid("reload",_ac6); -}); -},reload:function(jq,id){ -return jq.each(function(){ -var opts=$(this).treegrid("options"); -var _ac7={}; -if(typeof id=="object"){ -_ac7=id; -}else{ -_ac7=$.extend({},opts.queryParams); -_ac7.id=id; -} -if(_ac7.id){ -var node=$(this).treegrid("find",_ac7.id); -if(node.children){ -node.children.splice(0,node.children.length); -} -opts.queryParams=_ac7; -var tr=opts.finder.getTr(this,_ac7.id); -tr.next("tr.treegrid-tr-tree").remove(); -tr.find("span.tree-hit").removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -_a91(this,_ac7.id); -}else{ -_a3a(this,null,_ac7); -} -}); -},reloadFooter:function(jq,_ac8){ -return jq.each(function(){ -var opts=$.data(this,"treegrid").options; -var dc=$.data(this,"datagrid").dc; -if(_ac8){ -$.data(this,"treegrid").footer=_ac8; -} -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,this,dc.footer1,true); -opts.view.renderFooter.call(opts.view,this,dc.footer2,false); -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,this); -} -$(this).treegrid("fixRowHeight"); -} -}); -},getData:function(jq){ -return $.data(jq[0],"treegrid").data; -},getFooterRows:function(jq){ -return $.data(jq[0],"treegrid").footer; -},getRoot:function(jq){ -return _a7c(jq[0]); -},getRoots:function(jq){ -return _a7f(jq[0]); -},getParent:function(jq,id){ -return _a5d(jq[0],id); -},getChildren:function(jq,id){ -return _a3f(jq[0],id); -},getLevel:function(jq,id){ -return _a87(jq[0],id); -},find:function(jq,id){ -return find(jq[0],id); -},isLeaf:function(jq,id){ -var opts=$.data(jq[0],"treegrid").options; -var tr=opts.finder.getTr(jq[0],id); -var hit=tr.find("span.tree-hit"); -return hit.length==0; -},select:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("selectRow",id); -}); -},unselect:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("unselectRow",id); -}); -},collapse:function(jq,id){ -return jq.each(function(){ -_a8e(this,id); -}); -},expand:function(jq,id){ -return jq.each(function(){ -_a91(this,id); -}); -},toggle:function(jq,id){ -return jq.each(function(){ -_a4b(this,id); -}); -},collapseAll:function(jq,id){ -return jq.each(function(){ -_a99(this,id); -}); -},expandAll:function(jq,id){ -return jq.each(function(){ -_a9d(this,id); -}); -},expandTo:function(jq,id){ -return jq.each(function(){ -_aa1(this,id); -}); -},append:function(jq,_ac9){ -return jq.each(function(){ -_aa4(this,_ac9); -}); -},insert:function(jq,_aca){ -return jq.each(function(){ -_aa9(this,_aca); -}); -},remove:function(jq,id){ -return jq.each(function(){ -_ab3(this,id); -}); -},pop:function(jq,id){ -var row=jq.treegrid("find",id); -jq.treegrid("remove",id); -return row; -},refresh:function(jq,id){ -return jq.each(function(){ -var opts=$.data(this,"treegrid").options; -opts.view.refreshRow.call(opts.view,this,id); -}); -},update:function(jq,_acb){ -return jq.each(function(){ -var opts=$.data(this,"treegrid").options; -var row=_acb.row; -opts.view.updateRow.call(opts.view,this,_acb.id,row); -if(row.checked!=undefined){ -row=find(this,_acb.id); -$.extend(row,{checkState:row.checked?"checked":(row.checked===false?"unchecked":undefined)}); -_a5f(this,_acb.id); -} -}); -},beginEdit:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("beginEdit",id); -$(this).treegrid("fixRowHeight",id); -}); -},endEdit:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("endEdit",id); -}); -},cancelEdit:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("cancelEdit",id); -}); -},showLines:function(jq){ -return jq.each(function(){ -_ab7(this); -}); -},setSelectionState:function(jq){ -return jq.each(function(){ -$(this).datagrid("setSelectionState"); -var _acc=$(this).data("treegrid"); -for(var i=0;i<_acc.tmpIds.length;i++){ -_a4c(this,_acc.tmpIds[i],true,true); -} -_acc.tmpIds=[]; -}); -},getCheckedNodes:function(jq,_acd){ -_acd=_acd||"checked"; -var rows=[]; -$.easyui.forEach(jq.data("treegrid").checkedRows,false,function(row){ -if(row.checkState==_acd){ -rows.push(row); -} -}); -return rows; -},checkNode:function(jq,id){ -return jq.each(function(){ -_a4c(this,id,true); -}); -},uncheckNode:function(jq,id){ -return jq.each(function(){ -_a4c(this,id,false); -}); -},clearChecked:function(jq){ -return jq.each(function(){ -var _ace=this; -var opts=$(_ace).treegrid("options"); -$(_ace).datagrid("clearChecked"); -$.map($(_ace).treegrid("getCheckedNodes"),function(row){ -_a4c(_ace,row[opts.idField],false,true); -}); -}); -}}; -$.fn.treegrid.parseOptions=function(_acf){ -return $.extend({},$.fn.datagrid.parseOptions(_acf),$.parser.parseOptions(_acf,["treeField",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean"}])); -}; -var _ad0=$.extend({},$.fn.datagrid.defaults.view,{render:function(_ad1,_ad2,_ad3){ -var opts=$.data(_ad1,"treegrid").options; -var _ad4=$(_ad1).datagrid("getColumnFields",_ad3); -var _ad5=$.data(_ad1,"datagrid").rowIdPrefix; -if(_ad3){ -if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ -return; -} -} -var view=this; -if(this.treeNodes&&this.treeNodes.length){ -var _ad6=_ad7.call(this,_ad3,this.treeLevel,this.treeNodes); -$(_ad2).append(_ad6.join("")); -} -function _ad7(_ad8,_ad9,_ada){ -var _adb=$(_ad1).treegrid("getParent",_ada[0][opts.idField]); -var _adc=(_adb?_adb.children.length:$(_ad1).treegrid("getRoots").length)-_ada.length; -var _add=[""]; -for(var i=0;i<_ada.length;i++){ -var row=_ada[i]; -if(row.state!="open"&&row.state!="closed"){ -row.state="open"; -} -var css=opts.rowStyler?opts.rowStyler.call(_ad1,row):""; -var cs=this.getStyleValue(css); -var cls="class=\"datagrid-row "+(_adc++%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c+"\""; -var _ade=cs.s?"style=\""+cs.s+"\"":""; -var _adf=_ad5+"-"+(_ad8?1:2)+"-"+row[opts.idField]; -_add.push(""); -_add=_add.concat(view.renderRow.call(view,_ad1,_ad4,_ad8,_ad9,row)); -_add.push(""); -if(row.children&&row.children.length){ -var tt=_ad7.call(this,_ad8,_ad9+1,row.children); -var v=row.state=="closed"?"none":"block"; -_add.push(""); -} -} -_add.push("
                                              "); -_add=_add.concat(tt); -_add.push("
                                              "); -return _add; -}; -},renderFooter:function(_ae0,_ae1,_ae2){ -var opts=$.data(_ae0,"treegrid").options; -var rows=$.data(_ae0,"treegrid").footer||[]; -var _ae3=$(_ae0).datagrid("getColumnFields",_ae2); -var _ae4=[""]; -for(var i=0;i"); -_ae4.push(this.renderRow.call(this,_ae0,_ae3,_ae2,0,row)); -_ae4.push(""); -} -_ae4.push("
                                              "); -$(_ae1).html(_ae4.join("")); -},renderRow:function(_ae5,_ae6,_ae7,_ae8,row){ -var _ae9=$.data(_ae5,"treegrid"); -var opts=_ae9.options; -var cc=[]; -if(_ae7&&opts.rownumbers){ -cc.push("
                                              0
                                              "); -} -for(var i=0;i<_ae6.length;i++){ -var _aea=_ae6[i]; -var col=$(_ae5).datagrid("getColumnOption",_aea); -if(col){ -var css=col.styler?(col.styler(row[_aea],row)||""):""; -var cs=this.getStyleValue(css); -var cls=cs.c?"class=\""+cs.c+"\"":""; -var _aeb=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); -cc.push(""); -var _aeb=""; -if(!col.checkbox){ -if(col.align){ -_aeb+="text-align:"+col.align+";"; -} -if(!opts.nowrap){ -_aeb+="white-space:normal;height:auto;"; -}else{ -if(opts.autoRowHeight){ -_aeb+="height:auto;"; -} -} -} -cc.push("
                                              "); -if(col.checkbox){ -if(row.checked){ -cc.push(""); -}else{ -var val=null; -if(col.formatter){ -val=col.formatter(row[_aea],row); -}else{ -val=row[_aea]; -} -if(_aea==opts.treeField){ -for(var j=0;j<_ae8;j++){ -cc.push(""); -} -if(row.state=="closed"){ -cc.push(""); -cc.push(""); -}else{ -if(row.children&&row.children.length){ -cc.push(""); -cc.push(""); -}else{ -cc.push(""); -cc.push(""); -} -} -if(this.hasCheckbox(_ae5,row)){ -var flag=0; -var crow=$.easyui.getArrayItem(_ae9.checkedRows,opts.idField,row[opts.idField]); -if(crow){ -flag=crow.checkState=="checked"?1:2; -row.checkState=crow.checkState; -row.checked=crow.checked; -$.easyui.addArrayItem(_ae9.checkedRows,opts.idField,row); -}else{ -var prow=$.easyui.getArrayItem(_ae9.checkedRows,opts.idField,row._parentId); -if(prow&&prow.checkState=="checked"&&opts.cascadeCheck){ -flag=1; -row.checked=true; -$.easyui.addArrayItem(_ae9.checkedRows,opts.idField,row); -}else{ -if(row.checked){ -$.easyui.addArrayItem(_ae9.tmpIds,row[opts.idField]); -} -} -row.checkState=flag?"checked":"unchecked"; -} -cc.push(""); -}else{ -row.checkState=undefined; -row.checked=undefined; -} -cc.push(""+val+""); -}else{ -cc.push(val); -} -} -cc.push("
                                              "); -cc.push(""); -} -} -return cc.join(""); -},hasCheckbox:function(_aec,row){ -var opts=$.data(_aec,"treegrid").options; -if(opts.checkbox){ -if($.isFunction(opts.checkbox)){ -if(opts.checkbox.call(_aec,row)){ -return true; -}else{ -return false; -} -}else{ -if(opts.onlyLeafCheck){ -if(row.state=="open"&&!(row.children&&row.children.length)){ -return true; -} -}else{ -return true; -} -} -} -return false; -},refreshRow:function(_aed,id){ -this.updateRow.call(this,_aed,id,{}); -},updateRow:function(_aee,id,row){ -var opts=$.data(_aee,"treegrid").options; -var _aef=$(_aee).treegrid("find",id); -$.extend(_aef,row); -var _af0=$(_aee).treegrid("getLevel",id)-1; -var _af1=opts.rowStyler?opts.rowStyler.call(_aee,_aef):""; -var _af2=$.data(_aee,"datagrid").rowIdPrefix; -var _af3=_aef[opts.idField]; -function _af4(_af5){ -var _af6=$(_aee).treegrid("getColumnFields",_af5); -var tr=opts.finder.getTr(_aee,id,"body",(_af5?1:2)); -var _af7=tr.find("div.datagrid-cell-rownumber").html(); -var _af8=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); -tr.html(this.renderRow(_aee,_af6,_af5,_af0,_aef)); -tr.attr("style",_af1||""); -tr.find("div.datagrid-cell-rownumber").html(_af7); -if(_af8){ -tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); -} -if(_af3!=id){ -tr.attr("id",_af2+"-"+(_af5?1:2)+"-"+_af3); -tr.attr("node-id",_af3); -} -}; -_af4.call(this,true); -_af4.call(this,false); -$(_aee).treegrid("fixRowHeight",id); -},deleteRow:function(_af9,id){ -var opts=$.data(_af9,"treegrid").options; -var tr=opts.finder.getTr(_af9,id); -tr.next("tr.treegrid-tr-tree").remove(); -tr.remove(); -var _afa=del(id); -if(_afa){ -if(_afa.children.length==0){ -tr=opts.finder.getTr(_af9,_afa[opts.idField]); -tr.next("tr.treegrid-tr-tree").remove(); -var cell=tr.children("td[field=\""+opts.treeField+"\"]").children("div.datagrid-cell"); -cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); -cell.find(".tree-hit").remove(); -$("").prependTo(cell); -} -} -this.setEmptyMsg(_af9); -function del(id){ -var cc; -var _afb=$(_af9).treegrid("getParent",id); -if(_afb){ -cc=_afb.children; -}else{ -cc=$(_af9).treegrid("getData"); -} -for(var i=0;ib?1:-1); -}; -r=_b06(r1[sn],r2[sn])*(so=="asc"?1:-1); -if(r!=0){ -return r; -} -} -return r; -}); -for(var i=0;i"); -if(!_b29){ -_b2c.push(""); -_b2c.push(opts.groupFormatter.call(_b26,_b28.value,_b28.rows)); -_b2c.push(""); -} -_b2c.push(""); -_b2c.push(this.renderTable(_b26,_b28.startIndex,_b28.rows,_b29)); -return _b2c.join(""); -},groupRows:function(_b2d,rows){ -var _b2e=$.data(_b2d,"datagrid"); -var opts=_b2e.options; -var _b2f=[]; -for(var i=0;idiv.combo-p>div.combo-panel:visible").panel("close"); -}); -}); -function _b3f(_b40){ -var _b41=$.data(_b40,"combo"); -var opts=_b41.options; -if(!_b41.panel){ -_b41.panel=$("
                                              ").appendTo("html>body"); -_b41.panel.panel({minWidth:opts.panelMinWidth,maxWidth:opts.panelMaxWidth,minHeight:opts.panelMinHeight,maxHeight:opts.panelMaxHeight,doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){ -var _b42=$(this).panel("options").comboTarget; -var _b43=$.data(_b42,"combo"); -if(_b43){ -_b43.options.onShowPanel.call(_b42); -} -},onBeforeClose:function(){ -_b3e($(this).parent()); -},onClose:function(){ -var _b44=$(this).panel("options").comboTarget; -var _b45=$(_b44).data("combo"); -if(_b45){ -_b45.options.onHidePanel.call(_b44); -} -}}); -} -var _b46=$.extend(true,[],opts.icons); -if(opts.hasDownArrow){ -_b46.push({iconCls:"combo-arrow",handler:function(e){ -_b4b(e.data.target); -}}); -} -$(_b40).addClass("combo-f").textbox($.extend({},opts,{icons:_b46,onChange:function(){ -}})); -$(_b40).attr("comboName",$(_b40).attr("textboxName")); -_b41.combo=$(_b40).next(); -_b41.combo.addClass("combo"); -_b41.panel._unbind(".combo"); -for(var _b47 in opts.panelEvents){ -_b41.panel._bind(_b47+".combo",{target:_b40},opts.panelEvents[_b47]); -} -}; -function _b48(_b49){ -var _b4a=$.data(_b49,"combo"); -var opts=_b4a.options; -var p=_b4a.panel; -if(p.is(":visible")){ -p.panel("close"); -} -if(!opts.cloned){ -p.panel("destroy"); -} -$(_b49).textbox("destroy"); -}; -function _b4b(_b4c){ -var _b4d=$.data(_b4c,"combo").panel; -if(_b4d.is(":visible")){ -var _b4e=_b4d.combo("combo"); -_b4f(_b4e); -if(_b4e!=_b4c){ -$(_b4c).combo("showPanel"); -} -}else{ -var p=$(_b4c).closest("div.combo-p").children(".combo-panel"); -$("div.combo-panel:visible").not(_b4d).not(p).panel("close"); -$(_b4c).combo("showPanel"); -} -$(_b4c).combo("textbox").focus(); -}; -function _b3e(_b50){ -$(_b50).find(".combo-f").each(function(){ -var p=$(this).combo("panel"); -if(p.is(":visible")){ -p.panel("close"); -} -}); -}; -function _b51(e){ -var _b52=e.data.target; -var _b53=$.data(_b52,"combo"); -var opts=_b53.options; -if(!opts.editable){ -_b4b(_b52); -}else{ -var p=$(_b52).closest("div.combo-p").children(".combo-panel"); -$("div.combo-panel:visible").not(p).each(function(){ -var _b54=$(this).combo("combo"); -if(_b54!=_b52){ -_b4f(_b54); -} -}); -} -}; -function _b55(e){ -var _b56=e.data.target; -var t=$(_b56); -var _b57=t.data("combo"); -var opts=t.combo("options"); -_b57.panel.panel("options").comboTarget=_b56; -switch(e.keyCode){ -case 38: -opts.keyHandler.up.call(_b56,e); -break; -case 40: -opts.keyHandler.down.call(_b56,e); -break; -case 37: -opts.keyHandler.left.call(_b56,e); -break; -case 39: -opts.keyHandler.right.call(_b56,e); -break; -case 13: -e.preventDefault(); -opts.keyHandler.enter.call(_b56,e); -return false; -case 9: -case 27: -_b4f(_b56); -break; -default: -if(opts.editable){ -if(_b57.timer){ -clearTimeout(_b57.timer); -} -_b57.timer=setTimeout(function(){ -var q=t.combo("getText"); -if(_b57.previousText!=q){ -_b57.previousText=q; -t.combo("showPanel"); -opts.keyHandler.query.call(_b56,q,e); -t.combo("validate"); -} -},opts.delay); -} -} -}; -function _b58(e){ -var _b59=e.data.target; -var _b5a=$(_b59).data("combo"); -if(_b5a.timer){ -clearTimeout(_b5a.timer); -} -}; -function _b5b(_b5c){ -var _b5d=$.data(_b5c,"combo"); -var _b5e=_b5d.combo; -var _b5f=_b5d.panel; -var opts=$(_b5c).combo("options"); -var _b60=_b5f.panel("options"); -_b60.comboTarget=_b5c; -if(_b60.closed){ -_b5f.panel("panel").show().css({zIndex:($.fn.menu?$.fn.menu.defaults.zIndex++:($.fn.window?$.fn.window.defaults.zIndex++:99)),left:-999999}); -_b5f.panel("resize",{width:(opts.panelWidth?opts.panelWidth:_b5e._outerWidth()),height:opts.panelHeight}); -_b5f.panel("panel").hide(); -_b5f.panel("open"); -} -(function f(){ -if(_b60.comboTarget==_b5c&&_b5f.is(":visible")){ -_b5f.panel("move",{left:_b61(),top:_b62()}); -setTimeout(f,200); -} -})(); -function _b61(){ -var left=_b5e.offset().left; -if(opts.panelAlign=="right"){ -left+=_b5e._outerWidth()-_b5f._outerWidth(); -} -if(left+_b5f._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){ -left=$(window)._outerWidth()+$(document).scrollLeft()-_b5f._outerWidth(); -} -if(left<0){ -left=0; -} -return left; -}; -function _b62(){ -if(opts.panelValign=="top"){ -var top=_b5e.offset().top-_b5f._outerHeight(); -}else{ -if(opts.panelValign=="bottom"){ -var top=_b5e.offset().top+_b5e._outerHeight(); -}else{ -var top=_b5e.offset().top+_b5e._outerHeight(); -if(top+_b5f._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -top=_b5e.offset().top-_b5f._outerHeight(); -} -if(top<$(document).scrollTop()){ -top=_b5e.offset().top+_b5e._outerHeight(); -} -} -} -return top; -}; -}; -function _b4f(_b63){ -var _b64=$.data(_b63,"combo").panel; -_b64.panel("close"); -}; -function _b65(_b66,text){ -var _b67=$.data(_b66,"combo"); -var _b68=$(_b66).textbox("getText"); -if(_b68!=text){ -$(_b66).textbox("setText",text); -} -_b67.previousText=text; -}; -function _b69(_b6a){ -var _b6b=$.data(_b6a,"combo"); -var opts=_b6b.options; -var _b6c=$(_b6a).next(); -var _b6d=[]; -_b6c.find(".textbox-value").each(function(){ -_b6d.push($(this).val()); -}); -if(opts.multivalue){ -return _b6d; -}else{ -return _b6d.length?_b6d[0].split(opts.separator):_b6d; -} -}; -function _b6e(_b6f,_b70){ -var _b71=$.data(_b6f,"combo"); -var _b72=_b71.combo; -var opts=$(_b6f).combo("options"); -if(!$.isArray(_b70)){ -_b70=_b70.split(opts.separator); -} -var _b73=_b69(_b6f); -_b72.find(".textbox-value").remove(); -if(_b70.length){ -if(opts.multivalue){ -for(var i=0;i<_b70.length;i++){ -_b74(_b70[i]); -} -}else{ -_b74(_b70.join(opts.separator)); -} -} -function _b74(_b75){ -var name=$(_b6f).attr("textboxName")||""; -var _b76=$("").appendTo(_b72); -_b76.attr("name",name); -if(opts.disabled){ -_b76.attr("disabled","disabled"); -} -_b76.val(_b75); -}; -var _b77=(function(){ -if(opts.onChange==$.parser.emptyFn){ -return false; -} -if(_b73.length!=_b70.length){ -return true; -} -for(var i=0;i<_b70.length;i++){ -if(_b70[i]!=_b73[i]){ -return true; -} -} -return false; -})(); -if(_b77){ -$(_b6f).val(_b70.join(opts.separator)); -if(opts.multiple){ -opts.onChange.call(_b6f,_b70,_b73); -}else{ -opts.onChange.call(_b6f,_b70[0],_b73[0]); -} -$(_b6f).closest("form").trigger("_change",[_b6f]); -} -}; -function _b78(_b79){ -var _b7a=_b69(_b79); -return _b7a[0]; -}; -function _b7b(_b7c,_b7d){ -_b6e(_b7c,[_b7d]); -}; -function _b7e(_b7f){ -var opts=$.data(_b7f,"combo").options; -var _b80=opts.onChange; -opts.onChange=$.parser.emptyFn; -if(opts.multiple){ -_b6e(_b7f,opts.value?opts.value:[]); -}else{ -_b7b(_b7f,opts.value); -} -opts.onChange=_b80; -}; -$.fn.combo=function(_b81,_b82){ -if(typeof _b81=="string"){ -var _b83=$.fn.combo.methods[_b81]; -if(_b83){ -return _b83(this,_b82); -}else{ -return this.textbox(_b81,_b82); -} -} -_b81=_b81||{}; -return this.each(function(){ -var _b84=$.data(this,"combo"); -if(_b84){ -$.extend(_b84.options,_b81); -if(_b81.value!=undefined){ -_b84.options.originalValue=_b81.value; -} -}else{ -_b84=$.data(this,"combo",{options:$.extend({},$.fn.combo.defaults,$.fn.combo.parseOptions(this),_b81),previousText:""}); -if(_b84.options.multiple&&_b84.options.value==""){ -_b84.options.originalValue=[]; -}else{ -_b84.options.originalValue=_b84.options.value; -} -} -_b3f(this); -_b7e(this); -}); -}; -$.fn.combo.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"combo").options,{width:opts.width,height:opts.height,disabled:opts.disabled,readonly:opts.readonly,editable:opts.editable}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).textbox("cloneFrom",from); -$.data(this,"combo",{options:$.extend(true,{cloned:true},$(from).combo("options")),combo:$(this).next(),panel:$(from).combo("panel")}); -$(this).addClass("combo-f").attr("comboName",$(this).attr("textboxName")); -}); -},combo:function(jq){ -return jq.closest(".combo-panel").panel("options").comboTarget; -},panel:function(jq){ -return $.data(jq[0],"combo").panel; -},destroy:function(jq){ -return jq.each(function(){ -_b48(this); -}); -},showPanel:function(jq){ -return jq.each(function(){ -_b5b(this); -}); -},hidePanel:function(jq){ -return jq.each(function(){ -_b4f(this); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("setText",""); -var opts=$.data(this,"combo").options; -if(opts.multiple){ -$(this).combo("setValues",[]); -}else{ -$(this).combo("setValue",""); -} -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$.data(this,"combo").options; -if(opts.multiple){ -$(this).combo("setValues",opts.originalValue); -}else{ -$(this).combo("setValue",opts.originalValue); -} -}); -},setText:function(jq,text){ -return jq.each(function(){ -_b65(this,text); -}); -},getValues:function(jq){ -return _b69(jq[0]); -},setValues:function(jq,_b85){ -return jq.each(function(){ -_b6e(this,_b85); -}); -},getValue:function(jq){ -return _b78(jq[0]); -},setValue:function(jq,_b86){ -return jq.each(function(){ -_b7b(this,_b86); -}); -}}; -$.fn.combo.parseOptions=function(_b87){ -var t=$(_b87); -return $.extend({},$.fn.textbox.parseOptions(_b87),$.parser.parseOptions(_b87,["separator","panelAlign",{panelWidth:"number",hasDownArrow:"boolean",delay:"number",reversed:"boolean",multivalue:"boolean",selectOnNavigation:"boolean"},{panelMinWidth:"number",panelMaxWidth:"number",panelMinHeight:"number",panelMaxHeight:"number"}]),{panelHeight:(t.attr("panelHeight")=="auto"?"auto":parseInt(t.attr("panelHeight"))||undefined),multiple:(t.attr("multiple")?true:undefined)}); -}; -$.fn.combo.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{click:_b51,keydown:_b55,paste:_b55,drop:_b55,blur:_b58},panelEvents:{mousedown:function(e){ -e.preventDefault(); -e.stopPropagation(); -}},panelWidth:null,panelHeight:300,panelMinWidth:null,panelMaxWidth:null,panelMinHeight:null,panelMaxHeight:null,panelAlign:"left",panelValign:"auto",reversed:false,multiple:false,multivalue:true,selectOnNavigation:true,separator:",",hasDownArrow:true,delay:200,keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -},query:function(q,e){ -}},onShowPanel:function(){ -},onHidePanel:function(){ -},onChange:function(_b88,_b89){ -}}); -})(jQuery); -(function($){ -function _b8a(_b8b,_b8c){ -var _b8d=$.data(_b8b,"combobox"); -return $.easyui.indexOfArray(_b8d.data,_b8d.options.valueField,_b8c); -}; -function _b8e(_b8f,_b90){ -var opts=$.data(_b8f,"combobox").options; -var _b91=$(_b8f).combo("panel"); -var item=opts.finder.getEl(_b8f,_b90); -if(item.length){ -if(item.position().top<=0){ -var h=_b91.scrollTop()+item.position().top; -_b91.scrollTop(h); -}else{ -if(item.position().top+item.outerHeight()>_b91.height()){ -var h=_b91.scrollTop()+item.position().top+item.outerHeight()-_b91.height(); -_b91.scrollTop(h); -} -} -} -_b91.triggerHandler("scroll"); -}; -function nav(_b92,dir){ -var opts=$.data(_b92,"combobox").options; -var _b93=$(_b92).combobox("panel"); -var item=_b93.children("div.combobox-item-hover"); -if(!item.length){ -item=_b93.children("div.combobox-item-selected"); -} -item.removeClass("combobox-item-hover"); -var _b94="div.combobox-item:visible:not(.combobox-item-disabled):first"; -var _b95="div.combobox-item:visible:not(.combobox-item-disabled):last"; -if(!item.length){ -item=_b93.children(dir=="next"?_b94:_b95); -}else{ -if(dir=="next"){ -item=item.nextAll(_b94); -if(!item.length){ -item=_b93.children(_b94); -} -}else{ -item=item.prevAll(_b94); -if(!item.length){ -item=_b93.children(_b95); -} -} -} -if(item.length){ -item.addClass("combobox-item-hover"); -var row=opts.finder.getRow(_b92,item); -if(row){ -$(_b92).combobox("scrollTo",row[opts.valueField]); -if(opts.selectOnNavigation){ -_b96(_b92,row[opts.valueField]); -} -} -} -}; -function _b96(_b97,_b98,_b99){ -var opts=$.data(_b97,"combobox").options; -var _b9a=$(_b97).combo("getValues"); -if($.inArray(_b98+"",_b9a)==-1){ -if(opts.multiple){ -_b9a.push(_b98); -}else{ -_b9a=[_b98]; -} -_b9b(_b97,_b9a,_b99); -} -}; -function _b9c(_b9d,_b9e){ -var opts=$.data(_b9d,"combobox").options; -var _b9f=$(_b9d).combo("getValues"); -var _ba0=$.inArray(_b9e+"",_b9f); -if(_ba0>=0){ -_b9f.splice(_ba0,1); -_b9b(_b9d,_b9f); -} -}; -function _b9b(_ba1,_ba2,_ba3){ -var opts=$.data(_ba1,"combobox").options; -var _ba4=$(_ba1).combo("panel"); -if(!$.isArray(_ba2)){ -_ba2=_ba2.split(opts.separator); -} -if(!opts.multiple){ -_ba2=_ba2.length?[_ba2[0]]:[""]; -} -var _ba5=$(_ba1).combo("getValues"); -if(_ba4.is(":visible")){ -_ba4.find(".combobox-item-selected").each(function(){ -var row=opts.finder.getRow(_ba1,$(this)); -if(row){ -if($.easyui.indexOfArray(_ba5,row[opts.valueField])==-1){ -$(this).removeClass("combobox-item-selected"); -} -} -}); -} -$.map(_ba5,function(v){ -if($.easyui.indexOfArray(_ba2,v)==-1){ -var el=opts.finder.getEl(_ba1,v); -if(el.hasClass("combobox-item-selected")){ -el.removeClass("combobox-item-selected"); -opts.onUnselect.call(_ba1,opts.finder.getRow(_ba1,v)); -} -} -}); -var _ba6=null; -var vv=[],ss=[]; -for(var i=0;i<_ba2.length;i++){ -var v=_ba2[i]; -var s=v; -var row=opts.finder.getRow(_ba1,v); -if(row){ -s=row[opts.textField]; -_ba6=row; -var el=opts.finder.getEl(_ba1,v); -if(!el.hasClass("combobox-item-selected")){ -el.addClass("combobox-item-selected"); -opts.onSelect.call(_ba1,row); -} -}else{ -s=_ba7(v,opts.mappingRows)||v; -} -vv.push(v); -ss.push(s); -} -if(!_ba3){ -$(_ba1).combo("setText",ss.join(opts.separator)); -} -if(opts.showItemIcon){ -var tb=$(_ba1).combobox("textbox"); -tb.removeClass("textbox-bgicon "+opts.textboxIconCls); -if(_ba6&&_ba6.iconCls){ -tb.addClass("textbox-bgicon "+_ba6.iconCls); -opts.textboxIconCls=_ba6.iconCls; -} -} -$(_ba1).combo("setValues",vv); -_ba4.triggerHandler("scroll"); -function _ba7(_ba8,a){ -var item=$.easyui.getArrayItem(a,opts.valueField,_ba8); -return item?item[opts.textField]:undefined; -}; -}; -function _ba9(_baa,data,_bab){ -var _bac=$.data(_baa,"combobox"); -var opts=_bac.options; -_bac.data=opts.loadFilter.call(_baa,data); -opts.view.render.call(opts.view,_baa,$(_baa).combo("panel"),_bac.data); -var vv=$(_baa).combobox("getValues"); -$.easyui.forEach(_bac.data,false,function(row){ -if(row["selected"]){ -$.easyui.addArrayItem(vv,row[opts.valueField]+""); -} -}); -if(opts.multiple){ -_b9b(_baa,vv,_bab); -}else{ -_b9b(_baa,vv.length?[vv[vv.length-1]]:[],_bab); -} -opts.onLoadSuccess.call(_baa,data); -}; -function _bad(_bae,url,_baf,_bb0){ -var opts=$.data(_bae,"combobox").options; -if(url){ -opts.url=url; -} -_baf=$.extend({},opts.queryParams,_baf||{}); -if(opts.onBeforeLoad.call(_bae,_baf)==false){ -return; -} -opts.loader.call(_bae,_baf,function(data){ -_ba9(_bae,data,_bb0); -},function(){ -opts.onLoadError.apply(this,arguments); -}); -}; -function _bb1(_bb2,q){ -var _bb3=$.data(_bb2,"combobox"); -var opts=_bb3.options; -var _bb4=$(); -var qq=opts.multiple?q.split(opts.separator):[q]; -if(opts.mode=="remote"){ -_bb5(qq); -_bad(_bb2,null,{q:q},true); -}else{ -var _bb6=$(_bb2).combo("panel"); -_bb6.find(".combobox-item-hover").removeClass("combobox-item-hover"); -_bb6.find(".combobox-item,.combobox-group").hide(); -var data=_bb3.data; -var vv=[]; -$.map(qq,function(q){ -q=$.trim(q); -var _bb7=q; -var _bb8=undefined; -_bb4=$(); -for(var i=0;i=0){ -vv.push(v); -} -}); -t.combobox("setValues",vv); -if(!opts.multiple){ -t.combobox("hidePanel"); -} -}; -function _bbd(_bbe){ -var _bbf=$.data(_bbe,"combobox"); -var opts=_bbf.options; -$(_bbe).addClass("combobox-f"); -$(_bbe).combo($.extend({},opts,{onShowPanel:function(){ -$(this).combo("panel").find("div.combobox-item:hidden,div.combobox-group:hidden").show(); -_b9b(this,$(this).combobox("getValues"),true); -$(this).combobox("scrollTo",$(this).combobox("getValue")); -opts.onShowPanel.call(this); -}})); -}; -function _bc0(e){ -$(this).children("div.combobox-item-hover").removeClass("combobox-item-hover"); -var item=$(e.target).closest("div.combobox-item"); -if(!item.hasClass("combobox-item-disabled")){ -item.addClass("combobox-item-hover"); -} -e.stopPropagation(); -}; -function _bc1(e){ -$(e.target).closest("div.combobox-item").removeClass("combobox-item-hover"); -e.stopPropagation(); -}; -function _bc2(e){ -var _bc3=$(this).panel("options").comboTarget; -if(!_bc3){ -return; -} -var opts=$(_bc3).combobox("options"); -var item=$(e.target).closest("div.combobox-item"); -if(!item.length||item.hasClass("combobox-item-disabled")){ -return; -} -var row=opts.finder.getRow(_bc3,item); -if(!row){ -return; -} -if(opts.blurTimer){ -clearTimeout(opts.blurTimer); -opts.blurTimer=null; -} -opts.onClick.call(_bc3,row); -var _bc4=row[opts.valueField]; -if(opts.multiple){ -if(item.hasClass("combobox-item-selected")){ -_b9c(_bc3,_bc4); -}else{ -_b96(_bc3,_bc4); -} -}else{ -$(_bc3).combobox("setValue",_bc4).combobox("hidePanel"); -} -e.stopPropagation(); -}; -function _bc5(e){ -var _bc6=$(this).panel("options").comboTarget; -if(!_bc6){ -return; -} -var opts=$(_bc6).combobox("options"); -if(opts.groupPosition=="sticky"){ -var _bc7=$(this).children(".combobox-stick"); -if(!_bc7.length){ -_bc7=$("
                                              ").appendTo(this); -} -_bc7.hide(); -var _bc8=$(_bc6).data("combobox"); -$(this).children(".combobox-group:visible").each(function(){ -var g=$(this); -var _bc9=opts.finder.getGroup(_bc6,g); -var _bca=_bc8.data[_bc9.startIndex+_bc9.count-1]; -var last=opts.finder.getEl(_bc6,_bca[opts.valueField]); -if(g.position().top<0&&last.position().top>0){ -_bc7.show().html(g.html()); -return false; -} -}); -} -}; -$.fn.combobox=function(_bcb,_bcc){ -if(typeof _bcb=="string"){ -var _bcd=$.fn.combobox.methods[_bcb]; -if(_bcd){ -return _bcd(this,_bcc); -}else{ -return this.combo(_bcb,_bcc); -} -} -_bcb=_bcb||{}; -return this.each(function(){ -var _bce=$.data(this,"combobox"); -if(_bce){ -$.extend(_bce.options,_bcb); -}else{ -_bce=$.data(this,"combobox",{options:$.extend({},$.fn.combobox.defaults,$.fn.combobox.parseOptions(this),_bcb),data:[]}); -} -_bbd(this); -if(_bce.options.data){ -_ba9(this,_bce.options.data); -}else{ -var data=$.fn.combobox.parseData(this); -if(data.length){ -_ba9(this,data); -} -} -_bad(this); -}); -}; -$.fn.combobox.methods={options:function(jq){ -var _bcf=jq.combo("options"); -return $.extend($.data(jq[0],"combobox").options,{width:_bcf.width,height:_bcf.height,originalValue:_bcf.originalValue,disabled:_bcf.disabled,readonly:_bcf.readonly,editable:_bcf.editable}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).combo("cloneFrom",from); -$.data(this,"combobox",$(from).data("combobox")); -$(this).addClass("combobox-f").attr("comboboxName",$(this).attr("textboxName")); -}); -},getData:function(jq){ -return $.data(jq[0],"combobox").data; -},setValues:function(jq,_bd0){ -return jq.each(function(){ -var opts=$(this).combobox("options"); -if($.isArray(_bd0)){ -_bd0=$.map(_bd0,function(_bd1){ -if(_bd1&&typeof _bd1=="object"){ -$.easyui.addArrayItem(opts.mappingRows,opts.valueField,_bd1); -return _bd1[opts.valueField]; -}else{ -return _bd1; -} -}); -} -_b9b(this,_bd0); -}); -},setValue:function(jq,_bd2){ -return jq.each(function(){ -$(this).combobox("setValues",$.isArray(_bd2)?_bd2:[_bd2]); -}); -},clear:function(jq){ -return jq.each(function(){ -_b9b(this,[]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).combobox("options"); -if(opts.multiple){ -$(this).combobox("setValues",opts.originalValue); -}else{ -$(this).combobox("setValue",opts.originalValue); -} -}); -},loadData:function(jq,data){ -return jq.each(function(){ -_ba9(this,data); -}); -},reload:function(jq,url){ -return jq.each(function(){ -if(typeof url=="string"){ -_bad(this,url); -}else{ -if(url){ -var opts=$(this).combobox("options"); -opts.queryParams=url; -} -_bad(this); -} -}); -},select:function(jq,_bd3){ -return jq.each(function(){ -_b96(this,_bd3); -}); -},unselect:function(jq,_bd4){ -return jq.each(function(){ -_b9c(this,_bd4); -}); -},scrollTo:function(jq,_bd5){ -return jq.each(function(){ -_b8e(this,_bd5); -}); -}}; -$.fn.combobox.parseOptions=function(_bd6){ -var t=$(_bd6); -return $.extend({},$.fn.combo.parseOptions(_bd6),$.parser.parseOptions(_bd6,["valueField","textField","groupField","groupPosition","mode","method","url",{showItemIcon:"boolean",limitToList:"boolean"}])); -}; -$.fn.combobox.parseData=function(_bd7){ -var data=[]; -var opts=$(_bd7).combobox("options"); -$(_bd7).children().each(function(){ -if(this.tagName.toLowerCase()=="optgroup"){ -var _bd8=$(this).attr("label"); -$(this).children().each(function(){ -_bd9(this,_bd8); -}); -}else{ -_bd9(this); -} -}); -return data; -function _bd9(el,_bda){ -var t=$(el); -var row={}; -row[opts.valueField]=t.attr("value")!=undefined?t.attr("value"):t.text(); -row[opts.textField]=t.text(); -row["iconCls"]=$.parser.parseOptions(el,["iconCls"]).iconCls; -row["selected"]=t.is(":selected"); -row["disabled"]=t.is(":disabled"); -if(_bda){ -opts.groupField=opts.groupField||"group"; -row[opts.groupField]=_bda; -} -data.push(row); -}; -}; -var _bdb=0; -var _bdc={render:function(_bdd,_bde,data){ -var _bdf=$.data(_bdd,"combobox"); -var opts=_bdf.options; -var _be0=$(_bdd).attr("id")||""; -_bdb++; -_bdf.itemIdPrefix=_be0+"_easyui_combobox_i"+_bdb; -_bdf.groupIdPrefix=_be0+"_easyui_combobox_g"+_bdb; -_bdf.groups=[]; -var dd=[]; -var _be1=undefined; -for(var i=0;i"); -dd.push(opts.groupFormatter?opts.groupFormatter.call(_bdd,g):g); -dd.push(""); -}else{ -_bdf.groups[_bdf.groups.length-1].count++; -} -}else{ -_be1=undefined; -} -var cls="combobox-item"+(row.disabled?" combobox-item-disabled":"")+(g?" combobox-gitem":""); -dd.push("
                                              "); -if(opts.showItemIcon&&row.iconCls){ -dd.push(""); -} -dd.push(opts.formatter?opts.formatter.call(_bdd,row):s); -dd.push("
                                              "); -} -$(_bde).html(dd.join("")); -}}; -$.fn.combobox.defaults=$.extend({},$.fn.combo.defaults,{valueField:"value",textField:"text",groupPosition:"static",groupField:null,groupFormatter:function(_be2){ -return _be2; -},mode:"local",method:"post",url:null,data:null,queryParams:{},showItemIcon:false,limitToList:false,unselectedValues:[],mappingRows:[],view:_bdc,keyHandler:{up:function(e){ -nav(this,"prev"); -e.preventDefault(); -},down:function(e){ -nav(this,"next"); -e.preventDefault(); -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_bb9(this); -},query:function(q,e){ -_bb1(this,q); -}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ -$.fn.combo.defaults.inputEvents.blur(e); -var _be3=e.data.target; -var opts=$(_be3).combobox("options"); -if(opts.reversed||opts.limitToList){ -if(opts.blurTimer){ -clearTimeout(opts.blurTimer); -} -opts.blurTimer=setTimeout(function(){ -var _be4=$(_be3).parent().length; -if(_be4){ -if(opts.reversed){ -$(_be3).combobox("setValues",$(_be3).combobox("getValues")); -}else{ -if(opts.limitToList){ -var vv=[]; -$.map($(_be3).combobox("getValues"),function(v){ -var _be5=$.easyui.indexOfArray($(_be3).combobox("getData"),opts.valueField,v); -if(_be5>=0){ -vv.push(v); -} -}); -$(_be3).combobox("setValues",vv); -} -} -opts.blurTimer=null; -} -},50); -} -}}),panelEvents:{mouseover:_bc0,mouseout:_bc1,mousedown:function(e){ -e.preventDefault(); -e.stopPropagation(); -},click:_bc2,scroll:_bc5},filter:function(q,row){ -var opts=$(this).combobox("options"); -return row[opts.textField].toLowerCase().indexOf(q.toLowerCase())>=0; -},formatter:function(row){ -var opts=$(this).combobox("options"); -return row[opts.textField]; -},loader:function(_be6,_be7,_be8){ -var opts=$(this).combobox("options"); -if(!opts.url){ -return false; -} -$.ajax({type:opts.method,url:opts.url,data:_be6,dataType:"json",success:function(data){ -_be7(data); -},error:function(){ -_be8.apply(this,arguments); -}}); -},loadFilter:function(data){ -return data; -},finder:{getEl:function(_be9,_bea){ -var _beb=_b8a(_be9,_bea); -var id=$.data(_be9,"combobox").itemIdPrefix+"_"+_beb; -return $("#"+id); -},getGroupEl:function(_bec,_bed){ -var _bee=$.data(_bec,"combobox"); -var _bef=$.easyui.indexOfArray(_bee.groups,"value",_bed); -var id=_bee.groupIdPrefix+"_"+_bef; -return $("#"+id); -},getGroup:function(_bf0,p){ -var _bf1=$.data(_bf0,"combobox"); -var _bf2=p.attr("id").substr(_bf1.groupIdPrefix.length+1); -return _bf1.groups[parseInt(_bf2)]; -},getRow:function(_bf3,p){ -var _bf4=$.data(_bf3,"combobox"); -var _bf5=(p instanceof $)?p.attr("id").substr(_bf4.itemIdPrefix.length+1):_b8a(_bf3,p); -return _bf4.data[parseInt(_bf5)]; -}},onBeforeLoad:function(_bf6){ -},onLoadSuccess:function(data){ -},onLoadError:function(){ -},onSelect:function(_bf7){ -},onUnselect:function(_bf8){ -},onClick:function(_bf9){ -}}); -})(jQuery); -(function($){ -function _bfa(_bfb){ -var _bfc=$.data(_bfb,"combotree"); -var opts=_bfc.options; -var tree=_bfc.tree; -$(_bfb).addClass("combotree-f"); -$(_bfb).combo($.extend({},opts,{onShowPanel:function(){ -if(opts.editable){ -tree.tree("doFilter",""); -} -opts.onShowPanel.call(this); -}})); -var _bfd=$(_bfb).combo("panel"); -if(!tree){ -tree=$("
                                                ").appendTo(_bfd); -_bfc.tree=tree; -} -tree.tree($.extend({},opts,{checkbox:opts.multiple,onLoadSuccess:function(node,data){ -var _bfe=$(_bfb).combotree("getValues"); -if(opts.multiple){ -$.map(tree.tree("getChecked"),function(node){ -$.easyui.addArrayItem(_bfe,node.id); -}); -} -_c03(_bfb,_bfe,_bfc.remainText); -opts.onLoadSuccess.call(this,node,data); -},onClick:function(node){ -if(opts.multiple){ -$(this).tree(node.checked?"uncheck":"check",node.target); -}else{ -$(_bfb).combo("hidePanel"); -} -_bfc.remainText=false; -_c00(_bfb); -opts.onClick.call(this,node); -},onCheck:function(node,_bff){ -_bfc.remainText=false; -_c00(_bfb); -opts.onCheck.call(this,node,_bff); -}})); -}; -function _c00(_c01){ -var _c02=$.data(_c01,"combotree"); -var opts=_c02.options; -var tree=_c02.tree; -var vv=[]; -if(opts.multiple){ -vv=$.map(tree.tree("getChecked"),function(node){ -return node.id; -}); -}else{ -var node=tree.tree("getSelected"); -if(node){ -vv.push(node.id); -} -} -vv=vv.concat(opts.unselectedValues); -_c03(_c01,vv,_c02.remainText); -}; -function _c03(_c04,_c05,_c06){ -var _c07=$.data(_c04,"combotree"); -var opts=_c07.options; -var tree=_c07.tree; -var _c08=tree.tree("options"); -var _c09=_c08.onBeforeCheck; -var _c0a=_c08.onCheck; -var _c0b=_c08.onBeforeSelect; -var _c0c=_c08.onSelect; -_c08.onBeforeCheck=_c08.onCheck=_c08.onBeforeSelect=_c08.onSelect=function(){ -}; -if(!$.isArray(_c05)){ -_c05=_c05.split(opts.separator); -} -if(!opts.multiple){ -_c05=_c05.length?[_c05[0]]:[""]; -} -var vv=$.map(_c05,function(_c0d){ -return String(_c0d); -}); -tree.find("div.tree-node-selected").removeClass("tree-node-selected"); -$.map(tree.tree("getChecked"),function(node){ -if($.inArray(String(node.id),vv)==-1){ -tree.tree("uncheck",node.target); -} -}); -var ss=[]; -opts.unselectedValues=[]; -$.map(vv,function(v){ -var node=tree.tree("find",v); -if(node){ -tree.tree("check",node.target).tree("select",node.target); -ss.push(_c0e(node)); -}else{ -ss.push(_c0f(v,opts.mappingRows)||v); -opts.unselectedValues.push(v); -} -}); -if(opts.multiple){ -$.map(tree.tree("getChecked"),function(node){ -var id=String(node.id); -if($.inArray(id,vv)==-1){ -vv.push(id); -ss.push(_c0e(node)); -} -}); -} -_c08.onBeforeCheck=_c09; -_c08.onCheck=_c0a; -_c08.onBeforeSelect=_c0b; -_c08.onSelect=_c0c; -if(!_c06){ -var s=ss.join(opts.separator); -if($(_c04).combo("getText")!=s){ -$(_c04).combo("setText",s); -} -} -$(_c04).combo("setValues",vv); -function _c0f(_c10,a){ -var item=$.easyui.getArrayItem(a,"id",_c10); -return item?_c0e(item):undefined; -}; -function _c0e(node){ -return node[opts.textField||""]||node.text; -}; -}; -function _c11(_c12,q){ -var _c13=$.data(_c12,"combotree"); -var opts=_c13.options; -var tree=_c13.tree; -_c13.remainText=true; -tree.tree("doFilter",opts.multiple?q.split(opts.separator):q); -}; -function _c14(_c15){ -var _c16=$.data(_c15,"combotree"); -_c16.remainText=false; -$(_c15).combotree("setValues",$(_c15).combotree("getValues")); -$(_c15).combotree("hidePanel"); -}; -$.fn.combotree=function(_c17,_c18){ -if(typeof _c17=="string"){ -var _c19=$.fn.combotree.methods[_c17]; -if(_c19){ -return _c19(this,_c18); -}else{ -return this.combo(_c17,_c18); -} -} -_c17=_c17||{}; -return this.each(function(){ -var _c1a=$.data(this,"combotree"); -if(_c1a){ -$.extend(_c1a.options,_c17); -}else{ -$.data(this,"combotree",{options:$.extend({},$.fn.combotree.defaults,$.fn.combotree.parseOptions(this),_c17)}); -} -_bfa(this); -}); -}; -$.fn.combotree.methods={options:function(jq){ -var _c1b=jq.combo("options"); -return $.extend($.data(jq[0],"combotree").options,{width:_c1b.width,height:_c1b.height,originalValue:_c1b.originalValue,disabled:_c1b.disabled,readonly:_c1b.readonly,editable:_c1b.editable}); -},clone:function(jq,_c1c){ -var t=jq.combo("clone",_c1c); -t.data("combotree",{options:$.extend(true,{},jq.combotree("options")),tree:jq.combotree("tree")}); -return t; -},tree:function(jq){ -return $.data(jq[0],"combotree").tree; -},loadData:function(jq,data){ -return jq.each(function(){ -var opts=$.data(this,"combotree").options; -opts.data=data; -var tree=$.data(this,"combotree").tree; -tree.tree("loadData",data); -}); -},reload:function(jq,url){ -return jq.each(function(){ -var opts=$.data(this,"combotree").options; -var tree=$.data(this,"combotree").tree; -if(url){ -opts.url=url; -} -tree.tree({url:opts.url}); -}); -},setValues:function(jq,_c1d){ -return jq.each(function(){ -var opts=$(this).combotree("options"); -if($.isArray(_c1d)){ -_c1d=$.map(_c1d,function(_c1e){ -if(_c1e&&typeof _c1e=="object"){ -$.easyui.addArrayItem(opts.mappingRows,"id",_c1e); -return _c1e.id; -}else{ -return _c1e; -} -}); -} -_c03(this,_c1d); -}); -},setValue:function(jq,_c1f){ -return jq.each(function(){ -$(this).combotree("setValues",$.isArray(_c1f)?_c1f:[_c1f]); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).combotree("setValues",[]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).combotree("options"); -if(opts.multiple){ -$(this).combotree("setValues",opts.originalValue); -}else{ -$(this).combotree("setValue",opts.originalValue); -} -}); -}}; -$.fn.combotree.parseOptions=function(_c20){ -return $.extend({},$.fn.combo.parseOptions(_c20),$.fn.tree.parseOptions(_c20)); -}; -$.fn.combotree.defaults=$.extend({},$.fn.combo.defaults,$.fn.tree.defaults,{editable:false,textField:null,unselectedValues:[],mappingRows:[],keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_c14(this); -},query:function(q,e){ -_c11(this,q); -}}}); -})(jQuery); -(function($){ -function _c21(_c22){ -var _c23=$.data(_c22,"combogrid"); -var opts=_c23.options; -var grid=_c23.grid; -$(_c22).addClass("combogrid-f").combo($.extend({},opts,{onShowPanel:function(){ -_c3a(this,$(this).combogrid("getValues"),true); -var p=$(this).combogrid("panel"); -var _c24=p.outerHeight()-p.height(); -var _c25=p._size("minHeight"); -var _c26=p._size("maxHeight"); -var dg=$(this).combogrid("grid"); -dg.datagrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_c25?_c25-_c24:""),maxHeight:(_c26?_c26-_c24:"")}); -var row=dg.datagrid("getSelected"); -if(row){ -dg.datagrid("scrollTo",dg.datagrid("getRowIndex",row)); -} -opts.onShowPanel.call(this); -}})); -var _c27=$(_c22).combo("panel"); -if(!grid){ -grid=$("
                                                ").appendTo(_c27); -_c23.grid=grid; -} -grid.datagrid($.extend({},opts,{border:false,singleSelect:(!opts.multiple),onLoadSuccess:_c28,onClickRow:_c29,onSelect:_c2a("onSelect"),onUnselect:_c2a("onUnselect"),onSelectAll:_c2a("onSelectAll"),onUnselectAll:_c2a("onUnselectAll")})); -function _c2b(dg){ -return $(dg).closest(".combo-panel").panel("options").comboTarget||_c22; -}; -function _c28(data){ -var _c2c=_c2b(this); -var _c2d=$(_c2c).data("combogrid"); -var opts=_c2d.options; -var _c2e=$(_c2c).combo("getValues"); -_c3a(_c2c,_c2e,_c2d.remainText); -opts.onLoadSuccess.call(this,data); -}; -function _c29(_c2f,row){ -var _c30=_c2b(this); -var _c31=$(_c30).data("combogrid"); -var opts=_c31.options; -_c31.remainText=false; -_c32.call(this); -if(!opts.multiple){ -$(_c30).combo("hidePanel"); -} -opts.onClickRow.call(this,_c2f,row); -}; -function _c2a(_c33){ -return function(_c34,row){ -var _c35=_c2b(this); -var opts=$(_c35).combogrid("options"); -if(_c33=="onUnselectAll"){ -if(opts.multiple){ -_c32.call(this); -} -}else{ -_c32.call(this); -} -opts[_c33].call(this,_c34,row); -}; -}; -function _c32(){ -var dg=$(this); -var _c36=_c2b(dg); -var _c37=$(_c36).data("combogrid"); -var opts=_c37.options; -var vv=$.map(dg.datagrid("getSelections"),function(row){ -return row[opts.idField]; -}); -vv=vv.concat(opts.unselectedValues); -var _c38=dg.data("datagrid").dc.body2; -var _c39=_c38.scrollTop(); -_c3a(_c36,vv,_c37.remainText); -_c38.scrollTop(_c39); -}; -}; -function nav(_c3b,dir){ -var _c3c=$.data(_c3b,"combogrid"); -var opts=_c3c.options; -var grid=_c3c.grid; -var _c3d=grid.datagrid("getRows").length; -if(!_c3d){ -return; -} -var tr=opts.finder.getTr(grid[0],null,"highlight"); -if(!tr.length){ -tr=opts.finder.getTr(grid[0],null,"selected"); -} -var _c3e; -if(!tr.length){ -_c3e=(dir=="next"?0:_c3d-1); -}else{ -var _c3e=parseInt(tr.attr("datagrid-row-index")); -_c3e+=(dir=="next"?1:-1); -if(_c3e<0){ -_c3e=_c3d-1; -} -if(_c3e>=_c3d){ -_c3e=0; -} -} -grid.datagrid("highlightRow",_c3e); -if(opts.selectOnNavigation){ -_c3c.remainText=false; -grid.datagrid("selectRow",_c3e); -} -}; -function _c3a(_c3f,_c40,_c41){ -var _c42=$.data(_c3f,"combogrid"); -var opts=_c42.options; -var grid=_c42.grid; -var _c43=$(_c3f).combo("getValues"); -var _c44=$(_c3f).combo("options"); -var _c45=_c44.onChange; -_c44.onChange=function(){ -}; -var _c46=grid.datagrid("options"); -var _c47=_c46.onSelect; -var _c48=_c46.onUnselect; -var _c49=_c46.onUnselectAll; -_c46.onSelect=_c46.onUnselect=_c46.onUnselectAll=function(){ -}; -if(!$.isArray(_c40)){ -_c40=_c40.split(opts.separator); -} -if(!opts.multiple){ -_c40=_c40.length?[_c40[0]]:[""]; -} -var vv=$.map(_c40,function(_c4a){ -return String(_c4a); -}); -vv=$.grep(vv,function(v,_c4b){ -return _c4b===$.inArray(v,vv); -}); -var _c4c=$.grep(grid.datagrid("getSelections"),function(row,_c4d){ -return $.inArray(String(row[opts.idField]),vv)>=0; -}); -grid.datagrid("clearSelections"); -grid.data("datagrid").selectedRows=_c4c; -var ss=[]; -opts.unselectedValues=[]; -$.map(vv,function(v){ -var _c4e=grid.datagrid("getRowIndex",v); -if(_c4e>=0){ -grid.datagrid("selectRow",_c4e); -}else{ -if($.easyui.indexOfArray(_c4c,opts.idField,v)==-1){ -opts.unselectedValues.push(v); -} -} -ss.push(_c4f(v,grid.datagrid("getRows"))||_c4f(v,_c4c)||_c4f(v,opts.mappingRows)||v); -}); -$(_c3f).combo("setValues",_c43); -_c44.onChange=_c45; -_c46.onSelect=_c47; -_c46.onUnselect=_c48; -_c46.onUnselectAll=_c49; -if(!_c41){ -var s=ss.join(opts.separator); -if($(_c3f).combo("getText")!=s){ -$(_c3f).combo("setText",s); -} -} -$(_c3f).combo("setValues",_c40); -function _c4f(_c50,a){ -var item=$.easyui.getArrayItem(a,opts.idField,_c50); -return item?item[opts.textField]:undefined; -}; -}; -function _c51(_c52,q){ -var _c53=$.data(_c52,"combogrid"); -var opts=_c53.options; -var grid=_c53.grid; -_c53.remainText=true; -var qq=opts.multiple?q.split(opts.separator):[q]; -qq=$.grep(qq,function(q){ -return $.trim(q)!=""; -}); -if(opts.mode=="remote"){ -_c54(qq); -grid.datagrid("load",$.extend({},opts.queryParams,{q:q})); -}else{ -grid.datagrid("highlightRow",-1); -var rows=grid.datagrid("getRows"); -var vv=[]; -$.map(qq,function(q){ -q=$.trim(q); -var _c55=q; -_c56(opts.mappingRows,q); -_c56(grid.datagrid("getSelections"),q); -var _c57=_c56(rows,q); -if(_c57>=0){ -if(opts.reversed){ -grid.datagrid("highlightRow",_c57); -} -}else{ -$.map(rows,function(row,i){ -if(opts.filter.call(_c52,q,row)){ -grid.datagrid("highlightRow",i); -} -}); -} -}); -_c54(vv); -} -function _c56(rows,q){ -for(var i=0;i=0){ -$.easyui.addArrayItem(vv,v); -} -}); -$(_c59).combogrid("setValues",vv); -if(!opts.multiple){ -$(_c59).combogrid("hidePanel"); -} -}; -$.fn.combogrid=function(_c5c,_c5d){ -if(typeof _c5c=="string"){ -var _c5e=$.fn.combogrid.methods[_c5c]; -if(_c5e){ -return _c5e(this,_c5d); -}else{ -return this.combo(_c5c,_c5d); -} -} -_c5c=_c5c||{}; -return this.each(function(){ -var _c5f=$.data(this,"combogrid"); -if(_c5f){ -$.extend(_c5f.options,_c5c); -}else{ -_c5f=$.data(this,"combogrid",{options:$.extend({},$.fn.combogrid.defaults,$.fn.combogrid.parseOptions(this),_c5c)}); -} -_c21(this); -}); -}; -$.fn.combogrid.methods={options:function(jq){ -var _c60=jq.combo("options"); -return $.extend($.data(jq[0],"combogrid").options,{width:_c60.width,height:_c60.height,originalValue:_c60.originalValue,disabled:_c60.disabled,readonly:_c60.readonly,editable:_c60.editable}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).combo("cloneFrom",from); -$.data(this,"combogrid",{options:$.extend(true,{cloned:true},$(from).combogrid("options")),combo:$(this).next(),panel:$(from).combo("panel"),grid:$(from).combogrid("grid")}); -}); -},grid:function(jq){ -return $.data(jq[0],"combogrid").grid; -},setValues:function(jq,_c61){ -return jq.each(function(){ -var opts=$(this).combogrid("options"); -if($.isArray(_c61)){ -_c61=$.map(_c61,function(_c62){ -if(_c62&&typeof _c62=="object"){ -$.easyui.addArrayItem(opts.mappingRows,opts.idField,_c62); -return _c62[opts.idField]; -}else{ -return _c62; -} -}); -} -_c3a(this,_c61); -}); -},setValue:function(jq,_c63){ -return jq.each(function(){ -$(this).combogrid("setValues",$.isArray(_c63)?_c63:[_c63]); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).combogrid("setValues",[]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).combogrid("options"); -if(opts.multiple){ -$(this).combogrid("setValues",opts.originalValue); -}else{ -$(this).combogrid("setValue",opts.originalValue); -} -}); -}}; -$.fn.combogrid.parseOptions=function(_c64){ -var t=$(_c64); -return $.extend({},$.fn.combo.parseOptions(_c64),$.fn.datagrid.parseOptions(_c64),$.parser.parseOptions(_c64,["idField","textField","mode"])); -}; -$.fn.combogrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.datagrid.defaults,{loadMsg:null,idField:null,textField:null,unselectedValues:[],mappingRows:[],mode:"local",keyHandler:{up:function(e){ -nav(this,"prev"); -e.preventDefault(); -},down:function(e){ -nav(this,"next"); -e.preventDefault(); -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_c58(this); -},query:function(q,e){ -_c51(this,q); -}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ -$.fn.combo.defaults.inputEvents.blur(e); -var _c65=e.data.target; -var opts=$(_c65).combogrid("options"); -if(opts.reversed){ -$(_c65).combogrid("setValues",$(_c65).combogrid("getValues")); -} -}}),panelEvents:{mousedown:function(e){ -}},filter:function(q,row){ -var opts=$(this).combogrid("options"); -return (row[opts.textField]||"").toLowerCase().indexOf(q.toLowerCase())>=0; -}}); -})(jQuery); -(function($){ -function _c66(_c67){ -var _c68=$.data(_c67,"combotreegrid"); -var opts=_c68.options; -$(_c67).addClass("combotreegrid-f").combo($.extend({},opts,{onShowPanel:function(){ -var p=$(this).combotreegrid("panel"); -var _c69=p.outerHeight()-p.height(); -var _c6a=p._size("minHeight"); -var _c6b=p._size("maxHeight"); -var dg=$(this).combotreegrid("grid"); -dg.treegrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_c6a?_c6a-_c69:""),maxHeight:(_c6b?_c6b-_c69:"")}); -var row=dg.treegrid("getSelected"); -if(row){ -dg.treegrid("scrollTo",row[opts.idField]); -} -opts.onShowPanel.call(this); -}})); -if(!_c68.grid){ -var _c6c=$(_c67).combo("panel"); -_c68.grid=$("
                                                ").appendTo(_c6c); -} -_c68.grid.treegrid($.extend({},opts,{border:false,checkbox:opts.multiple,onLoadSuccess:function(row,data){ -var _c6d=$(_c67).combotreegrid("getValues"); -if(opts.multiple){ -$.map($(this).treegrid("getCheckedNodes"),function(row){ -$.easyui.addArrayItem(_c6d,row[opts.idField]); -}); -} -_c72(_c67,_c6d); -opts.onLoadSuccess.call(this,row,data); -_c68.remainText=false; -},onClickRow:function(row){ -if(opts.multiple){ -$(this).treegrid(row.checked?"uncheckNode":"checkNode",row[opts.idField]); -$(this).treegrid("unselect",row[opts.idField]); -}else{ -$(_c67).combo("hidePanel"); -} -_c6f(_c67); -opts.onClickRow.call(this,row); -},onCheckNode:function(row,_c6e){ -_c6f(_c67); -opts.onCheckNode.call(this,row,_c6e); -}})); -}; -function _c6f(_c70){ -var _c71=$.data(_c70,"combotreegrid"); -var opts=_c71.options; -var grid=_c71.grid; -var vv=[]; -if(opts.multiple){ -vv=$.map(grid.treegrid("getCheckedNodes"),function(row){ -return row[opts.idField]; -}); -}else{ -var row=grid.treegrid("getSelected"); -if(row){ -vv.push(row[opts.idField]); -} -} -vv=vv.concat(opts.unselectedValues); -_c72(_c70,vv); -}; -function _c72(_c73,_c74){ -var _c75=$.data(_c73,"combotreegrid"); -var opts=_c75.options; -var grid=_c75.grid; -var _c76=grid.datagrid("options"); -var _c77=_c76.onBeforeCheck; -var _c78=_c76.onCheck; -var _c79=_c76.onBeforeSelect; -var _c7a=_c76.onSelect; -_c76.onBeforeCheck=_c76.onCheck=_c76.onBeforeSelect=_c76.onSelect=function(){ -}; -if(!$.isArray(_c74)){ -_c74=_c74.split(opts.separator); -} -if(!opts.multiple){ -_c74=_c74.length?[_c74[0]]:[""]; -} -var vv=$.map(_c74,function(_c7b){ -return String(_c7b); -}); -vv=$.grep(vv,function(v,_c7c){ -return _c7c===$.inArray(v,vv); -}); -var _c7d=grid.treegrid("getSelected"); -if(_c7d){ -grid.treegrid("unselect",_c7d[opts.idField]); -} -$.map(grid.treegrid("getCheckedNodes"),function(row){ -if($.inArray(String(row[opts.idField]),vv)==-1){ -grid.treegrid("uncheckNode",row[opts.idField]); -} -}); -var ss=[]; -opts.unselectedValues=[]; -$.map(vv,function(v){ -var row=grid.treegrid("find",v); -if(row){ -if(opts.multiple){ -grid.treegrid("checkNode",v); -}else{ -grid.treegrid("select",v); -} -ss.push(_c7e(row)); -}else{ -ss.push(_c7f(v,opts.mappingRows)||v); -opts.unselectedValues.push(v); -} -}); -if(opts.multiple){ -$.map(grid.treegrid("getCheckedNodes"),function(row){ -var id=String(row[opts.idField]); -if($.inArray(id,vv)==-1){ -vv.push(id); -ss.push(_c7e(row)); -} -}); -} -_c76.onBeforeCheck=_c77; -_c76.onCheck=_c78; -_c76.onBeforeSelect=_c79; -_c76.onSelect=_c7a; -if(!_c75.remainText){ -var s=ss.join(opts.separator); -if($(_c73).combo("getText")!=s){ -$(_c73).combo("setText",s); -} -} -$(_c73).combo("setValues",vv); -function _c7f(_c80,a){ -var item=$.easyui.getArrayItem(a,opts.idField,_c80); -return item?_c7e(item):undefined; -}; -function _c7e(row){ -return row[opts.textField||""]||row[opts.treeField]; -}; -}; -function _c81(_c82,q){ -var _c83=$.data(_c82,"combotreegrid"); -var opts=_c83.options; -var grid=_c83.grid; -_c83.remainText=true; -var qq=opts.multiple?q.split(opts.separator):[q]; -qq=$.grep(qq,function(q){ -return $.trim(q)!=""; -}); -grid.treegrid("clearSelections").treegrid("clearChecked").treegrid("highlightRow",-1); -if(opts.mode=="remote"){ -_c84(qq); -grid.treegrid("load",$.extend({},opts.queryParams,{q:q})); -}else{ -if(q){ -var data=grid.treegrid("getData"); -var vv=[]; -$.map(qq,function(q){ -q=$.trim(q); -if(q){ -var v=undefined; -$.easyui.forEach(data,true,function(row){ -if(q.toLowerCase()==String(row[opts.treeField]).toLowerCase()){ -v=row[opts.idField]; -return false; -}else{ -if(opts.filter.call(_c82,q,row)){ -grid.treegrid("expandTo",row[opts.idField]); -grid.treegrid("highlightRow",row[opts.idField]); -return false; -} -} -}); -if(v==undefined){ -$.easyui.forEach(opts.mappingRows,false,function(row){ -if(q.toLowerCase()==String(row[opts.treeField])){ -v=row[opts.idField]; -return false; -} -}); -} -if(v!=undefined){ -vv.push(v); -}else{ -vv.push(q); -} -} -}); -_c84(vv); -_c83.remainText=false; -} -} -function _c84(vv){ -if(!opts.reversed){ -$(_c82).combotreegrid("setValues",vv); -} -}; -}; -function _c85(_c86){ -var _c87=$.data(_c86,"combotreegrid"); -var opts=_c87.options; -var grid=_c87.grid; -var tr=opts.finder.getTr(grid[0],null,"highlight"); -_c87.remainText=false; -if(tr.length){ -var id=tr.attr("node-id"); -if(opts.multiple){ -if(tr.hasClass("datagrid-row-selected")){ -grid.treegrid("uncheckNode",id); -}else{ -grid.treegrid("checkNode",id); -} -}else{ -grid.treegrid("selectRow",id); -} -} -var vv=[]; -if(opts.multiple){ -$.map(grid.treegrid("getCheckedNodes"),function(row){ -vv.push(row[opts.idField]); -}); -}else{ -var row=grid.treegrid("getSelected"); -if(row){ -vv.push(row[opts.idField]); -} -} -$.map(opts.unselectedValues,function(v){ -if($.easyui.indexOfArray(opts.mappingRows,opts.idField,v)>=0){ -$.easyui.addArrayItem(vv,v); -} -}); -$(_c86).combotreegrid("setValues",vv); -if(!opts.multiple){ -$(_c86).combotreegrid("hidePanel"); -} -}; -$.fn.combotreegrid=function(_c88,_c89){ -if(typeof _c88=="string"){ -var _c8a=$.fn.combotreegrid.methods[_c88]; -if(_c8a){ -return _c8a(this,_c89); -}else{ -return this.combo(_c88,_c89); -} -} -_c88=_c88||{}; -return this.each(function(){ -var _c8b=$.data(this,"combotreegrid"); -if(_c8b){ -$.extend(_c8b.options,_c88); -}else{ -_c8b=$.data(this,"combotreegrid",{options:$.extend({},$.fn.combotreegrid.defaults,$.fn.combotreegrid.parseOptions(this),_c88)}); -} -_c66(this); -}); -}; -$.fn.combotreegrid.methods={options:function(jq){ -var _c8c=jq.combo("options"); -return $.extend($.data(jq[0],"combotreegrid").options,{width:_c8c.width,height:_c8c.height,originalValue:_c8c.originalValue,disabled:_c8c.disabled,readonly:_c8c.readonly,editable:_c8c.editable}); -},grid:function(jq){ -return $.data(jq[0],"combotreegrid").grid; -},setValues:function(jq,_c8d){ -return jq.each(function(){ -var opts=$(this).combotreegrid("options"); -if($.isArray(_c8d)){ -_c8d=$.map(_c8d,function(_c8e){ -if(_c8e&&typeof _c8e=="object"){ -$.easyui.addArrayItem(opts.mappingRows,opts.idField,_c8e); -return _c8e[opts.idField]; -}else{ -return _c8e; -} -}); -} -_c72(this,_c8d); -}); -},setValue:function(jq,_c8f){ -return jq.each(function(){ -$(this).combotreegrid("setValues",$.isArray(_c8f)?_c8f:[_c8f]); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).combotreegrid("setValues",[]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).combotreegrid("options"); -if(opts.multiple){ -$(this).combotreegrid("setValues",opts.originalValue); -}else{ -$(this).combotreegrid("setValue",opts.originalValue); -} -}); -}}; -$.fn.combotreegrid.parseOptions=function(_c90){ -var t=$(_c90); -return $.extend({},$.fn.combo.parseOptions(_c90),$.fn.treegrid.parseOptions(_c90),$.parser.parseOptions(_c90,["mode",{limitToGrid:"boolean"}])); -}; -$.fn.combotreegrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.treegrid.defaults,{editable:false,singleSelect:true,limitToGrid:false,unselectedValues:[],mappingRows:[],mode:"local",textField:null,keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_c85(this); -},query:function(q,e){ -_c81(this,q); -}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ -$.fn.combo.defaults.inputEvents.blur(e); -var _c91=e.data.target; -var opts=$(_c91).combotreegrid("options"); -if(opts.limitToGrid){ -_c85(_c91); -} -}}),filter:function(q,row){ -var opts=$(this).combotreegrid("options"); -return (row[opts.treeField]||"").toLowerCase().indexOf(q.toLowerCase())>=0; -}}); -})(jQuery); -(function($){ -function _c92(_c93){ -var _c94=$.data(_c93,"tagbox"); -var opts=_c94.options; -$(_c93).addClass("tagbox-f").combobox($.extend({},opts,{cls:"tagbox",reversed:true,onChange:function(_c95,_c96){ -_c97(); -$(this).combobox("hidePanel"); -opts.onChange.call(_c93,_c95,_c96); -},onResizing:function(_c98,_c99){ -var _c9a=$(this).combobox("textbox"); -var tb=$(this).data("textbox").textbox; -var _c9b=tb.outerWidth(); -tb.css({height:"",paddingLeft:_c9a.css("marginLeft"),paddingRight:_c9a.css("marginRight")}); -_c9a.css("margin",0); -tb._outerWidth(_c9b); -_cae(_c93); -_ca0(this); -opts.onResizing.call(_c93,_c98,_c99); -},onLoadSuccess:function(data){ -_c97(); -opts.onLoadSuccess.call(_c93,data); -}})); -_c97(); -_cae(_c93); -function _c97(){ -$(_c93).next().find(".tagbox-label").remove(); -var _c9c=$(_c93).tagbox("textbox"); -var ss=[]; -$.map($(_c93).tagbox("getValues"),function(_c9d,_c9e){ -var row=opts.finder.getRow(_c93,_c9d); -var text=opts.tagFormatter.call(_c93,_c9d,row); -var cs={}; -var css=opts.tagStyler.call(_c93,_c9d,row)||""; -if(typeof css=="string"){ -cs={s:css}; -}else{ -cs={c:css["class"]||"",s:css["style"]||""}; -} -var _c9f=$("").insertBefore(_c9c).html(text); -_c9f.attr("tagbox-index",_c9e); -_c9f.attr("style",cs.s).addClass(cs.c); -$("").appendTo(_c9f); -}); -_ca0(_c93); -$(_c93).combobox("setText",""); -}; -}; -function _ca0(_ca1,_ca2){ -var span=$(_ca1).next(); -var _ca3=_ca2?$(_ca2):span.find(".tagbox-label"); -if(_ca3.length){ -var _ca4=$(_ca1).tagbox("textbox"); -var _ca5=$(_ca3[0]); -var _ca6=_ca5.outerHeight(true)-_ca5.outerHeight(); -var _ca7=_ca4.outerHeight()-_ca6*2; -_ca3.css({height:_ca7+"px",lineHeight:_ca7+"px"}); -var _ca8=span.find(".textbox-addon").css("height","100%"); -_ca8.find(".textbox-icon").css("height","100%"); -span.find(".textbox-button").linkbutton("resize",{height:"100%"}); -} -}; -function _ca9(_caa){ -var span=$(_caa).next(); -span._unbind(".tagbox")._bind("click.tagbox",function(e){ -var opts=$(_caa).tagbox("options"); -if(opts.disabled||opts.readonly){ -return; -} -if($(e.target).hasClass("tagbox-remove")){ -var _cab=parseInt($(e.target).parent().attr("tagbox-index")); -var _cac=$(_caa).tagbox("getValues"); -if(opts.onBeforeRemoveTag.call(_caa,_cac[_cab])==false){ -return; -} -opts.onRemoveTag.call(_caa,_cac[_cab]); -_cac.splice(_cab,1); -$(_caa).tagbox("setValues",_cac); -}else{ -var _cad=$(e.target).closest(".tagbox-label"); -if(_cad.length){ -var _cab=parseInt(_cad.attr("tagbox-index")); -var _cac=$(_caa).tagbox("getValues"); -opts.onClickTag.call(_caa,_cac[_cab]); -} -} -$(this).find(".textbox-text").focus(); -})._bind("keyup.tagbox",function(e){ -_cae(_caa); -})._bind("mouseover.tagbox",function(e){ -if($(e.target).closest(".textbox-button,.textbox-addon,.tagbox-label").length){ -$(this).triggerHandler("mouseleave"); -}else{ -$(this).find(".textbox-text").triggerHandler("mouseenter"); -} -})._bind("mouseleave.tagbox",function(e){ -$(this).find(".textbox-text").triggerHandler("mouseleave"); -}); -}; -function _cae(_caf){ -var opts=$(_caf).tagbox("options"); -var _cb0=$(_caf).tagbox("textbox"); -var span=$(_caf).next(); -var tmp=$("").appendTo("body"); -tmp.attr("style",_cb0.attr("style")); -tmp.css({position:"absolute",top:-9999,left:-9999,width:"auto",fontFamily:_cb0.css("fontFamily"),fontSize:_cb0.css("fontSize"),fontWeight:_cb0.css("fontWeight"),whiteSpace:"nowrap"}); -var _cb1=_cb2(_cb0.val()); -var _cb3=_cb2(opts.prompt||""); -tmp.remove(); -var _cb4=Math.min(Math.max(_cb1,_cb3)+20,span.width()); -_cb0._outerWidth(_cb4); -span.find(".textbox-button").linkbutton("resize",{height:"100%"}); -function _cb2(val){ -var s=val.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"); -tmp.html(s); -return tmp.outerWidth(); -}; -}; -function _cb5(_cb6){ -var t=$(_cb6); -var opts=t.tagbox("options"); -if(opts.limitToList){ -var _cb7=t.tagbox("panel"); -var item=_cb7.children("div.combobox-item-hover"); -if(item.length){ -item.removeClass("combobox-item-hover"); -var row=opts.finder.getRow(_cb6,item); -var _cb8=row[opts.valueField]; -$(_cb6).tagbox(item.hasClass("combobox-item-selected")?"unselect":"select",_cb8); -} -$(_cb6).tagbox("hidePanel"); -}else{ -var v=$.trim($(_cb6).tagbox("getText")); -if(v!==""){ -var _cb9=$(_cb6).tagbox("getValues"); -_cb9.push(v); -$(_cb6).tagbox("setValues",_cb9); -} -} -}; -function _cba(_cbb,_cbc){ -$(_cbb).combobox("setText",""); -_cae(_cbb); -$(_cbb).combobox("setValues",_cbc); -$(_cbb).combobox("setText",""); -$(_cbb).tagbox("validate"); -}; -$.fn.tagbox=function(_cbd,_cbe){ -if(typeof _cbd=="string"){ -var _cbf=$.fn.tagbox.methods[_cbd]; -if(_cbf){ -return _cbf(this,_cbe); -}else{ -return this.combobox(_cbd,_cbe); -} -} -_cbd=_cbd||{}; -return this.each(function(){ -var _cc0=$.data(this,"tagbox"); -if(_cc0){ -$.extend(_cc0.options,_cbd); -}else{ -$.data(this,"tagbox",{options:$.extend({},$.fn.tagbox.defaults,$.fn.tagbox.parseOptions(this),_cbd)}); -} -_c92(this); -_ca9(this); -}); -}; -$.fn.tagbox.methods={options:function(jq){ -var _cc1=jq.combobox("options"); -return $.extend($.data(jq[0],"tagbox").options,{width:_cc1.width,height:_cc1.height,originalValue:_cc1.originalValue,disabled:_cc1.disabled,readonly:_cc1.readonly}); -},setValues:function(jq,_cc2){ -return jq.each(function(){ -_cba(this,_cc2); -}); -},reset:function(jq){ -return jq.each(function(){ -$(this).combobox("reset").combobox("setText",""); -}); -}}; -$.fn.tagbox.parseOptions=function(_cc3){ -return $.extend({},$.fn.combobox.parseOptions(_cc3),$.parser.parseOptions(_cc3,[])); -}; -$.fn.tagbox.defaults=$.extend({},$.fn.combobox.defaults,{hasDownArrow:false,multiple:true,reversed:true,selectOnNavigation:false,tipOptions:$.extend({},$.fn.textbox.defaults.tipOptions,{showDelay:200}),val:function(_cc4){ -var vv=$(_cc4).parent().prev().tagbox("getValues"); -if($(_cc4).is(":focus")){ -vv.push($(_cc4).val()); -} -return vv.join(","); -},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ -var _cc5=e.data.target; -var opts=$(_cc5).tagbox("options"); -if(opts.limitToList){ -_cb5(_cc5); -} -}}),keyHandler:$.extend({},$.fn.combobox.defaults.keyHandler,{enter:function(e){ -_cb5(this); -},query:function(q,e){ -var opts=$(this).tagbox("options"); -if(opts.limitToList){ -$.fn.combobox.defaults.keyHandler.query.call(this,q,e); -}else{ -$(this).combobox("hidePanel"); -} -}}),tagFormatter:function(_cc6,row){ -var opts=$(this).tagbox("options"); -return row?row[opts.textField]:_cc6; -},tagStyler:function(_cc7,row){ -return ""; -},onClickTag:function(_cc8){ -},onBeforeRemoveTag:function(_cc9){ -},onRemoveTag:function(_cca){ -}}); -})(jQuery); -(function($){ -function _ccb(_ccc){ -var _ccd=$.data(_ccc,"datebox"); -var opts=_ccd.options; -$(_ccc).addClass("datebox-f").combo($.extend({},opts,{onShowPanel:function(){ -_cce(this); -_ccf(this); -_cd0(this); -_cde(this,$(this).datebox("getText"),true); -opts.onShowPanel.call(this); -}})); -if(!_ccd.calendar){ -var _cd1=$(_ccc).combo("panel").css("overflow","hidden"); -_cd1.panel("options").onBeforeDestroy=function(){ -var c=$(this).find(".calendar-shared"); -if(c.length){ -c.insertBefore(c[0].pholder); -} -}; -var cc=$("
                                                ").prependTo(_cd1); -if(opts.sharedCalendar){ -var c=$(opts.sharedCalendar); -if(!c[0].pholder){ -c[0].pholder=$("
                                                ").insertAfter(c); -} -c.addClass("calendar-shared").appendTo(cc); -if(!c.hasClass("calendar")){ -c.calendar(); -} -_ccd.calendar=c; -}else{ -_ccd.calendar=$("
                                                ").appendTo(cc).calendar(); -} -$.extend(_ccd.calendar.calendar("options"),{fit:true,border:false,onSelect:function(date){ -var _cd2=this.target; -var opts=$(_cd2).datebox("options"); -opts.onSelect.call(_cd2,date); -_cde(_cd2,opts.formatter.call(_cd2,date)); -$(_cd2).combo("hidePanel"); -}}); -} -$(_ccc).combo("textbox").parent().addClass("datebox"); -$(_ccc).datebox("initValue",opts.value); -function _cce(_cd3){ -var opts=$(_cd3).datebox("options"); -var _cd4=$(_cd3).combo("panel"); -_cd4._unbind(".datebox")._bind("click.datebox",function(e){ -if($(e.target).hasClass("datebox-button-a")){ -var _cd5=parseInt($(e.target).attr("datebox-button-index")); -opts.buttons[_cd5].handler.call(e.target,_cd3); -} -}); -}; -function _ccf(_cd6){ -var _cd7=$(_cd6).combo("panel"); -if(_cd7.children("div.datebox-button").length){ -return; -} -var _cd8=$("
                                                ").appendTo(_cd7); -var tr=_cd8.find("tr"); -for(var i=0;i").appendTo(tr); -var btn=opts.buttons[i]; -var t=$("").html($.isFunction(btn.text)?btn.text(_cd6):btn.text).appendTo(td); -t.attr("datebox-button-index",i); -} -tr.find("td").css("width",(100/opts.buttons.length)+"%"); -}; -function _cd0(_cd9){ -var _cda=$(_cd9).combo("panel"); -var cc=_cda.children("div.datebox-calendar-inner"); -_cda.children()._outerWidth(_cda.width()); -_ccd.calendar.appendTo(cc); -_ccd.calendar[0].target=_cd9; -if(opts.panelHeight!="auto"){ -var _cdb=_cda.height(); -_cda.children().not(cc).each(function(){ -_cdb-=$(this).outerHeight(); -}); -cc._outerHeight(_cdb); -} -_ccd.calendar.calendar("resize"); -}; -}; -function _cdc(_cdd,q){ -_cde(_cdd,q,true); -}; -function _cdf(_ce0){ -var _ce1=$.data(_ce0,"datebox"); -var opts=_ce1.options; -var _ce2=_ce1.calendar.calendar("options").current; -if(_ce2){ -_cde(_ce0,opts.formatter.call(_ce0,_ce2)); -$(_ce0).combo("hidePanel"); -} -}; -function _cde(_ce3,_ce4,_ce5){ -var _ce6=$.data(_ce3,"datebox"); -var opts=_ce6.options; -var _ce7=_ce6.calendar; -_ce7.calendar("moveTo",opts.parser.call(_ce3,_ce4)); -if(_ce5){ -$(_ce3).combo("setValue",_ce4); -}else{ -if(_ce4){ -_ce4=opts.formatter.call(_ce3,_ce7.calendar("options").current); -} -$(_ce3).combo("setText",_ce4).combo("setValue",_ce4); -} -}; -$.fn.datebox=function(_ce8,_ce9){ -if(typeof _ce8=="string"){ -var _cea=$.fn.datebox.methods[_ce8]; -if(_cea){ -return _cea(this,_ce9); -}else{ -return this.combo(_ce8,_ce9); -} -} -_ce8=_ce8||{}; -return this.each(function(){ -var _ceb=$.data(this,"datebox"); -if(_ceb){ -$.extend(_ceb.options,_ce8); -}else{ -$.data(this,"datebox",{options:$.extend({},$.fn.datebox.defaults,$.fn.datebox.parseOptions(this),_ce8)}); -} -_ccb(this); -}); -}; -$.fn.datebox.methods={options:function(jq){ -var _cec=jq.combo("options"); -return $.extend($.data(jq[0],"datebox").options,{width:_cec.width,height:_cec.height,originalValue:_cec.originalValue,disabled:_cec.disabled,readonly:_cec.readonly}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).combo("cloneFrom",from); -$.data(this,"datebox",{options:$.extend(true,{},$(from).datebox("options")),calendar:$(from).datebox("calendar")}); -$(this).addClass("datebox-f"); -}); -},calendar:function(jq){ -return $.data(jq[0],"datebox").calendar; -},initValue:function(jq,_ced){ -return jq.each(function(){ -var opts=$(this).datebox("options"); -if(_ced){ -var date=opts.parser.call(this,_ced); -_ced=opts.formatter.call(this,date); -$(this).datebox("calendar").calendar("moveTo",date); -} -$(this).combo("initValue",_ced).combo("setText",_ced); -}); -},setValue:function(jq,_cee){ -return jq.each(function(){ -_cde(this,_cee); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).datebox("options"); -$(this).datebox("setValue",opts.originalValue); -}); -},setDate:function(jq,date){ -return jq.each(function(){ -var opts=$(this).datebox("options"); -$(this).datebox("calendar").calendar("moveTo",date); -_cde(this,date?opts.formatter.call(this,date):""); -}); -},getDate:function(jq){ -if(jq.datebox("getValue")){ -return jq.datebox("calendar").calendar("options").current; -}else{ -return null; -} -}}; -$.fn.datebox.parseOptions=function(_cef){ -return $.extend({},$.fn.combo.parseOptions(_cef),$.parser.parseOptions(_cef,["sharedCalendar"])); -}; -$.fn.datebox.defaults=$.extend({},$.fn.combo.defaults,{panelWidth:250,panelHeight:"auto",sharedCalendar:null,keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_cdf(this); -},query:function(q,e){ -_cdc(this,q); -}},currentText:"Today",closeText:"Close",okText:"Ok",buttons:[{text:function(_cf0){ -return $(_cf0).datebox("options").currentText; -},handler:function(_cf1){ -var opts=$(_cf1).datebox("options"); -var now=new Date(); -var _cf2=new Date(now.getFullYear(),now.getMonth(),now.getDate()); -$(_cf1).datebox("calendar").calendar({year:_cf2.getFullYear(),month:_cf2.getMonth()+1,current:_cf2}); -opts.onSelect.call(_cf1,_cf2); -_cdf(_cf1); -}},{text:function(_cf3){ -return $(_cf3).datebox("options").closeText; -},handler:function(_cf4){ -$(this).closest("div.combo-panel").panel("close"); -}}],formatter:function(date){ -var y=date.getFullYear(); -var m=date.getMonth()+1; -var d=date.getDate(); -return (m<10?("0"+m):m)+"/"+(d<10?("0"+d):d)+"/"+y; -},parser:function(s){ -var _cf5=$.fn.calendar.defaults.Date; -if($(this).data("datebox")){ -_cf5=$(this).datebox("calendar").calendar("options").Date; -} -if(!s){ -return new _cf5(); -} -var ss=s.split("/"); -var m=parseInt(ss[0],10); -var d=parseInt(ss[1],10); -var y=parseInt(ss[2],10); -if(!isNaN(y)&&!isNaN(m)&&!isNaN(d)){ -return new _cf5(y,m-1,d); -}else{ -return new _cf5(); -} -},onSelect:function(date){ -}}); -})(jQuery); -(function($){ -function _cf6(_cf7){ -var _cf8=$.data(_cf7,"datetimebox"); -var opts=_cf8.options; -$(_cf7).datebox($.extend({},opts,{onShowPanel:function(){ -var _cf9=$(this).datetimebox("getValue"); -_cff(this,_cf9,true); -opts.onShowPanel.call(this); -},formatter:$.fn.datebox.defaults.formatter,parser:$.fn.datebox.defaults.parser})); -$(_cf7).removeClass("datebox-f").addClass("datetimebox-f"); -$(_cf7).datebox("calendar").calendar({onSelect:function(date){ -opts.onSelect.call(this.target,date); -}}); -if(!_cf8.spinner){ -var _cfa=$(_cf7).datebox("panel"); -var p=$("
                                                ").insertAfter(_cfa.children("div.datebox-calendar-inner")); -_cf8.spinner=p.children("input"); -} -_cf8.spinner.timespinner({width:opts.spinnerWidth,showSeconds:opts.showSeconds,separator:opts.timeSeparator,hour12:opts.hour12}); -$(_cf7).datetimebox("initValue",opts.value); -}; -function _cfb(_cfc){ -var c=$(_cfc).datetimebox("calendar"); -var t=$(_cfc).datetimebox("spinner"); -var date=c.calendar("options").current; -return new Date(date.getFullYear(),date.getMonth(),date.getDate(),t.timespinner("getHours"),t.timespinner("getMinutes"),t.timespinner("getSeconds")); -}; -function _cfd(_cfe,q){ -_cff(_cfe,q,true); -}; -function _d00(_d01){ -var opts=$.data(_d01,"datetimebox").options; -var date=_cfb(_d01); -_cff(_d01,opts.formatter.call(_d01,date)); -$(_d01).combo("hidePanel"); -}; -function _cff(_d02,_d03,_d04){ -var opts=$.data(_d02,"datetimebox").options; -$(_d02).combo("setValue",_d03); -if(!_d04){ -if(_d03){ -var date=opts.parser.call(_d02,_d03); -$(_d02).combo("setText",opts.formatter.call(_d02,date)); -$(_d02).combo("setValue",opts.formatter.call(_d02,date)); -}else{ -$(_d02).combo("setText",_d03); -} -} -var date=opts.parser.call(_d02,_d03); -$(_d02).datetimebox("calendar").calendar("moveTo",date); -$(_d02).datetimebox("spinner").timespinner("setValue",_d05(date)); -function _d05(date){ -function _d06(_d07){ -return (_d07<10?"0":"")+_d07; -}; -var tt=[_d06(date.getHours()),_d06(date.getMinutes())]; -if(opts.showSeconds){ -tt.push(_d06(date.getSeconds())); -} -return tt.join($(_d02).datetimebox("spinner").timespinner("options").separator); -}; -}; -$.fn.datetimebox=function(_d08,_d09){ -if(typeof _d08=="string"){ -var _d0a=$.fn.datetimebox.methods[_d08]; -if(_d0a){ -return _d0a(this,_d09); -}else{ -return this.datebox(_d08,_d09); -} -} -_d08=_d08||{}; -return this.each(function(){ -var _d0b=$.data(this,"datetimebox"); -if(_d0b){ -$.extend(_d0b.options,_d08); -}else{ -$.data(this,"datetimebox",{options:$.extend({},$.fn.datetimebox.defaults,$.fn.datetimebox.parseOptions(this),_d08)}); -} -_cf6(this); -}); -}; -$.fn.datetimebox.methods={options:function(jq){ -var _d0c=jq.datebox("options"); -return $.extend($.data(jq[0],"datetimebox").options,{originalValue:_d0c.originalValue,disabled:_d0c.disabled,readonly:_d0c.readonly}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).datebox("cloneFrom",from); -$.data(this,"datetimebox",{options:$.extend(true,{},$(from).datetimebox("options")),spinner:$(from).datetimebox("spinner")}); -$(this).removeClass("datebox-f").addClass("datetimebox-f"); -}); -},spinner:function(jq){ -return $.data(jq[0],"datetimebox").spinner; -},initValue:function(jq,_d0d){ -return jq.each(function(){ -var opts=$(this).datetimebox("options"); -var _d0e=opts.value; -if(_d0e){ -var date=opts.parser.call(this,_d0e); -_d0e=opts.formatter.call(this,date); -$(this).datetimebox("calendar").calendar("moveTo",date); -} -$(this).combo("initValue",_d0e).combo("setText",_d0e); -}); -},setValue:function(jq,_d0f){ -return jq.each(function(){ -_cff(this,_d0f); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).datetimebox("options"); -$(this).datetimebox("setValue",opts.originalValue); -}); -},setDate:function(jq,date){ -return jq.each(function(){ -var opts=$(this).datetimebox("options"); -$(this).datetimebox("calendar").calendar("moveTo",date); -_cff(this,date?opts.formatter.call(this,date):""); -}); -},getDate:function(jq){ -if(jq.datetimebox("getValue")){ -return jq.datetimebox("calendar").calendar("options").current; -}else{ -return null; -} -}}; -$.fn.datetimebox.parseOptions=function(_d10){ -var t=$(_d10); -return $.extend({},$.fn.datebox.parseOptions(_d10),$.parser.parseOptions(_d10,["timeSeparator","spinnerWidth",{showSeconds:"boolean"}])); -}; -$.fn.datetimebox.defaults=$.extend({},$.fn.datebox.defaults,{spinnerWidth:"100%",showSeconds:true,timeSeparator:":",hour12:false,panelEvents:{mousedown:function(e){ -}},keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_d00(this); -},query:function(q,e){ -_cfd(this,q); -}},buttons:[{text:function(_d11){ -return $(_d11).datetimebox("options").currentText; -},handler:function(_d12){ -var opts=$(_d12).datetimebox("options"); -_cff(_d12,opts.formatter.call(_d12,new Date())); -$(_d12).datetimebox("hidePanel"); -}},{text:function(_d13){ -return $(_d13).datetimebox("options").okText; -},handler:function(_d14){ -_d00(_d14); -}},{text:function(_d15){ -return $(_d15).datetimebox("options").closeText; -},handler:function(_d16){ -$(_d16).datetimebox("hidePanel"); -}}],formatter:function(date){ -if(!date){ -return ""; -} -return $.fn.datebox.defaults.formatter.call(this,date)+" "+$.fn.timespinner.defaults.formatter.call($(this).datetimebox("spinner")[0],date); -},parser:function(s){ -s=$.trim(s); -if(!s){ -return new Date(); -} -var dt=s.split(" "); -var _d17=$.fn.datebox.defaults.parser.call(this,dt[0]); -if(dt.length<2){ -return _d17; -} -var _d18=$.fn.timespinner.defaults.parser.call($(this).datetimebox("spinner")[0],dt[1]+(dt[2]?" "+dt[2]:"")); -return new Date(_d17.getFullYear(),_d17.getMonth(),_d17.getDate(),_d18.getHours(),_d18.getMinutes(),_d18.getSeconds()); -}}); -})(jQuery); -(function($){ -function _d19(_d1a){ -var _d1b=$.data(_d1a,"timepicker"); -var opts=_d1b.options; -$(_d1a).addClass("timepicker-f").combo($.extend({},opts,{onShowPanel:function(){ -_d1c(this); -_d1d(_d1a); -_d27(_d1a,$(_d1a).timepicker("getValue")); -}})); -$(_d1a).timepicker("initValue",opts.value); -function _d1c(_d1e){ -var opts=$(_d1e).timepicker("options"); -var _d1f=$(_d1e).combo("panel"); -_d1f._unbind(".timepicker")._bind("click.timepicker",function(e){ -if($(e.target).hasClass("datebox-button-a")){ -var _d20=parseInt($(e.target).attr("datebox-button-index")); -opts.buttons[_d20].handler.call(e.target,_d1e); -} -}); -}; -function _d1d(_d21){ -var _d22=$(_d21).combo("panel"); -if(_d22.children("div.datebox-button").length){ -return; -} -var _d23=$("
                                                ").appendTo(_d22); -var tr=_d23.find("tr"); -for(var i=0;i").appendTo(tr); -var btn=opts.buttons[i]; -var t=$("").html($.isFunction(btn.text)?btn.text(_d21):btn.text).appendTo(td); -t.attr("datebox-button-index",i); -} -tr.find("td").css("width",(100/opts.buttons.length)+"%"); -}; -}; -function _d24(_d25,_d26){ -var opts=$(_d25).data("timepicker").options; -_d27(_d25,_d26); -opts.value=_d28(_d25); -$(_d25).combo("setValue",opts.value).combo("setText",opts.value); -}; -function _d27(_d29,_d2a){ -var opts=$(_d29).data("timepicker").options; -if(_d2a){ -var _d2b=_d2a.split(" "); -var hm=_d2b[0].split(":"); -opts.selectingHour=parseInt(hm[0],10); -opts.selectingMinute=parseInt(hm[1],10); -opts.selectingAmpm=_d2b[1]; -}else{ -opts.selectingHour=12; -opts.selectingMinute=0; -opts.selectingAmpm=opts.ampm[0]; -} -_d2c(_d29); -}; -function _d28(_d2d){ -var opts=$(_d2d).data("timepicker").options; -var h=opts.selectingHour; -var m=opts.selectingMinute; -var ampm=opts.selectingAmpm; -if(!ampm){ -ampm=opts.ampm[0]; -} -var v=(h<10?"0"+h:h)+":"+(m<10?"0"+m:m); -if(!opts.hour24){ -v+=" "+ampm; -} -return v; -}; -function _d2c(_d2e){ -var opts=$(_d2e).data("timepicker").options; -var _d2f=$(_d2e).combo("panel"); -var _d30=_d2f.children(".timepicker-panel"); -if(!_d30.length){ -var _d30=$("
                                                ").prependTo(_d2f); -} -_d30.empty(); -if(opts.panelHeight!="auto"){ -var _d31=_d2f.height()-_d2f.find(".datebox-button").outerHeight(); -_d30._outerHeight(_d31); -} -_d32(_d2e); -_d33(_d2e); -_d30.off(".timepicker"); -_d30.on("click.timepicker",".title-hour",function(e){ -opts.selectingType="hour"; -_d2c(_d2e); -}).on("click.timepicker",".title-minute",function(e){ -opts.selectingType="minute"; -_d2c(_d2e); -}).on("click.timepicker",".title-am",function(e){ -opts.selectingAmpm=opts.ampm[0]; -_d2c(_d2e); -}).on("click.timepicker",".title-pm",function(e){ -opts.selectingAmpm=opts.ampm[1]; -_d2c(_d2e); -}).on("click.timepicker",".item",function(e){ -var _d34=parseInt($(this).text(),10); -if(opts.selectingType=="hour"){ -opts.selectingHour=_d34; -}else{ -opts.selectingMinute=_d34; -} -_d2c(_d2e); -}); -}; -function _d32(_d35){ -var opts=$(_d35).data("timepicker").options; -var _d36=$(_d35).combo("panel"); -var _d37=_d36.find(".timepicker-panel"); -var hour=opts.selectingHour; -var _d38=opts.selectingMinute; -$("
                                                "+"
                                                "+(hour<10?"0"+hour:hour)+"
                                                "+"
                                                :
                                                "+"
                                                "+(_d38<10?"0"+_d38:_d38)+"
                                                "+"
                                                "+"
                                                "+opts.ampm[0]+"
                                                "+"
                                                "+opts.ampm[1]+"
                                                "+"
                                                "+"
                                                ").appendTo(_d37); -var _d39=_d37.find(".panel-header"); -if(opts.selectingType=="hour"){ -_d39.find(".title-hour").addClass("title-selected"); -}else{ -_d39.find(".title-minute").addClass("title-selected"); -} -if(opts.selectingAmpm==opts.ampm[0]){ -_d39.find(".title-am").addClass("title-selected"); -} -if(opts.selectingAmpm==opts.ampm[1]){ -_d39.find(".title-pm").addClass("title-selected"); -} -if(opts.hour24){ -_d39.find(".ampm").hide(); -} -}; -function _d33(_d3a){ -var opts=$(_d3a).data("timepicker").options; -var _d3b=$(_d3a).combo("panel"); -var _d3c=_d3b.find(".timepicker-panel"); -var _d3d=$("
                                                "+"
                                                ").appendTo(_d3c); -var _d3e=_d3d.outerWidth(); -var _d3f=_d3d.outerHeight(); -var size=Math.min(_d3e,_d3f)-20; -var _d40=size/2; -_d3e=size; -_d3f=size; -var _d41=opts.selectingType=="hour"?opts.selectingHour:opts.selectingMinute; -var _d42=_d41/(opts.selectingType=="hour"?12:60)*360; -_d42=parseFloat(_d42).toFixed(4); -var _d43={transform:"rotate("+_d42+"deg)",}; -if(opts.hour24&&opts.selectingType=="hour"){ -if(_d41==0){ -_d43.top=opts.hourDistance[0]+"px"; -}else{ -if(_d41<=12){ -_d43.top=opts.hourDistance[1]+"px"; -} -} -} -var _d44={width:_d3e+"px",height:_d3f+"px",marginLeft:-_d3e/2+"px",marginTop:-_d3f/2+"px"}; -var _d45=[]; -_d45.push("
                                                "); -_d45.push("
                                                "); -_d45.push("
                                                "); -_d45.push("
                                                "); -_d45.push("
                                                "); -var data=_d46(); -if(opts.hour24&&opts.selectingType=="hour"){ -for(var i=0;i"+(_d47)+"
                                                "); -} -_d40-=opts.hourDistance[1]-opts.hourDistance[0]; -} -for(var i=0;i"+_d47+""); -} -_d45.push(""); -_d3d.html(_d45.join("")); -_d3d.find(".clock").css(_d44); -_d3d.find(".hand").css(_d43); -function _d46(){ -var data=[]; -if(opts.selectingType=="hour"){ -for(var i=0;i<12;i++){ -data.push(String(i)); -} -data[0]="12"; -}else{ -for(var i=0;i<60;i+=5){ -data.push(i<10?"0"+i:String(i)); -} -data[0]="00"; -} -return data; -}; -}; -$.fn.timepicker=function(_d49,_d4a){ -if(typeof _d49=="string"){ -var _d4b=$.fn.timepicker.methods[_d49]; -if(_d4b){ -return _d4b(this,_d4a); -}else{ -return this.combo(_d49,_d4a); -} -} -_d49=_d49||{}; -return this.each(function(){ -var _d4c=$.data(this,"timepicker"); -if(_d4c){ -$.extend(_d4c.options,_d49); -}else{ -$.data(this,"timepicker",{options:$.extend({},$.fn.timepicker.defaults,$.fn.timepicker.parseOptions(this),_d49)}); -} -_d19(this); -}); -}; -$.fn.timepicker.methods={options:function(jq){ -var _d4d=jq.combo("options"); -return $.extend($.data(jq[0],"timepicker").options,{width:_d4d.width,height:_d4d.height,originalValue:_d4d.originalValue,disabled:_d4d.disabled,readonly:_d4d.readonly}); -},initValue:function(jq,_d4e){ -return jq.each(function(){ -var opts=$(this).timepicker("options"); -opts.value=_d4e; -_d27(this,_d4e); -if(_d4e){ -opts.value=_d28(this); -$(this).combo("initValue",opts.value).combo("setText",opts.value); -} -}); -},setValue:function(jq,_d4f){ -return jq.each(function(){ -_d24(this,_d4f); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).timepicker("options"); -$(this).timepicker("setValue",opts.originalValue); -}); -}}; -$.fn.timepicker.parseOptions=function(_d50){ -return $.extend({},$.fn.combo.parseOptions(_d50),$.parser.parseOptions(_d50,[{hour24:"boolean"}])); -}; -$.fn.timepicker.defaults=$.extend({},$.fn.combo.defaults,{closeText:"Close",okText:"Ok",buttons:[{text:function(_d51){ -return $(_d51).timepicker("options").okText; -},handler:function(_d52){ -$(_d52).timepicker("setValue",_d28(_d52)); -$(this).closest("div.combo-panel").panel("close"); -}},{text:function(_d53){ -return $(_d53).timepicker("options").closeText; -},handler:function(_d54){ -$(this).closest("div.combo-panel").panel("close"); -}}],editable:false,ampm:["am","pm"],value:"",selectingHour:12,selectingMinute:0,selectingType:"hour",hour24:false,hourDistance:[20,50]}); -})(jQuery); -(function($){ -function init(_d55){ -var _d56=$("
                                                "+"
                                                "+""+""+"
                                                "+"
                                                "+"
                                                "+"
                                                "+""+"
                                                ").insertAfter(_d55); -var t=$(_d55); -t.addClass("slider-f").hide(); -var name=t.attr("name"); -if(name){ -_d56.find("input.slider-value").attr("name",name); -t.removeAttr("name").attr("sliderName",name); -} -_d56._bind("_resize",function(e,_d57){ -if($(this).hasClass("easyui-fluid")||_d57){ -_d58(_d55); -} -return false; -}); -return _d56; -}; -function _d58(_d59,_d5a){ -var _d5b=$.data(_d59,"slider"); -var opts=_d5b.options; -var _d5c=_d5b.slider; -if(_d5a){ -if(_d5a.width){ -opts.width=_d5a.width; -} -if(_d5a.height){ -opts.height=_d5a.height; -} -} -_d5c._size(opts); -if(opts.mode=="h"){ -_d5c.css("height",""); -_d5c.children("div").css("height",""); -}else{ -_d5c.css("width",""); -_d5c.children("div").css("width",""); -_d5c.children("div.slider-rule,div.slider-rulelabel,div.slider-inner")._outerHeight(_d5c._outerHeight()); -} -_d5d(_d59); -}; -function _d5e(_d5f){ -var _d60=$.data(_d5f,"slider"); -var opts=_d60.options; -var _d61=_d60.slider; -var aa=opts.mode=="h"?opts.rule:opts.rule.slice(0).reverse(); -if(opts.reversed){ -aa=aa.slice(0).reverse(); -} -_d62(aa); -function _d62(aa){ -var rule=_d61.find("div.slider-rule"); -var _d63=_d61.find("div.slider-rulelabel"); -rule.empty(); -_d63.empty(); -for(var i=0;i").appendTo(rule); -span.css((opts.mode=="h"?"left":"top"),_d64); -if(aa[i]!="|"){ -span=$("").appendTo(_d63); -span.html(aa[i]); -if(opts.mode=="h"){ -span.css({left:_d64,marginLeft:-Math.round(span.outerWidth()/2)}); -}else{ -span.css({top:_d64,marginTop:-Math.round(span.outerHeight()/2)}); -} -} -} -}; -}; -function _d65(_d66){ -var _d67=$.data(_d66,"slider"); -var opts=_d67.options; -var _d68=_d67.slider; -_d68.removeClass("slider-h slider-v slider-disabled"); -_d68.addClass(opts.mode=="h"?"slider-h":"slider-v"); -_d68.addClass(opts.disabled?"slider-disabled":""); -var _d69=_d68.find(".slider-inner"); -_d69.html(""+""); -if(opts.range){ -_d69.append(""+""); -} -_d68.find("a.slider-handle").draggable({axis:opts.mode,cursor:"pointer",disabled:opts.disabled,onDrag:function(e){ -var left=e.data.left; -var _d6a=_d68.width(); -if(opts.mode!="h"){ -left=e.data.top; -_d6a=_d68.height(); -} -if(left<0||left>_d6a){ -return false; -}else{ -_d6b(left,this); -return false; -} -},onStartDrag:function(){ -_d67.isDragging=true; -opts.onSlideStart.call(_d66,opts.value); -},onStopDrag:function(e){ -_d6b(opts.mode=="h"?e.data.left:e.data.top,this); -opts.onSlideEnd.call(_d66,opts.value); -opts.onComplete.call(_d66,opts.value); -_d67.isDragging=false; -}}); -_d68.find("div.slider-inner")._unbind(".slider")._bind("mousedown.slider",function(e){ -if(_d67.isDragging||opts.disabled){ -return; -} -var pos=$(this).offset(); -_d6b(opts.mode=="h"?(e.pageX-pos.left):(e.pageY-pos.top)); -opts.onComplete.call(_d66,opts.value); -}); -function _d6c(_d6d){ -var dd=String(opts.step).split("."); -var dlen=dd.length>1?dd[1].length:0; -return parseFloat(_d6d.toFixed(dlen)); -}; -function _d6b(pos,_d6e){ -var _d6f=_d70(_d66,pos); -var s=Math.abs(_d6f%opts.step); -if(_d6f>=0){ -if(s0; -if(_d6f<=v2&&_d71){ -v1=_d6f; -}else{ -if(_d6f>=v1&&(!_d71)){ -v2=_d6f; -} -} -}else{ -if(_d6fv2){ -v2=_d6f; -}else{ -_d6fopts.max){ -_d79=opts.max; -} -var _d7a=$("").appendTo(_d76); -_d7a.attr("name",name); -_d7a.val(_d79); -_d78.push(_d79); -var _d7b=_d76.find(".slider-handle:eq("+i+")"); -var tip=_d7b.next(); -var pos=_d7c(_d73,_d79); -if(opts.showTip){ -tip.show(); -tip.html(opts.tipFormatter.call(_d73,_d79)); -}else{ -tip.hide(); -} -if(opts.mode=="h"){ -var _d7d="left:"+pos+"px;"; -_d7b.attr("style",_d7d); -tip.attr("style",_d7d+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px"); -}else{ -var _d7d="top:"+pos+"px;"; -_d7b.attr("style",_d7d); -tip.attr("style",_d7d+"margin-left:"+(-Math.round(tip.outerWidth()))+"px"); -} -} -opts.value=opts.range?_d78:_d78[0]; -$(_d73).val(opts.range?_d78.join(opts.separator):_d78[0]); -if(_d77.join(",")!=_d78.join(",")){ -opts.onChange.call(_d73,opts.value,(opts.range?_d77:_d77[0])); -} -}; -function _d5d(_d7e){ -var opts=$.data(_d7e,"slider").options; -var fn=opts.onChange; -opts.onChange=function(){ -}; -_d72(_d7e,opts.value); -opts.onChange=fn; -}; -function _d7c(_d7f,_d80){ -var _d81=$.data(_d7f,"slider"); -var opts=_d81.options; -var _d82=_d81.slider; -var size=opts.mode=="h"?_d82.width():_d82.height(); -var pos=opts.converter.toPosition.call(_d7f,_d80,size); -if(opts.mode=="v"){ -pos=_d82.height()-pos; -} -if(opts.reversed){ -pos=size-pos; -} -return pos; -}; -function _d70(_d83,pos){ -var _d84=$.data(_d83,"slider"); -var opts=_d84.options; -var _d85=_d84.slider; -var size=opts.mode=="h"?_d85.width():_d85.height(); -var pos=opts.mode=="h"?(opts.reversed?(size-pos):pos):(opts.reversed?pos:(size-pos)); -var _d86=opts.converter.toValue.call(_d83,pos,size); -return _d86; -}; -$.fn.slider=function(_d87,_d88){ -if(typeof _d87=="string"){ -return $.fn.slider.methods[_d87](this,_d88); -} -_d87=_d87||{}; -return this.each(function(){ -var _d89=$.data(this,"slider"); -if(_d89){ -$.extend(_d89.options,_d87); -}else{ -_d89=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_d87),slider:init(this)}); -$(this)._propAttr("disabled",false); -} -var opts=_d89.options; -opts.min=parseFloat(opts.min); -opts.max=parseFloat(opts.max); -if(opts.range){ -if(!$.isArray(opts.value)){ -opts.value=$.map(String(opts.value).split(opts.separator),function(v){ -return parseFloat(v); -}); -} -if(opts.value.length<2){ -opts.value.push(opts.max); -} -}else{ -opts.value=parseFloat(opts.value); -} -opts.step=parseFloat(opts.step); -opts.originalValue=opts.value; -_d65(this); -_d5e(this); -_d58(this); -}); -}; -$.fn.slider.methods={options:function(jq){ -return $.data(jq[0],"slider").options; -},destroy:function(jq){ -return jq.each(function(){ -$.data(this,"slider").slider.remove(); -$(this).remove(); -}); -},resize:function(jq,_d8a){ -return jq.each(function(){ -_d58(this,_d8a); -}); -},getValue:function(jq){ -return jq.slider("options").value; -},getValues:function(jq){ -return jq.slider("options").value; -},setValue:function(jq,_d8b){ -return jq.each(function(){ -_d72(this,[_d8b]); -}); -},setValues:function(jq,_d8c){ -return jq.each(function(){ -_d72(this,_d8c); -}); -},clear:function(jq){ -return jq.each(function(){ -var opts=$(this).slider("options"); -_d72(this,opts.range?[opts.min,opts.max]:[opts.min]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).slider("options"); -$(this).slider(opts.range?"setValues":"setValue",opts.originalValue); -}); -},enable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=false; -_d65(this); -}); -},disable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=true; -_d65(this); -}); -}}; -$.fn.slider.parseOptions=function(_d8d){ -var t=$(_d8d); -return $.extend({},$.parser.parseOptions(_d8d,["width","height","mode",{reversed:"boolean",showTip:"boolean",range:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)}); -}; -$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,range:false,value:0,separator:",",min:0,max:100,step:1,rule:[],tipFormatter:function(_d8e){ -return _d8e; -},converter:{toPosition:function(_d8f,size){ -var opts=$(this).slider("options"); -var p=(_d8f-opts.min)/(opts.max-opts.min)*size; -return p; -},toValue:function(pos,size){ -var opts=$(this).slider("options"); -var v=opts.min+(opts.max-opts.min)*(pos/size); -return v; -}},onChange:function(_d90,_d91){ -},onSlideStart:function(_d92){ -},onSlideEnd:function(_d93){ -},onComplete:function(_d94){ -}}; -})(jQuery); - diff --git a/src/UWE_projectCode/前后端信息交互引用库/jquery.easyui.mobile.js b/src/UWE_projectCode/前后端信息交互引用库/jquery.easyui.mobile.js deleted file mode 100644 index a399f77..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/jquery.easyui.mobile.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * EasyUI for jQuery 1.10.16 - * - * Copyright (c) 2009-2023 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -$.fn.navpanel=function(_1,_2){ -if(typeof _1=="string"){ -var _3=$.fn.navpanel.methods[_1]; -return _3?_3(this,_2):this.panel(_1,_2); -}else{ -_1=_1||{}; -return this.each(function(){ -var _4=$.data(this,"navpanel"); -if(_4){ -$.extend(_4.options,_1); -}else{ -_4=$.data(this,"navpanel",{options:$.extend({},$.fn.navpanel.defaults,$.fn.navpanel.parseOptions(this),_1)}); -} -$(this).panel(_4.options); -}); -} -}; -$.fn.navpanel.methods={options:function(jq){ -return $.data(jq[0],"navpanel").options; -}}; -$.fn.navpanel.parseOptions=function(_5){ -return $.extend({},$.fn.panel.parseOptions(_5),$.parser.parseOptions(_5,[])); -}; -$.fn.navpanel.defaults=$.extend({},$.fn.panel.defaults,{fit:true,border:false,cls:"navpanel"}); -$.parser.plugins.push("navpanel"); -})(jQuery); -(function($){ -$(function(){ -$.mobile.init(); -}); -$.mobile={defaults:{animation:"slide",direction:"left",reverseDirections:{up:"down",down:"up",left:"right",right:"left"}},panels:[],init:function(_6){ -$.mobile.panels=[]; -var _7=$(_6||"body").children(".navpanel:visible"); -if(_7.length){ -_7.not(":first").children(".panel-body").navpanel("close"); -var p=_7.eq(0).children(".panel-body"); -$.mobile.panels.push({panel:p,animation:$.mobile.defaults.animation,direction:$.mobile.defaults.direction}); -} -$(document)._unbind(".mobile")._bind("click.mobile",function(e){ -var a=$(e.target).closest("a"); -if(a.length){ -var _8=$.parser.parseOptions(a[0],["animation","direction",{back:"boolean"}]); -if(_8.back){ -$.mobile.back(); -e.preventDefault(); -}else{ -var _9=$.trim(a.attr("href")); -if(/^#/.test(_9)){ -var to=$(_9); -if(to.length&&to.hasClass("panel-body")){ -$.mobile.go(to,_8.animation,_8.direction); -e.preventDefault(); -} -} -} -} -}); -$(window)._unbind(".mobile")._bind("hashchange.mobile",function(){ -var _a=$.mobile.panels.length; -if(_a>1){ -var _b=location.hash; -var p=$.mobile.panels[_a-2]; -if(!_b||_b=="#&"+p.panel.attr("id")){ -$.mobile._back(); -} -} -}); -},nav:function(_c,to,_d,_e){ -if(window.WebKitAnimationEvent||window.AnimationEvent){ -_d=_d!=undefined?_d:$.mobile.defaults.animation; -_e=_e!=undefined?_e:$.mobile.defaults.direction; -var _f="m-"+_d+(_e?"-"+_e:""); -var p1=$(_c).panel("open").panel("resize").panel("panel"); -var p2=$(to).panel("open").panel("resize").panel("panel"); -p1.add(p2)._bind("webkitAnimationEnd",function(){ -$(this)._unbind("webkitAnimationEnd"); -var p=$(this).children(".panel-body"); -if($(this).hasClass("m-in")){ -p.panel("open").panel("resize"); -}else{ -p.panel("close"); -} -$(this).removeClass(_f+" m-in m-out"); -}); -p2.addClass(_f+" m-in"); -p1.addClass(_f+" m-out"); -}else{ -$(to).panel("open").panel("resize"); -$(_c).panel("close"); -} -},_go:function(_10,_11,_12){ -_11=_11!=undefined?_11:$.mobile.defaults.animation; -_12=_12!=undefined?_12:$.mobile.defaults.direction; -var _13=$.mobile.panels[$.mobile.panels.length-1].panel; -var to=$(_10); -if(_13[0]!=to[0]){ -$.mobile.nav(_13,to,_11,_12); -$.mobile.panels.push({panel:to,animation:_11,direction:_12}); -} -},_back:function(){ -if($.mobile.panels.length<2){ -return; -} -var p1=$.mobile.panels.pop(); -var p2=$.mobile.panels[$.mobile.panels.length-1]; -var _14=p1.animation; -var _15=$.mobile.defaults.reverseDirections[p1.direction]||""; -$.mobile.nav(p1.panel,p2.panel,_14,_15); -},go:function(_16,_17,_18){ -_17=_17!=undefined?_17:$.mobile.defaults.animation; -_18=_18!=undefined?_18:$.mobile.defaults.direction; -location.hash="#&"+$(_16).attr("id"); -$.mobile._go(_16,_17,_18); -},back:function(){ -history.go(-1); -}}; -$.map(["validatebox","textbox","passwordbox","filebox","searchbox","combo","combobox","combogrid","combotree","combotreegrid","datebox","datetimebox","numberbox","spinner","numberspinner","timespinner","datetimespinner"],function(_19){ -if($.fn[_19]){ -$.extend($.fn[_19].defaults,{iconWidth:28,tipPosition:"bottom"}); -} -}); -$.map(["spinner","numberspinner","timespinner","datetimespinner"],function(_1a){ -if($.fn[_1a]){ -$.extend($.fn[_1a].defaults,{iconWidth:56,spinAlign:"horizontal"}); -} -}); -if($.fn.menu){ -$.extend($.fn.menu.defaults,{itemHeight:30,noline:true}); -} -})(jQuery); - diff --git a/src/UWE_projectCode/前后端信息交互引用库/jquery.min.js b/src/UWE_projectCode/前后端信息交互引用库/jquery.min.js deleted file mode 100644 index 4d9b3a2..0000000 --- a/src/UWE_projectCode/前后端信息交互引用库/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
                                                "],col:[2,"","
                                                "],tr:[2,"","
                                                "],td:[3,"","
                                                "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("

                                                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 U?LA{-`GQ6lIsRY!!Tjj`UqEaWmH+?% literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-13.jpg b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready-13.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b75b3ab90aa5ee8ca3c9ca593d2e35a096a807de GIT binary patch literal 49023 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 literal 0 HcmV?d00001 diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready.spq b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready.spq new file mode 100644 index 0000000..78e2018 --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready.spq @@ -0,0 +1,101 @@ +// ---------------------------------------------------------------------------- +// SpyGlass GuideWare Goal File +// +// Goal Name : dft_scan_ready +// Version : 5.5.0 +// +// Revision History: +// Ver Date Comments +// 5.5.0 11-Jun-2015 Initial version +// Added : Clock_26 +// Added : Info_testmode_conflict_01 +// Added : Info_untestable +// Removed: Info_path +// +// Copyright Synopsys Inc, 2019. All rights reserved. +// ---------------------------------------------------------------------------- + +=template++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +dft_scan_ready +* +Make registers scannable +* + SpyGlass DFT may be run on RTL designs without any built-in test logic or +on designs with test mode controls and test clocks. In the first case, +SpyGlass will identify the system logic that does not comply with DFT +requirements. In the second case, SpyGlass DFT will verify that the +design-for-test logic is performing correctly as well as identify where +additional design-for-test logic may be required or useful. + + This "scan ready" step is designed to ensure that as many registers in +the RTL as possible can easily be replaced with scan equivalents either +during logic synthesis or in a post-synthesis step. SpyGlass DFT does +not do the scan insertion or scan chain stitching but rather deals with +the clocks and the asynchronous signals to ensure compliance with +scan replacement requirements. + + For more details about this goal, please refer to the +SpyGlass-DFT-Methodology.pdf file in the doc subdirectory of your +SpyGlass installation +=cut+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//------------------------------------------------ +// Policy Registration +//------------------------------------------------ + +-policies=dft + + +//------------------------------------------------ +// General Setup commands +//------------------------------------------------ + + +//------------------------------------------------ +// Policy Specific Parameter Setting +//------------------------------------------------ + + +//------------------------------------------------ +// Rule Registration +//------------------------------------------------ + +-rules Coverage_audit // Analyze coverage for circuit + +-rules Info_coverage // Estimate fault and test coverage + +-rules Async_07 // Asynchronous set/reset sources should be inactive during shift mode +-overloadrules Async_07+msgLabel=Async_07_M1+severity=Error + +-rules Async_08 // Asynchronous set/reset pins of all the flops should be fully controllable during capture. + +-rules Clock_11 // All clock sources must be testclock controlled in shift mode +-overloadrules Clock_11+msgLabel=Clock_11_M1+severity=Error + +-rules Clock_11_capture // All clock sources must be testclock controlled in capture mode + +-rules Clock_26 // Testclock constraint must not be applied on sensitized fanout of another test clock in Shift or Capture mode + +-rules Diagnose_testclock // Display instances that blocks testclock propagation + +-rules Diagnose_testmode // Display instances that blocks testmode propagation + +-rules Info_forcedScan // Displays all registers and flip-flops specified as 'scan' + +-rules Info_inferredNoScan // Displays all flip-flops which have been inferred as no_scan + +-rules Info_noScan // Displays all registers and flip-flops specified as 'no_scan' + +-rules Info_scanwrap // Report scanwrap related information + +-rules Info_testclock // Display test clock propagation + +-rules Info_testmode // Display testmode simulation results + +-rules Info_testmode_conflict_01 // Display conflict in user specified testmode with respect to simulation result of fanin cone + +-rules Info_untestable // Display untestable faults caused by test mode + +//------------------------------------------------ +// End of Rule Registration +//------------------------------------------------ diff --git a/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready_debug_help.htm b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready_debug_help.htm new file mode 100644 index 0000000..a70ceca --- /dev/null +++ b/src/UWE_projectCode/tmp/tmp/Scripts/custom_methodology/dft/dft_scan_ready_debug_help.htm @@ -0,0 +1,151 @@ + + + + + + + + + + dft_scan_ready + + + + + + + + + + + + + +