



  

<!DOCTYPE html>
<html
  lang="en"
  
  data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
  data-a11y-animated-images="system" data-a11y-link-underlines="true"
  
  >




  <head>
    <meta charset="utf-8">
  <link rel="dns-prefetch" href="https://github.githubassets.com">
  <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  <link rel="preconnect" href="https://github.githubassets.com" crossorigin>
  <link rel="preconnect" href="https://avatars.githubusercontent.com">

<script type="importmap">{"imports":{"react":"https://github.githubassets.com/assets/react-e27d1b3e03961e68.js","react-dom":"https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js","react-dom/client":"https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js","react-is":"https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js","react-reconciler":"https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js","react/compiler-runtime":"https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js","react/jsx-dev-runtime":"https://github.githubassets.com/assets/react-jsx-dev-runtime-ea55d68667d559e5.js","react/jsx-runtime":"https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js","scheduler":"https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js"}}</script>
<meta name="react-profiling" content="0" data-turbo-transient="true" />
<meta name="react-import-map" content="react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@777f63f87cd0" data-turbo-track="reload" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-e27d1b3e03961e68.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js" />

  


  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-5c4e9fc574bf49f3.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-5c4e9fc574bf49f3.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-0f910d8806d5761b.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-a7abd4d4c49ac593.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-5fc4c4a9cb41e596.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-ed0cee9214dedabd.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-78a2491d538dab5a.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-c26b63d7c532d0a2.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-a6f60cea68c08405.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-f66faf28b2ea18b6.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-6701f6218c53cf5b.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-7037fa46ae124d97.css" />

  <style type="text/css">
    :root {
      --tab-size-preference: 4;
    }

    pre, code {
      tab-size: var(--tab-size-preference);
    }
  </style>

    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-97df7784617ce1ea.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-9be9fe6313f476af.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-62747e27e61258dc.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-b04ca6fccda778e2.css" />
  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-72bd7d974b5ac1cc.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-4c5c0895f723f870.css" />

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_caches_react_shell","actions_enable_background_steps","actions_new_hosted_runner_image_select_sizes_and_versions","actions_runners_react_shell","agent_author_search_expansion","agent_author_search_expansion_ui_pulls","alternate_user_config_repo","async_conversion_coverage_enabled","billing_billable_licenses_cost_center_bucket_fix","billing_budget_expiration","billing_cost_center_list_assigned_resources","billing_discount_threshold_notification","code_quality_enablement_banner_targeting","code_quality_remove_preview","code_view_raf_sticky_lines","codespaces_prebuild_region_target_update","coding_agent_third_party_model_ui","copilot_agent_snippy","copilot_ahp_tool_call_timing","copilot_api_agentic_issue_marshal_yaml","copilot_automation_repo_mcp_servers","copilot_automations_pagination","copilot_base_model_policy_row","copilot_chat_auto_mode_v2","copilot_chat_clear_model_selection_for_default_change","copilot_chat_early_task_provisioning","copilot_chat_persist_session_drafts","copilot_chat_vision_dotcom_chat_ga_gate","copilot_css_textarea_autosize","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_fix_failed_workflows_all_skus","copilot_hide_hovercard","copilot_immersive_task_hyperlinking","copilot_mc_cli_resume_any_users_task","copilot_mission_control_agent_merge_fix_ci","copilot_mission_control_agent_merge_resolve_conflicts","copilot_mission_control_awps_batching","copilot_mission_control_early_stop","copilot_mission_control_managed_sandbox_environments","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandbox_remote_bypass","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_org_policy_page_focus_mode","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_automation_resource_scoped_writes","copilot_swe_agent_discussion_comment_trigger","copilot_swe_agent_discussion_opened_trigger","copilot_swe_agent_discussion_updated_trigger","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_assigned_trigger","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_issue_labeled_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_assigned_trigger","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_labeled_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_ready_for_review_trigger","copilot_swe_agent_pull_request_review_requested_trigger","copilot_swe_agent_pull_request_review_submitted_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_sub_issue_added_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_task_scoped_alive_channel","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_web_integration_cutover","copilot_workbench_sunset_redirect","dashboard_agents_module_auth_token_check","dashboard_indexeddb_caching","fgpat_permissions_selector_redesign","glc_code_quality_repo_settings_workflow_config","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_ubb_individual_budget_banner","issue_fields_multi_select","issue_inline_avatars","issue_pinned_views","issue_pinned_views_team_vs_personal","issue_relative_time_micro","issue_viewer_paved_path","issues_expanded_file_types","issues_hide_closed_sub_issues","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","labels_archiving","labels_archiving_info","landing_pages_ninetailed","lifecycle_label_name_updates","marketing_cookie_consent_banner","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_queue_restricted_pushers_warning","merge_status_header_feedback","milestone_closed_issues_prioritization","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","primer_react_timeline_list_semantics","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_copilot_attribution_header","pull_request_overview_merge_control","pull_request_overview_panel_edit_description","pull_request_persister","pull_request_stacks_navigation_shortcuts","pull_request_virtualization_image_estimate","pull_request_virtualization_loader_batching","pull_request_virtualization_scroll_compensation","pull_request_virtualization_scroll_intent","quick_search_lazy_suggestions","react_blob_isolate_code_lines","react_blob_ssr_content_visibility","react_data_router_tanstack_allowed","react_logged_out_repository_header","react_query_props_with_key","react_sandbox_future_tanstack","repo_app_turbo","repo_issues_sidebar_layout","repo_pulls_dashboard_declutter","repo_pulls_dashboard_ga","repo_pulls_dashboard_persistence","repos_contributors_limited_default_range","review_involves_filter","rule_ignored_file_paths","rulesets_actor_list_editor","sample_network_conn_type","security_center_artifact_filters_popover","see_who_reacted","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","set_sha256_on_repo_creation_form","site_banner_desktop_copilot_app","site_ghca_pixel_mona","site_github_app_ga_page","site_github_app_ga_page_highlight","site_github_app_mobile_native_share","site_global_banner_dev_days_attendee","site_global_nav_spark_models_removed","speculation_rules_ui_service","suggest_custom_property_values_copilot","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","thread_resolution_reason","update_issue_suggestions","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","workstream_plugin_bootstrap"],"githubDomain":"https://github.com","copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"}</script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/high-contrast-cookie-3663bcaacc724f4c.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-e7610307df12a842.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-156c6259e31cc551.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-f6ce38f47c2e1d56.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-804a14996977c014.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-fb5d13278eb42203.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tp-ea613009a991e211.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-24e561c65e946f7d.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.25915bc98fb322a6.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/catalyst-52ed81112a548e10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/selector-observer-e8810f64c443fb9b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/relative-time-element-fe7e72f699fdf493.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/by-9da36843ba9d191d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ja9-9a1160b939f2cd52.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3h-55903cf2303047ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hk-0d35a1220587d888.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-c964b1a3671f2a92.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hj-1d800d09e9a8720a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j0-1ad12374da9777f2.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-b0e284afdb522622.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-10109ffb41067b06.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/runtime-helpers-5e0b3ae3c4036207.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/aria-live-752acdc868e2da64.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-e87ffadced20a3c9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-75bc55d9971828b7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a9-34620c7b13885011.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-643d2814115561a9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t6-5d0869970ac0aac0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pb0-a5c5ec36d311aeef.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6n-afcf86ccabc4cad2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zj-f08c728cf00018aa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/o6-2a1c68d269710ee9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/h9a-c6405aa090de0e84.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vy6-3c3e6e96629c2ce4.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/js-4eb97d5803e657c0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/g7-baf9e817ae102b01.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/unc-96389cade7bad821.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/nu-65322a6997c6c93c.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-54f7deb7d2612e69.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.3792087592bf207a.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-f0ae3472e0ece411.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-7afef75d393cf294.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/op-acddf38478d45ef9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-461e4b09f2e67ee5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/qmp-c7cfba40cf5a93b0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j6-148a74299e5a01ab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t7l-a52ba56147f77909.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4u-ec4874f70bfd5d76.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s0-481bd34f90bc2bd7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y5-ed17e73b4c0bd15e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4-be595475cdbf7d4b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8-23a3c5ff8eef412d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/la-27679061f16e1495.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/iu-9806a0291a782cbe.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ftx-39fb490e3c1d778f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zi-32a0c3c081ea5cce.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sg-7a5d50475874c0e1.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pd-6a8710840033e042.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/86g-ec28c25ed7d5de06.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sn-1bab7384818953b7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/iq-6d4ecf6d2fb6993c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p2-7d8e7cee5b46cb45.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7d-2e3cc25d719f3a95.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4d-76d8acdf21a33266.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tsb-e0f6288ab985d9d2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/lf-910ef220ce85c660.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2j-2f19c1afd2ceaf93.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/me-f1476ec44a29f34a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p2u-e654a57b1a70c47d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/5d-d97cc006d4da4d9b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/r5-38f013bc2c0fd298.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/r6s-9039f5619230a653.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9e-cece06724bf6ea3b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/x9-3e077a3a37a73f9f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pj-87629cb5389d7663.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/eq-3764fd5f66494289.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/13-d889936dff7e5c0f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/44-8193eea4af825ead.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/v4-9c1327d212e52a0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/id-7f39706ba9007db6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ah-271362a1ed227d03.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s1g-d434d712bca59d3a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vz-d7f4a583896f872e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/47-c8c0ce2700acc5be.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-49c8cee7840c9c82.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/pj.75627bfeb9ceb1da.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ah.2623f7c6ecbe2ecd.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/47.78770c57a48a810c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.35603ecb2160763e.module.css" />


  <title>OpenTimer/README.md at master · OpenTimer/OpenTimer · GitHub</title>



  <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient>
  <meta name="route-controller" content="blob" data-turbo-transient>
  <meta name="route-action" content="show" data-turbo-transient>
  <meta name="fetch-nonce" content="v2:f7542d6c-ca42-3ec8-0121-971946442d36">

    
  <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb">


  <meta name="request-id" content="A054:2E49A1:16ACD20:1DB6FEA:6ACB414C" data-pjax-transient="true"/><meta name="html-safe-nonce" content="9524f3e568f1f5cec002cb625c56ba046a597207f0728b230a9cff0623a5c4e9" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBMDU0OjJFNDlBMToxNkFDRDIwOjFEQjZGRUE6NkFDQjQxNEMiLCJ2aXNpdG9yX2lkIjoiNjE2NTAzNzA0MTA0ODA0Mzg1MiIsInJlZ2lvbl9lZGdlIjoiZnJhIiwicmVnaW9uX3JlbmRlciI6ImZyYSJ9" data-pjax-transient="true"/><meta name="visitor-hmac" content="92cce9f737676af11d11b930715e7d07cf43551defb051f435542f5255349b50" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:39079545" data-turbo-transient>


  <meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" />
  

  <meta name="selected-link" value="repo_source" data-turbo-transient>
  <link rel="assets" href="https://github.githubassets.com/">

    <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">

<meta name="octolytics-url" content="https://collector.github.com/github/collect" />





  <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-turbo-transient="true" />

  




    <meta name="user-login" content="">

  

    <meta name="viewport" content="width=device-width">

    

      <meta name="description" content="A High-performance Timing Analysis Tool for VLSI Systems - OpenTimer/README.md at master · OpenTimer/OpenTimer">

      <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">

    <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
    <meta property="fb:app_id" content="1401488693436528">
    <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/OpenTimer/OpenTimer/blob/master/README.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/936eb7f685cd62172eac9651de1d681ba808f722fdd63d277311c1e11b75daa4/OpenTimer/OpenTimer" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="OpenTimer/README.md at master · OpenTimer/OpenTimer" /><meta name="twitter:description" content="A High-performance Timing Analysis Tool for VLSI Systems - OpenTimer/OpenTimer" />
  <meta property="og:image" content="https://opengraph.githubassets.com/936eb7f685cd62172eac9651de1d681ba808f722fdd63d277311c1e11b75daa4/OpenTimer/OpenTimer" /><meta property="og:image:alt" content="A High-performance Timing Analysis Tool for VLSI Systems - OpenTimer/OpenTimer" /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="OpenTimer/README.md at master · OpenTimer/OpenTimer" /><meta property="og:url" content="https://github.com/OpenTimer/OpenTimer/blob/master/README.md" /><meta property="og:description" content="A High-performance Timing Analysis Tool for VLSI Systems - OpenTimer/OpenTimer" />
  




      <meta name="hostname" content="github.com">



        <meta name="expected-hostname" content="github.com">


  <meta http-equiv="x-pjax-version" content="e340c92f5eb45f6fb6db73d43b8fee8cb69889b4676afb76c5381963d7bd24ed" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="c4a65e47b0c850e1157ae8e66298070851d7e3b558038de5a3b4ff7a93e630ed" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="a80b0545b169f440b929ce2b977c76b6988f014cca6513fb83c5df6581635fb3" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="86c024975ec65bef61977fbe60782866bd2f48cf8401c77b0337e58b2cab7952" data-turbo-track="reload">

  <meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">

      <meta name="turbo-cache-control" content="no-cache" data-turbo-transient>

    <meta data-hydrostats="publish">

  <meta name="go-import" content="github.com/OpenTimer/OpenTimer git https://github.com/OpenTimer/OpenTimer.git">

  <meta name="octolytics-dimension-user_id" content="40002350" /><meta name="octolytics-dimension-user_login" content="OpenTimer" /><meta name="octolytics-dimension-repository_id" content="39079545" /><meta name="octolytics-dimension-repository_nwo" content="OpenTimer/OpenTimer" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="39079545" /><meta name="octolytics-dimension-repository_network_root_nwo" content="OpenTimer/OpenTimer" />
  



    

    <meta name="turbo-body-classes" content="logged-out env-production page-responsive">
  <meta name="disable-turbo" content="false">


  <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">


  <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">

  <meta name="release" content="f3c33252c136837d4801bc973e01d185db642a57" data-turbo-track="reload">
  <meta name="ui-target" content="full">

  <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
  <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
  <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">

<meta name="theme-color" content="#1e2327">
<meta name="color-scheme" content="light dark" />


  <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">

  </head>

  <body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
    <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
      <div id="__primerPortalRoot__" style="z-index: 1000; position: absolute; width: 100%;" data-turbo-permanent></div>
      

    <div class="position-relative header-wrapper js-header-wrapper ">
      <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 tmp-py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>

      <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
    <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>      
      <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/19-c660652a0a1639be.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-5af6e2671bf3c355.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.9a3346a06fe1e0b7.module.css" />

<react-partial
  partial-name="keyboard-shortcuts-dialog"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>





      

          <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-install-banner-partial-7cdb285eb17304a3.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-install-banner-partial.23da07a41d5b850d.module.css" />

<react-partial
  partial-name="app-install-banner-partial"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>


          

                <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/et9-7eeec247c287fca4.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/94v-e20946127faa8f6e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz5-892a9e99cc92858d.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jag-441e702bfd4c7904.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hw-8ce7888b57d0a23c.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/rq-0ec82a12cf538a4d.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/1m-a7a4c022483b2713.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-d6527f1bfaca19f3.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.fbc35b3d20e988ff.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/1m.fec8b575d0e5234f.module.css" />

<react-partial
  partial-name="marketing-header"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2FOpenTimer%2FOpenTimer%2Fblob%2Fmaster%2FREADME.md","signup_path":"/signup?ref_cta=Sign+up\u0026ref_loc=header+logged+out\u0026ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow\u0026source=header-repo\u0026source_repo=OpenTimer%2FOpenTimer","signup_enabled":true,"is_signup_controller":false,"show_search_and_nav":true,"hide_search":false,"private_mode_enabled":false,"should_use_dotcom_links":true,"auth_hydro_click":"{\"event_type\":\"authentication.click\",\"payload\":{\"location_in_page\":\"site header menu\",\"repository_id\":null,\"auth_type\":\"SIGN_UP\",\"originating_url\":\"https://github.com/OpenTimer/OpenTimer/blob/master/README.md\",\"user_id\":null}}","auth_hydro_click_hmac":"de990c13f52481db5e9ad4b7df60443e8ab329a01c7d5d13db05ac119121d6c2","overlay":false,"fixed":false}}</script>
  <div data-target="react-partial.reactRoot"><div data-color-mode="dark" data-light-theme="light" data-dark-theme="dark"><header class="MarketingHeader-module__root__Tk7n3 HeaderMktg header-logged-out" role="banner" data-marketing-header="true" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" data-is-top="true"><h2 class="MarketingHeader-module__visuallyHidden__sqKsl">Navigation Menu</h2><button type="button" class="MarketingHeader-module__backdrop__sw4RU" aria-label="Close navigation menu"></button><div class="MarketingHeader-module__bar__mBSyE"><div class="MarketingHeader-module__topRow__yeury"><div class="MarketingHeader-module__toggleSlot__hDxbh"><button type="button" class="HeaderMenuToggle-module__toggle__i8EiC" aria-label="Toggle navigation" aria-expanded="false"><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span></button></div><a href="/" aria-label="Homepage" class="HeaderLogo-module__logo__UFyHI" data-analytics-event="{&quot;action&quot;:&quot;homepage&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;logo&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;homepage_link_logo_header&quot;}"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github" viewBox="0 0 24 24" width="32" height="32" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path></svg></a><div class="AuthCTAs-module__mobileActions__NNzeV"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/login?return_to=https%3A%2F%2Fgithub.com%2FOpenTimer%2FOpenTimer%2Fblob%2Fmaster%2FREADME.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/OpenTimer/OpenTimer/blob/master/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="de990c13f52481db5e9ad4b7df60443e8ab329a01c7d5d13db05ac119121d6c2"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_3dd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_3dd_">Appearance settings</div></div></div><div class="MarketingHeader-module__menu__GIy3y"><div class="MarketingHeader-module__menuWrapper__owstH"><nav class="MarketingNavigation-module__nav__W0KYY" aria-label="Global"><ul class="MarketingNavigation-module__list__tFbMb"><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_nd_">Platform<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5knd_">AI CODE CREATION</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot" data-analytics-event="{&quot;action&quot;:&quot;github_copilot&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>GitHub Copilot</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Write better code with AI</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/ai/github-app" data-analytics-event="{&quot;action&quot;:&quot;github_copilot_app&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_app_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.766 11.328c-2.063-.25-3.516-1.734-3.516-3.656 0-.781.281-1.625.75-2.188-.203-.515-.172-1.609.063-2.062.625-.078 1.468.25 1.968.703.594-.187 1.219-.281 1.985-.281.765 0 1.39.094 1.953.265.484-.437 1.344-.765 1.969-.687.218.422.25 1.515.046 2.047.5.593.766 1.39.766 2.203 0 1.922-1.453 3.375-3.547 3.64.531.344.89 1.094.89 1.954v1.625c0 .468.391.734.86.547C13.781 14.359 16 11.53 16 8.03 16 3.61 12.406 0 7.984 0 3.563 0 0 3.61 0 8.031a7.88 7.88 0 0 0 5.172 7.422c.422.156.828-.125.828-.547v-1.25c-.219.094-.5.156-.75.156-1.031 0-1.64-.562-2.078-1.609-.172-.422-.36-.672-.719-.719-.187-.015-.25-.093-.25-.187 0-.188.313-.328.625-.328.453 0 .844.281 1.25.86.313.452.64.655 1.031.655s.641-.14 1-.5c.266-.265.47-.5.657-.656"></path></svg>GitHub Copilot app</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Direct agents from issue to merge</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/mcp" data-analytics-event="{&quot;action&quot;:&quot;mcp_registry&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;mcp_registry_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mcp NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.52 1.12a3.578 3.578 0 0 1 6.078 2.98 3.578 3.578 0 0 1 2.982 6.08l-3.292 3.293a.252.252 0 0 0 0 .354l.843.843a.749.749 0 1 1-1.06 1.06l-.844-.843a1.75 1.75 0 0 1 0-2.474L13.52 9.12a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0L7.731 9.03A.75.75 0 0 1 6.67 7.97l2.85-2.85a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0l-4.799 4.8A.75.75 0 0 1 .72 5.92Z"></path><path d="M7.52 3.12a.749.749 0 1 1 1.06 1.06L5.731 7.03A2.079 2.079 0 0 0 8.67 9.97l2.85-2.85a.749.749 0 1 1 1.06 1.06l-2.849 2.85A3.578 3.578 0 0 1 4.67 5.97Z"></path></svg>MCP Registry</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Integrate external tools</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9knd_">DEVELOPER WORKFLOWS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/actions" data-analytics-event="{&quot;action&quot;:&quot;actions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;actions_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-workflow NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path></svg>Actions</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Automate any workflow</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/codespaces" data-analytics-event="{&quot;action&quot;:&quot;codespaces&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;codespaces_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codespaces NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg>Codespaces</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Instant dev environments</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/issues" data-analytics-event="{&quot;action&quot;:&quot;issues&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;issues_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg>Issues</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Plan and track work</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-review" data-analytics-event="{&quot;action&quot;:&quot;code_review&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_review_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg>Code Review</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Manage code changes</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-quality" data-analytics-event="{&quot;action&quot;:&quot;code_quality&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_quality_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codescan-checkmark NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.28 6.28a.75.75 0 1 0-1.06-1.06L6.25 8.19l-.97-.97a.75.75 0 0 0-1.06 1.06l1.5 1.5a.75.75 0 0 0 1.06 0l3.5-3.5Z"></path><path d="M7.5 15a7.5 7.5 0 1 1 5.807-2.754l2.473 2.474a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2.474-2.473A7.472 7.472 0 0 1 7.5 15Zm0-13.5a6 6 0 1 0 4.094 10.386.748.748 0 0 1 .293-.292 6.002 6.002 0 0 0 1.117-6.486A6.002 6.002 0 0 0 7.5 1.5Z"></path></svg>Code Quality</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enforce quality at merge</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dknd_">APPLICATION SECURITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Find and fix vulnerabilities</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/code-security" data-analytics-event="{&quot;action&quot;:&quot;code_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code-square NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>Code security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Secure your code as you build</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/secret-protection" data-analytics-event="{&quot;action&quot;:&quot;secret_protection&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;secret_protection_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-lock NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M4 4a4 4 0 0 1 8 0v2h.25c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 12.25 15h-8.5A1.75 1.75 0 0 1 2 13.25v-5.5C2 6.784 2.784 6 3.75 6H4Zm8.25 3.5h-8.5a.25.25 0 0 0-.25.25v5.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25ZM10.5 6V4a2.5 2.5 0 1 0-5 0v2Z"></path></svg>Secret protection</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Stop leaks before they start</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ NavGroup-module__hasSeparator__FnMrN"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_hknd_">EXPLORE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_hknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/why-github" data-analytics-event="{&quot;action&quot;:&quot;why_github&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;why_github_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Why GitHub</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog" data-analytics-event="{&quot;action&quot;:&quot;blog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;blog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Blog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog/changelog" data-analytics-event="{&quot;action&quot;:&quot;changelog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;changelog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Changelog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/marketplace" data-analytics-event="{&quot;action&quot;:&quot;marketplace&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;marketplace_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Marketplace</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/features" data-analytics-event="{&quot;action&quot;:&quot;view_all_features&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_features_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all features</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_17d_">Solutions<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_17d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5l7d_">BY COMPANY SIZE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprises&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Enterprises</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/team" data-analytics-event="{&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Small and medium teams</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise/startups" data-analytics-event="{&quot;action&quot;:&quot;startups&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Startups</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/nonprofits" data-analytics-event="{&quot;action&quot;:&quot;nonprofits&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;nonprofits_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Nonprofits</span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9l7d_">BY USE CASE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/app-modernization" data-analytics-event="{&quot;action&quot;:&quot;app_modernization&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;app_modernization_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">App Modernization</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devsecops" data-analytics-event="{&quot;action&quot;:&quot;devsecops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevSecOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/ci-cd" data-analytics-event="{&quot;action&quot;:&quot;ci/cd&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ci/cd_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">CI/CD</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/use-case" data-analytics-event="{&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all use cases</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dl7d_">BY INDUSTRY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dl7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/healthcare" data-analytics-event="{&quot;action&quot;:&quot;healthcare&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Healthcare</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/financial-services" data-analytics-event="{&quot;action&quot;:&quot;financial_services&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Financial services</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/manufacturing" data-analytics-event="{&quot;action&quot;:&quot;manufacturing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Manufacturing</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/government" data-analytics-event="{&quot;action&quot;:&quot;government&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Government</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/industry" data-analytics-event="{&quot;action&quot;:&quot;view_all_industries&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all industries</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions" data-analytics-event="{&quot;action&quot;:&quot;view_all_solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_solutions_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all solutions</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_1nd_">Resources<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_1nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5lnd_">EXPLORE BY TOPIC</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=ai" data-analytics-event="{&quot;action&quot;:&quot;ai&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">AI</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=software-development" data-analytics-event="{&quot;action&quot;:&quot;software_development&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Software Development</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=security" data-analytics-event="{&quot;action&quot;:&quot;security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources/articles" data-analytics-event="{&quot;action&quot;:&quot;view_all_topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_topics_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all topics</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9lnd_">EXPLORE BY TYPE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/customer-stories" data-analytics-event="{&quot;action&quot;:&quot;customer_stories&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer stories</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/events" data-analytics-event="{&quot;action&quot;:&quot;events__webinars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;events__webinars_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Events &amp; webinars</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/whitepapers" data-analytics-event="{&quot;action&quot;:&quot;ebooks__reports&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ebooks__reports_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Ebooks &amp; reports</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/executive-insights" data-analytics-event="{&quot;action&quot;:&quot;business_insights&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;business_insights_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Business insights</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://skills.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_skills&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_skills_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Skills</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dlnd_">SUPPORT &amp; SERVICES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dlnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://support.github.com" data-analytics-event="{&quot;action&quot;:&quot;customer_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_support_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer support</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/orgs/community/discussions" data-analytics-event="{&quot;action&quot;:&quot;community_forum&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;community_forum_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Community forum</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trust-center" data-analytics-event="{&quot;action&quot;:&quot;trust_center&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trust_center_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trust center</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/partners" data-analytics-event="{&quot;action&quot;:&quot;partners&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Partners</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources" data-analytics-event="{&quot;action&quot;:&quot;view_all_resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_resources_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all resources</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_27d_">Open Source<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_27d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5m7d_">COMMUNITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/open-source/sponsors" data-analytics-event="{&quot;action&quot;:&quot;github_sponsors&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sponsor-tiers NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.586 1C12.268 1 13.5 2.37 13.5 4.25c0 1.745-.996 3.359-2.622 4.831-.166.15-.336.297-.509.438l1.116 5.584a.75.75 0 0 1-.991.852l-2.409-.876a.25.25 0 0 0-.17 0l-2.409.876a.75.75 0 0 1-.991-.852L5.63 9.519a13.78 13.78 0 0 1-.51-.438C3.497 7.609 2.5 5.995 2.5 4.25 2.5 2.37 3.732 1 5.414 1c.963 0 1.843.403 2.474 1.073L8 2.198l.112-.125a3.385 3.385 0 0 1 2.283-1.068L10.586 1Zm-3.621 9.495-.718 3.594 1.155-.42a1.75 1.75 0 0 1 1.028-.051l.168.051 1.154.42-.718-3.592c-.199.13-.37.235-.505.314l-.169.097a.75.75 0 0 1-.72 0 9.54 9.54 0 0 1-.515-.308l-.16-.105ZM10.586 2.5c-.863 0-1.611.58-1.866 1.459-.209.721-1.231.721-1.44 0C7.025 3.08 6.277 2.5 5.414 2.5 4.598 2.5 4 3.165 4 4.25c0 1.23.786 2.504 2.128 3.719.49.443 1.018.846 1.546 1.198l.325.21.076-.047.251-.163a13.341 13.341 0 0 0 1.546-1.198C11.214 6.754 12 5.479 12 4.25c0-1.085-.598-1.75-1.414-1.75Z"></path></svg>GitHub Sponsors</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Fund open source developers</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9m7d_">PROGRAMS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://securitylab.github.com" data-analytics-event="{&quot;action&quot;:&quot;security_lab&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_lab_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security Lab</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://maintainers.github.com" data-analytics-event="{&quot;action&quot;:&quot;maintainer_community&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;maintainer_community_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Maintainer Community</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://stars.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_stars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_stars_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Stars</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://archiveprogram.github.com" data-analytics-event="{&quot;action&quot;:&quot;archive_program&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;archive_program_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Archive Program</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dm7d_">REPOSITORIES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dm7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/topics" data-analytics-event="{&quot;action&quot;:&quot;topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Topics</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trending" data-analytics-event="{&quot;action&quot;:&quot;trending&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trending</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/collections" data-analytics-event="{&quot;action&quot;:&quot;collections&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Collections</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_2nd_">Enterprise<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_2nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5mnd_">ENTERPRISE SOLUTIONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-stack NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg>Enterprise platform</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">AI-powered developer platform</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9mnd_">AVAILABLE ADD-ONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade security features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot/copilot-business" data-analytics-event="{&quot;action&quot;:&quot;copilot_for_business&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;copilot_for_business_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>Copilot for Business</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade AI features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise/premium-support" data-analytics-event="{&quot;action&quot;:&quot;premium_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path></svg>Premium Support</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade 24/7 support</span></span></a></li></ul></div></li></ul></div></div></li><li><a href="https://github.com/pricing" data-analytics-event="{&quot;action&quot;:&quot;pricing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;pricing&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;pricing_link_pricing_navbar&quot;}" class="MarketingNavigation-module__navLink__hUomM">Pricing</a></li></ul></nav><div class="MarketingHeader-module__ctaContainer__tBmPz"><div class="HeaderSearch-module__searchSlot__oVOUS"><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderSearch-module__trigger__zsF9q" type="button" aria-haspopup="dialog" aria-expanded="false" aria-label="Search or jump to, type / to search" data-analytics-event="{&quot;action&quot;:&quot;searchbar&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;context&quot;:&quot;global&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"><span class="HeaderSearch-module__content__kMpxU"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search HeaderSearch-module__icon__wcrHX" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg><span class="HeaderSearch-module__label__d1iWG">Search</span><kbd class="HeaderSearch-module__kbd__HNG0o" aria-hidden="true">/</kbd></span></span></span></button><div class="d-none"></div></div><div class="AuthCTAs-module__signInWrap__q2P60"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq AuthCTAs-module__desktopActionGap__UZuXT AuthCTAs-module__hiddenBelowLg__BfKBw" href="/login?return_to=https%3A%2F%2Fgithub.com%2FOpenTimer%2FOpenTimer%2Fblob%2Fmaster%2FREADME.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/OpenTimer/OpenTimer/blob/master/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="de990c13f52481db5e9ad4b7df60443e8ab329a01c7d5d13db05ac119121d6c2"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a></div><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--secondary___gHnw_ Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&amp;source=header-repo&amp;source_repo=OpenTimer%2FOpenTimer" data-analytics-event="{&quot;action&quot;:&quot;sign_up&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_up_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/OpenTimer/OpenTimer/blob/master/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="de990c13f52481db5e9ad4b7df60443e8ab329a01c7d5d13db05ac119121d6c2"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-secondary___eJ0_a">Sign up</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_fbd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_fbd_">Appearance settings</div></div></div></div></div><div class="MarketingHeader-module__bottomBorder__uZT38" aria-hidden="true"></div></header></div></div>
</react-partial>



      <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
  
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>

    <button id="icon-button-5529cc07-8c71-4ad2-9588-913d88facd75" aria-labelledby="tooltip-d6c31fd9-b091-43f5-9bd1-0b544977934a" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button><tool-tip id="tooltip-d6c31fd9-b091-43f5-9bd1-0b544977934a" for="icon-button-5529cc07-8c71-4ad2-9588-913d88facd75" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

  <div id="start-of-content" class="show-on-focus"></div>








    <div id="js-flash-container" class="flash-container" data-turbo-replace>






  <template class="js-flash-template">
    
<div class="flash flash-full   {{ className }}">
  <div >
    <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    <div aria-atomic="true" role="alert" class="js-flash-alert">
      
      <div>{{ message }}</div>

    </div>
  </div>
</div>
  </template>
</div>


    






  <div
    class="application-main "
    data-commit-hovercards-enabled
    data-discussion-hovercards-enabled
    data-issue-and-pr-hovercards-enabled
    data-project-hovercards-enabled
  >
        <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
    <main id="js-repo-pjax-container" >
      
      
    


    








  

    <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ym-6bc2c9bf8112c038.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sk2-8deeef9351be3911.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ni-3e194d222c7770bf.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7x-71d30cb240cd901f.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wwk-ad869086822937b1.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a1-9f79841ecac1da8e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wzg-40a3213b3e83400b.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/5f-64f8e7d5bcbd4787.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/z5-b53a93078d026f1e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8h-cef26f68c1331011.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fq-3ce13a77e863807a.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a7-596b507bd20acddc.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xfx-c82d8352413aea0a.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j4-b3a9e87fa7878a98.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/global-nav-bar-b658a668f60ca56f.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/pj.75627bfeb9ceb1da.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-nav-bar.d9f1a8b5518e8da4.module.css" />

<react-partial
  partial-name="global-nav-bar"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"contextRegion":{"crumbs":[{"crumb_type":"organization","label":"OpenTimer","is_root":false,"href":"/OpenTimer"},{"crumb_type":"repository","label":"OpenTimer","is_root":false,"href":"/OpenTimer/OpenTimer"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/OpenTimer/OpenTimer","selectedLinks":["repo_source","repo_downloads","repo_commits","repo_releases","repo_tags","repo_branches","repo_packages","repo_deployments","repo_attestations"],"popoverTarget":false,"commandId":"repositories:go-to-code","reactNav":{"appTarget":"code-view","anchor":"code-view-repo-link"},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"issues","icon":"issue-opened","label":"Issues","href":"/OpenTimer/OpenTimer/issues","selectedLinks":["repo_issues","repo_labels","repo_milestones"],"count":59,"popoverTarget":false,"commandId":"repositories:go-to-issues","reactNav":{"appTarget":"repo","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"pull-requests","icon":"git-pull-request","label":"Pull requests","href":"/OpenTimer/OpenTimer/pulls","selectedLinks":["repo_pulls","checks"],"count":4,"popoverTarget":false,"commandId":"repositories:go-to-pull-requests","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"actions","icon":"play","label":"Actions","href":"/OpenTimer/OpenTimer/actions","selectedLinks":["repo_actions"],"popoverTarget":false,"commandId":"repositories:go-to-actions","reactNav":{"appTarget":"actions-workflows","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"projects","icon":"table","label":"Projects","href":"/OpenTimer/OpenTimer/projects","selectedLinks":["repo_projects","new_repo_project","repo_project"],"popoverTarget":false,"commandId":"repositories:go-to-projects","reactNav":{"appTarget":"repo","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"security-and-quality","icon":"shield","label":"Security and quality","href":"/OpenTimer/OpenTimer/security","selectedLinks":["security","overview","alerts","policy","token_scanning","code_scanning"],"count":0,"popoverTarget":false,"commandId":"repositories:go-to-security","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"insights","icon":"graph","label":"Insights","href":"/OpenTimer/OpenTimer/pulse","selectedLinks":["repo_graphs","repo_contributors","dependency_graph","dependabot_updates","pulse","people","community"],"popoverTarget":false,"commandId":"repositories:go-to-insights","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}}],"localNavigationUpdateChannel":null,"selectedLink":"repo_source"},"owner":null,"headerLogo":{"href":"/","aria-label":"Homepage "},"notifications":{"indicatorMode":"disabled","websocketChannel":null,"fetchIndicatorSrc":"/notifications/indicator","fetchIndicatorEnabled":false},"issues":{"href":"/issues"},"pulls":{"href":"/pulls"},"contributedRepos":{"href":"/repos"},"copilot":{"show":false,"showAgentsButton":false,"showRelaunchAnnouncement":false,"copilotChatUrl":null,"copilotApiUrl":"https://api.githubcopilot.com"},"search":{"show":true,"showCommandPalette":false,"isSearchPage":false,"isJumpToSearch":false,"searchContext":{"scope":"repo:OpenTimer/OpenTimer","current_repo_name":"OpenTimer","current_repo_nwo":"OpenTimer/OpenTimer","current_repo_org":"OpenTimer","user_id":"OpenTimer"}},"commandPalette":null,"enterpriseBar":{"show":false},"globalTransactionalMessage":[],"payloadsUrl":"/_global-navigation/payloads.json?can_toggle_site_admin_and_employee_status=0\u0026is_admin_mode_on=0\u0026is_ui_opted_out=0\u0026show_ui_opt_out=0\u0026v=7","contextRegionUrl":"/_global-navigation/context-region.json"}}</script>
  <div data-target="react-partial.reactRoot"><header aria-label="Global navigation menu" data-component="Stack" class="GlobalNav styles-module__appHeader__YzYWk prc-Stack-Stack-UQ9k6" data-gap="none" data-direction="vertical" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="none"><div data-component="Stack" class="prc-Stack-Stack-UQ9k6" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="center" data-padding="none"><div data-testid="top-nav-center" data-component="Stack" class="styles-module__center__R3QRv styles-module__withLocalNavigation__rjTJ_ GlobalNavBar-module__loggedOut__Jv1rk prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="normal"><nav class="styles-module__contextRegion__VbSp2 prc-Breadcrumbs-BreadcrumbsBase-3Gb-B" aria-label="Breadcrumbs" data-overflow="menu" data-variant="normal" data-component="Breadcrumbs"><ol class="prc-Breadcrumbs-BreadcrumbsList-BKjpe"><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/OpenTimer" data-discover="true"><span class="">OpenTimer</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/OpenTimer/OpenTimer" data-discover="true"><span class="styles-module__contextCrumbLast__tI2e3">OpenTimer</span></a></li></ol></nav></div><div data-testid="top-nav-right" data-component="Stack" class="styles-module__right__mlBQg styles-module__withLocalNavigation__rjTJ_ styles-module__rightWithResponsiveCreateButton__SKn2W prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="start" data-padding="normal"></div></div><h2 class="prc-src-InternalVisuallyHidden-2YaI6">Repository navigation</h2><nav class="prc-components-UnderlineWrapper-eT-Yj prc-UnderlineNav-UnderlineWrapper-GWONT LocalNavigation-module__LocalNavigation__b0Xc0" aria-label="Repository" data-variant="inset" data-overflow-mode="wrap" data-hide-icons-breakpoint="medium"><ul class="prc-UnderlineNav-ItemsList-oj8gN prc-components-UnderlineItemList-xKlKC" role="list"><li role="presentation" aria-hidden="true" class="prc-UnderlineNav-WrapSpacer--aLgz"></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a aria-current="page" data-tab-item="code" data-react-nav="code-view" data-react-nav-anchor="code-view-repo-link" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/OpenTimer/OpenTimer" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" data-content="Code">Code</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="issues" data-react-nav="repo" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/OpenTimer/OpenTimer/issues" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg></span><span data-component="text" data-content="Issues">Issues</span><span data-component="counter"><span aria-hidden="true" data-variant="secondary" data-component="CounterLabel" class="prc-CounterLabel-CounterLabel-X-kRU">59</span><span class="prc-VisuallyHidden-VisuallyHidden-Q0qSB"> (<!-- -->59<!-- -->)</span></span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="pull-requests" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/OpenTimer/OpenTimer/pulls" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-pull-request" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path></svg></span><span data-component="text" data-content="Pull requests">Pull requests</span><span data-component="counter"><span aria-hidden="true" data-variant="secondary" data-component="CounterLabel" class="prc-CounterLabel-CounterLabel-X-kRU">4</span><span class="prc-VisuallyHidden-VisuallyHidden-Q0qSB"> (<!-- -->4<!-- -->)</span></span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="actions" data-react-nav="actions-workflows" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/OpenTimer/OpenTimer/actions" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-play" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg></span><span data-component="text" data-content="Actions">Actions</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="projects" data-react-nav="repo" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/OpenTimer/OpenTimer/projects" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-table" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path></svg></span><span data-component="text" data-content="Projects">Projects</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="security-and-quality" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/OpenTimer/OpenTimer/security" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg></span><span data-component="text" data-content="Security and quality">Security and quality</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="insights" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/OpenTimer/OpenTimer/pulse" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-graph" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg></span><span data-component="text" data-content="Insights">Insights</span></a></li></ul><div class="prc-UnderlineNav-MoreButtonContainer-Dnrq6"><div class="prc-UnderlineNav-MoreButtonDivider-dN0a-"></div><button data-component="overflow-menu-button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk prc-UnderlineNav-MoreButton-Y8soj" data-loading="false" data-size="medium" data-variant="invisible" id="_R_2ktp_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><span>More<span class="prc-src-InternalVisuallyHidden-2YaI6"> items</span></span></span></span><span data-component="trailingAction" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></button></div></nav><div class="d-none"></div></header></div>
</react-partial>


  



<turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class="">
    <div id="repo-content-pjax-container" class="repository-content " >
    



    
      
    








<react-app
  app-name="code-view"
  initial-path="/OpenTimer/OpenTimer/blob/master/README.md"
  style="display: block; min-height: calc(100vh - 64px);"
  data-attempted-ssr="true"
  data-ssr="true"
  data-lazy="false"
  data-alternate="false"
  data-data-router-enabled="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobRoute":{"csv":null,"csvError":null,"headerInfo":{"toc":[{"level":1,"text":"OpenTimer ","anchor":"opentimer-","htmlText":"OpenTimer "},{"level":1,"text":"Why OpenTimer?","anchor":"why-opentimer","htmlText":"Why OpenTimer?"},{"level":1,"text":"Get Started with OpenTimer","anchor":"get-started-with-opentimer","htmlText":"Get Started with OpenTimer"},{"level":1,"text":"Compile OpenTimer","anchor":"compile-opentimer","htmlText":"Compile OpenTimer"},{"level":2,"text":"System Requirements","anchor":"system-requirements","htmlText":"System Requirements"},{"level":2,"text":"Build through CMake","anchor":"build-through-cmake","htmlText":"Build through CMake"},{"level":2,"text":"Run Tests","anchor":"run-tests","htmlText":"Run Tests"},{"level":1,"text":"Design Philosophy","anchor":"design-philosophy","htmlText":"Design Philosophy"},{"level":2,"text":"Builder: OpenTimer Lineage","anchor":"builder-opentimer-lineage","htmlText":"Builder: OpenTimer Lineage"},{"level":2,"text":"Action: Update Timing","anchor":"action-update-timing","htmlText":"Action: Update Timing"},{"level":2,"text":"Accessor: Inspect OpenTimer","anchor":"accessor-inspect-opentimer","htmlText":"Accessor: Inspect OpenTimer"},{"level":1,"text":"OpenTimer Shell","anchor":"opentimer-shell","htmlText":"OpenTimer Shell"},{"level":2,"text":"Commands","anchor":"commands","htmlText":"Commands"},{"level":1,"text":"Integrate OpenTimer to your Project","anchor":"integrate-opentimer-to-your-project","htmlText":"Integrate OpenTimer to your Project"},{"level":2,"text":"Option 1: Add OpenTimer Subproject","anchor":"option-1-add-opentimer-subproject","htmlText":"Option 1: Add OpenTimer Subproject"},{"level":2,"text":"Option 2: Install OpenTimer","anchor":"option-2-install-opentimer","htmlText":"Option 2: Install OpenTimer"},{"level":1,"text":"OpenTimer C++ API","anchor":"opentimer-c-api","htmlText":"OpenTimer C++ API"},{"level":1,"text":"Examples","anchor":"examples","htmlText":"Examples"},{"level":1,"text":"Who is Using OpenTimer?","anchor":"who-is-using-opentimer","htmlText":"Who is Using OpenTimer?"},{"level":1,"text":"Get Involved","anchor":"get-involved","htmlText":"Get Involved"},{"level":1,"text":"Contributors \u0026 Acknowledgment","anchor":"contributors--acknowledgment","htmlText":"Contributors \u0026amp; Acknowledgment"},{"level":1,"text":"License","anchor":"license","htmlText":"License"}]},"issueTemplate":null,"discussionTemplate":null,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOpenTimer \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/OpenTimer/OpenTimer/blob/master/image/logo.png\"\u003e\u003cimg align=\"right\" width=\"10%\" src=\"/OpenTimer/OpenTimer/raw/master/image/logo.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/h1\u003e\u003ca id=\"user-content-opentimer-\" class=\"anchor\" aria-label=\"Permalink: OpenTimer \" href=\"#opentimer-\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://travis-ci.org/OpenTimer/OpenTimer\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/16326b16aafd2855c4fe1838ee103929f31deab042aa7e1a77f09e0f87313d3a/68747470733a2f2f7472617669732d63692e6f72672f4f70656e54696d65722f4f70656e54696d65722e7376673f6272616e63683d6d6173746572\" alt=\"Build Status\" data-canonical-src=\"https://travis-ci.org/OpenTimer/OpenTimer.svg?branch=master\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://en.wikipedia.org/wiki/C%2B%2B#Standardization\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/cpp17.svg\" alt=\"Standard\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/OpenTimer/OpenTimer/archive/master.zip\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/download.svg\" alt=\"Download\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/OpenTimer/OpenTimer/tree/master\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/version_badge.svg\" alt=\"Version\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/OpenTimer/OpenTimer/issues\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/askme.svg\" alt=\"AskMe\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"/OpenTimer/OpenTimer/blob/master/wiki/home.md\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/doc-wiki.svg\" alt=\"Wiki\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"/OpenTimer/OpenTimer/blob/master/LICENSE\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/license_badge.svg\" alt=\"License: MIT\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eA High-Performance Timing Analysis Tool for VLSI Systems\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhy OpenTimer?\u003c/h1\u003e\u003ca id=\"user-content-why-opentimer\" class=\"anchor\" aria-label=\"Permalink: Why OpenTimer?\" href=\"#why-opentimer\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/OpenTimer/OpenTimer/blob/master/image/critical_path.jpg\"\u003e\u003cimg align=\"right\" width=\"30%\" src=\"/OpenTimer/OpenTimer/raw/master/image/critical_path.jpg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer is a new \u003ca href=\"https://en.wikipedia.org/wiki/Static_timing_analysis\" rel=\"nofollow\"\u003estatic timing analysis (STA)\u003c/a\u003e tool to help IC designers\nquickly verify the circuit timing.\nIt is developed completely from the ground up using \u003cem\u003eC++17\u003c/em\u003e\nto efficiently support parallel and incremental timing.\nKey features are:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eIndustry standard format (.lib, .v, .spef, .sdc) support\u003c/li\u003e\n\u003cli\u003eGraph- and path-based timing analysis\u003c/li\u003e\n\u003cli\u003eParallel incremental timing for fast timing closure\u003c/li\u003e\n\u003cli\u003eAward-winning tools and golden timers in CAD Contests\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGet Started with OpenTimer\u003c/h1\u003e\u003ca id=\"user-content-get-started-with-opentimer\" class=\"anchor\" aria-label=\"Permalink: Get Started with OpenTimer\" href=\"#get-started-with-opentimer\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe easiest way to start using OpenTimer is to use \u003cem\u003eOpenTimer shell\u003c/em\u003e.\nOpenTimer shell is a powerful tool for interactive analysis\nand the simplest way to learn core functionalities.\n\u003ca href=\"#compile-opentimer\"\u003eCompile OpenTimer\u003c/a\u003e and launch the shell program \u003ccode\u003eot-shell\u003c/code\u003e\nunder the \u003ccode\u003ebin\u003c/code\u003e directory.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"~$ ./bin/ot-shell\n  ____              _______              \n / __ \\___  ___ ___/_  __(_)_ _  ___ ____\n/ /_/ / _ \\/ -_) _ \\/ / / /  ' \\/ -_) __/\n\\____/ .__/\\__/_//_/_/ /_/_/_/_/\\__/_/       v2\n    /_/                                     \nMIT License: type \u0026quot;license\u0026quot; to see more details.\nFor help, type \u0026quot;help\u0026quot;.\nFor bug reports, issues, and manual, please see:\n\u0026lt;https://github.com/OpenTimer/OpenTimer\u0026gt;.\not\u0026gt; \"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ ./bin/ot-shell\n  ____              _______              \n / __ \u003cspan class=\"pl-cce\"\u003e\\_\u003c/span\u003e__  ___ ___/_  __(_)_ _  ___ ____\n/ /_/ / _ \u003cspan class=\"pl-cce\"\u003e\\/\u003c/span\u003e -_) _ \u003cspan class=\"pl-cce\"\u003e\\/\u003c/span\u003e / / /  \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e \\/ -_) __/\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\\____/ .__/\\__/_//_/_/ /_/_/_/_/\\__/_/       v2\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e    /_/                                     \u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eMIT License: type \"license\" to see more details.\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eFor help, type \"help\".\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eFor bug reports, issues, and manual, please see:\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u0026lt;https://github.com/OpenTimer/OpenTimer\u0026gt;.\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eot\u0026gt; \u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe have provided a \u003ca href=\"/OpenTimer/OpenTimer/blob/master/example/simple\"\u003esimple design\u003c/a\u003e\nwhich consists of five gates (one NAND, one NOR, two INV, one FF) and one clock.\nMove to the folder and read this simple design.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/OpenTimer/OpenTimer/blob/master/image/simple_schematic.jpg\"\u003e\u003cimg align=\"right\" src=\"/OpenTimer/OpenTimer/raw/master/image/simple_schematic.jpg\" width=\"55%\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"ot\u0026gt; cd example/simple\not\u0026gt; read_celllib osu018_stdcells.lib\not\u0026gt; read_verilog simple.v   \not\u0026gt; read_sdc simple.sdc\"\u003e\u003cpre\u003eot\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e example/simple\not\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e read_celllib osu018_stdcells.lib\not\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e read_verilog simple.v   \not\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e read_sdc simple.sdc\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eReport the timing to show the most critical path.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"ot\u0026gt; report_timing      # report the most critical path\nStartpoint    : inp1\nEndpoint      : f1:D\nAnalysis type : min\n------------------------------------------------------\n       Type       Delay        Time   Dir  Description\n------------------------------------------------------\n       port       0.000       0.000  fall  inp1\n        pin       0.000       0.000  fall  u1:A (NAND2X1)\n        pin       2.786       2.786  rise  u1:Y (NAND2X1)\n        pin       0.000       2.786  rise  u4:A (NOR2X1)\n        pin       0.181       2.967  fall  u4:Y (NOR2X1)\n        pin       0.000       2.967  fall  f1:D (DFFNEGX1)\n    arrival                   2.967        data arrival time\n\nrelated pin      25.000      25.000  fall  f1:CLK (DFFNEGX1)\n constraint       1.518      26.518        library hold_falling\n   required                  26.518        data required time\n------------------------------------------------------\n      slack                 -23.551        VIOLATED\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003eot\u0026gt; report_timing      # report the most critical path\nStartpoint    : inp1\nEndpoint      : f1:D\nAnalysis type : min\n------------------------------------------------------\n       Type       Delay        Time   Dir  Description\n------------------------------------------------------\n       port       0.000       0.000  fall  inp1\n        pin       0.000       0.000  fall  u1:A (NAND2X1)\n        pin       2.786       2.786  rise  u1:Y (NAND2X1)\n        pin       0.000       2.786  rise  u4:A (NOR2X1)\n        pin       0.181       2.967  fall  u4:Y (NOR2X1)\n        pin       0.000       2.967  fall  f1:D (DFFNEGX1)\n    arrival                   2.967        data arrival time\n\nrelated pin      25.000      25.000  fall  f1:CLK (DFFNEGX1)\n constraint       1.518      26.518        library hold_falling\n   required                  26.518        data required time\n------------------------------------------------------\n      slack                 -23.551        VIOLATED\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe critical path originates from the primary input \u003ccode\u003einp1\u003c/code\u003e and\nfeed into the data pin \u003ccode\u003ef1:D\u003c/code\u003e of the flip-flop \u003ccode\u003eDFFNEGX1\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCompile OpenTimer\u003c/h1\u003e\u003ca id=\"user-content-compile-opentimer\" class=\"anchor\" aria-label=\"Permalink: Compile OpenTimer\" href=\"#compile-opentimer\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSystem Requirements\u003c/h2\u003e\u003ca id=\"user-content-system-requirements\" class=\"anchor\" aria-label=\"Permalink: System Requirements\" href=\"#system-requirements\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer is very self-contained and has very few dependencies.\nTo compile OpenTimer, you need a \u003ca href=\"https://en.wikipedia.org/wiki/C%2B%2B17\" rel=\"nofollow\"\u003eC++17\u003c/a\u003e compiler.\nWe currently support:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eGNU C++ Compiler v7.3 with -std=c++1z\u003c/li\u003e\n\u003cli\u003eClang C++ Compiler v6.0 with -std=c++17\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eIn addition, you need a tcl shell interpreter:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://www.tcl.tk/about/language.html\" rel=\"nofollow\"\u003etclsh\u003c/a\u003e\n(most Unix/Linux/OSX distributions already include tclsh)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer has been tested to run well on Linux distributions and MAC OSX.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuild through CMake\u003c/h2\u003e\u003ca id=\"user-content-build-through-cmake\" class=\"anchor\" aria-label=\"Permalink: Build through CMake\" href=\"#build-through-cmake\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe use \u003ca href=\"https://cmake.org/\" rel=\"nofollow\"\u003eCMake\u003c/a\u003e to manage the source and tests.\nWe recommend using out-of-source build.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"~$ git clone https://github.com/OpenTimer/OpenTimer.git\n~$ cd OpenTimer\n~$ mkdir build\n~$ cd build\n~$ cmake ../ -DCMAKE_CXX_STANDARD=17\n~$ make \"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ git clone https://github.com/OpenTimer/OpenTimer.git\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ \u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e OpenTimer\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ mkdir build\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ \u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e build\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ cmake ../ -DCMAKE_CXX_STANDARD=17\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ make \u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAfter successful build, you can find binaries and libraries in the folders \u003ccode\u003ebin\u003c/code\u003e\nand \u003ccode\u003elib\u003c/code\u003e, respectively.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRun Tests\u003c/h2\u003e\u003ca id=\"user-content-run-tests\" class=\"anchor\" aria-label=\"Permalink: Run Tests\" href=\"#run-tests\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer uses \u003ca href=\"https://github.com/onqtam/doctest\"\u003eDoctest\u003c/a\u003e for unit tests and\n\u003ca href=\"https://sites.google.com/site/taucontest2015/\" rel=\"nofollow\"\u003eTAU15\u003c/a\u003e benchmarks for integration/regression tests. These benchmarks are generated by an\nindustry standard timer and are being used by many EDA researchers.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"~$ make test\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ make \u003cspan class=\"pl-c1\"\u003etest\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDesign Philosophy\u003c/h1\u003e\u003ca id=\"user-content-design-philosophy\" class=\"anchor\" aria-label=\"Permalink: Design Philosophy\" href=\"#design-philosophy\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer has a unique software architecture to\nefficiently enable parallel incremental timing.\nWe draw two levers on \u003cem\u003eperformance\u003c/em\u003e and \u003cem\u003euseability\u003c/em\u003e\nby grouping each timing operation to one of the three categories,\n\u003cem\u003ebuilder\u003c/em\u003e, \u003cem\u003eaction\u003c/em\u003e, and \u003cem\u003eaccessor\u003c/em\u003e.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003cth\u003eTime Complexity\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilder\u003c/td\u003e\n\u003ctd\u003ecreate lazy tasks to build an analysis framework\u003c/td\u003e\n\u003ctd\u003eread_celllib, insert_gate, set_slew\u003c/td\u003e\n\u003ctd\u003eO(1)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAction\u003c/td\u003e\n\u003ctd\u003ecarry out builder operations to update the timing\u003c/td\u003e\n\u003ctd\u003eupdate_timing, report_timing, report_slack\u003c/td\u003e\n\u003ctd\u003eAlgorithm-dependent\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAccessors\u003c/td\u003e\n\u003ctd\u003einspect the timer without changing any internal data structures\u003c/td\u003e\n\u003ctd\u003edump_timer, dump_slack, dump_net_load\u003c/td\u003e\n\u003ctd\u003eOperation-dependent\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuilder: OpenTimer Lineage\u003c/h2\u003e\u003ca id=\"user-content-builder-opentimer-lineage\" class=\"anchor\" aria-label=\"Permalink: Builder: OpenTimer Lineage\" href=\"#builder-opentimer-lineage\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer maintains a lineage graph of \u003cem\u003ebuilder\u003c/em\u003e operations\nto create a \u003cem\u003etask execution plan\u003c/em\u003e (TEP).\nA TEP starts with no dependency and keeps adding tasks to the lineage graph\nevery time you call a builder operation.\nIt records what transformations need to be executed\nwhen an action has been called.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/OpenTimer/OpenTimer/blob/master/image/lineage.png\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/lineage.png\" alt=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe above figure shows an example\nlineage graph of a sequence of builder operations.\nThe cyan path is the main lineage line\nwith additional tasks attached to enable parallel execution.\nOpenTimer use \u003ca href=\"https://github.com/taskflow/taskflow\"\u003eTaskflow\u003c/a\u003e to create dependency graphs.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAction: Update Timing\u003c/h2\u003e\u003ca id=\"user-content-action-update-timing\" class=\"anchor\" aria-label=\"Permalink: Action: Update Timing\" href=\"#action-update-timing\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA TEP is materialized and executed when the timer is requested to perform\nan \u003cem\u003eaction\u003c/em\u003e operation.\nEach action operation triggers timing update\nfrom the earliest task to the one that produces the result\nof the action call.\nInternally, OpenTimer creates task dependency graph to update timing in parallel,\nincluding forward (slew, arrival time)\nand backward (required arrival time) propagations.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/OpenTimer/OpenTimer/blob/master/image/update_timing_simple.png\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/update_timing_simple.png\" alt=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe figure above shows the dependency graph (forward in white, backward in cyan)\nto update the timing of the\n\u003ca href=\"/OpenTimer/OpenTimer/blob/master/example/simple/simple.v\"\u003esimple\u003c/a\u003e design.\nWhen an action call finishes, it cleans out the lineage graph\nwith all timing up-to-date.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAccessor: Inspect OpenTimer\u003c/h2\u003e\u003ca id=\"user-content-accessor-inspect-opentimer\" class=\"anchor\" aria-label=\"Permalink: Accessor: Inspect OpenTimer\" href=\"#accessor-inspect-opentimer\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003cem\u003eaccessor\u003c/em\u003e operations let you inspect the timer status and dump timing information.\nAll accessor operations are declared as \u003cem\u003econst methods\u003c/em\u003e in the timer class.\nCalling them promises not to alter any internal members.\nFor example, you can dump the timing graph into a DOT format and use tools like \u003ca href=\"https://dreampuf.github.io/GraphvizOnline/\" rel=\"nofollow\"\u003eGraphViz\u003c/a\u003e\nfor visualization.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/OpenTimer/OpenTimer/blob/master/image/simple_graph_raw.png\"\u003e\u003cimg align=\"right\" src=\"/OpenTimer/OpenTimer/raw/master/image/simple_graph_raw.png\" width=\"70%\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"ot\u0026gt; dump_graph  \ndigraph TimingGraph {\n  \u0026quot;inp1\u0026quot;;\n  ...  # skip for short\n  \u0026quot;f1:CLK\u0026quot; -\u0026gt; \u0026quot;f1:Q\u0026quot;;\n  \u0026quot;u1:B\u0026quot; -\u0026gt; \u0026quot;u1:Y\u0026quot;;\n  \u0026quot;u1:A\u0026quot; -\u0026gt; \u0026quot;u1:Y\u0026quot;;\n}\"\u003e\u003cpre\u003eot\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e dump_graph  \ndigraph TimingGraph {\n  \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003einp1\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e\n  ...  \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e skip for short\u003c/span\u003e\n  \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ef1:CLK\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ef1:Q\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e\n  \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eu1:B\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eu1:Y\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e\n  \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eu1:A\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eu1:Y\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOpenTimer Shell\u003c/h1\u003e\u003ca id=\"user-content-opentimer-shell\" class=\"anchor\" aria-label=\"Permalink: OpenTimer Shell\" href=\"#opentimer-shell\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer shell is a powerful command line tool to perform interactive analysis.\nIt is also the easiest way to get your first timing report off the ground.\nThe program \u003ccode\u003eot-shell\u003c/code\u003e can be found in the folder \u003ccode\u003ebin/\u003c/code\u003e after you\n\u003ca href=\"#compile-opentimer\"\u003eCompile OpenTimer\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCommands\u003c/h2\u003e\u003ca id=\"user-content-commands\" class=\"anchor\" aria-label=\"Permalink: Commands\" href=\"#commands\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe table below shows a list of commonly used commands.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCommand\u003c/th\u003e\n\u003cth\u003etype\u003c/th\u003e\n\u003cth\u003eArguments\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eread_celllib\u003c/td\u003e\n\u003ctd\u003ebuilder\u003c/td\u003e\n\u003ctd\u003e[-min | -max] file\u003c/td\u003e\n\u003ctd\u003eread the cell library for early and late splits\u003c/td\u003e\n\u003ctd\u003eread_celllib mylib.lib\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eread_verilog\u003c/td\u003e\n\u003ctd\u003ebuilder\u003c/td\u003e\n\u003ctd\u003efile\u003c/td\u003e\n\u003ctd\u003eread the verilog netlist\u003c/td\u003e\n\u003ctd\u003eread_verilog mynetlist.v\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eread_spef\u003c/td\u003e\n\u003ctd\u003ebuilder\u003c/td\u003e\n\u003ctd\u003efile\u003c/td\u003e\n\u003ctd\u003eread parasitics in SPEF\u003c/td\u003e\n\u003ctd\u003eread_spef myparasitics.spef\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eread_sdc\u003c/td\u003e\n\u003ctd\u003ebuilder\u003c/td\u003e\n\u003ctd\u003efile\u003c/td\u003e\n\u003ctd\u003eread a Synopsys Design Constraint file\u003c/td\u003e\n\u003ctd\u003eread_sdc myrule.sdc\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eupdate_timing\u003c/td\u003e\n\u003ctd\u003eaction\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003ctd\u003eupdate the timing\u003c/td\u003e\n\u003ctd\u003eupdate_timing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ereport_timing\u003c/td\u003e\n\u003ctd\u003eaction\u003c/td\u003e\n\u003ctd\u003e[-num_paths k]\u003c/td\u003e\n\u003ctd\u003ereport the critical paths\u003c/td\u003e\n\u003ctd\u003ereport_timing -num_paths 10\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ereport_tns\u003c/td\u003e\n\u003ctd\u003eaction\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003ctd\u003ereport the total negative slack\u003c/td\u003e\n\u003ctd\u003ereport_tns\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ereport_wns\u003c/td\u003e\n\u003ctd\u003eaction\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003ctd\u003ereport the worst negative slack\u003c/td\u003e\n\u003ctd\u003ereport_wns\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edump_graph\u003c/td\u003e\n\u003ctd\u003eaccessor\u003c/td\u003e\n\u003ctd\u003e[-o file]\u003c/td\u003e\n\u003ctd\u003edump the timing graph to a DOT format\u003c/td\u003e\n\u003ctd\u003edump_graph\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edump_timer\u003c/td\u003e\n\u003ctd\u003eaccessor\u003c/td\u003e\n\u003ctd\u003e[-o file]\u003c/td\u003e\n\u003ctd\u003edump the design statistics\u003c/td\u003e\n\u003ctd\u003edump_timer\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eTo see the full command list, visit \u003ca href=\"/OpenTimer/OpenTimer/blob/master/wiki/home.md\"\u003eOpenTimer Wiki\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIntegrate OpenTimer to your Project\u003c/h1\u003e\u003ca id=\"user-content-integrate-opentimer-to-your-project\" class=\"anchor\" aria-label=\"Permalink: Integrate OpenTimer to your Project\" href=\"#integrate-opentimer-to-your-project\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThere are a number of ways to develop your project on top of OpenTimer.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOption 1: Add OpenTimer Subproject\u003c/h2\u003e\u003ca id=\"user-content-option-1-add-opentimer-subproject\" class=\"anchor\" aria-label=\"Permalink: Option 1: Add OpenTimer Subproject\" href=\"#option-1-add-opentimer-subproject\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe easiest way to build an OpenTimer application is to include it as a subproject\nusing CMake \u003ca href=\"https://cmake.org/cmake/help/latest/command/add_subdirectory.html\" rel=\"nofollow\"\u003eadd_subdirectory\u003c/a\u003e.\nCopy OpenTimer to your project root directory and configure your CMakeLists\n\u003ca href=\"/OpenTimer/OpenTimer/blob/master/doc/CMakeLists-Subproject.template\"\u003eas follows\u003c/a\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-cmake notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cmake_minimum_required (VERSION 3.9)                  # CMake minimum version\nproject(app)                                          # your OpenTimer application\nadd_subdirectory(OpenTimer)                           # add OpenTimer project\ninclude_directories(${PROJECT_SOURCE_DIR}/OpenTimer)  # add OpenTimer include\n\nfind_package(Threads REQUIRED)                        # thread library (pthread)\n\nadd_executable(app app.cpp)                           # link to your app.cpp\ntarget_link_libraries(app OpenTimer Threads::Threads stdc++fs)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003ecmake_minimum_required\u003c/span\u003e (\u003cspan class=\"pl-c1\"\u003eVERSION\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e3.9\u003c/span\u003e)                  \u003cspan class=\"pl-c\"\u003e#\u003cspan class=\"pl-c\"\u003e CMake minimum version\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003eproject\u003c/span\u003e(app)                                          \u003cspan class=\"pl-c\"\u003e#\u003cspan class=\"pl-c\"\u003e your OpenTimer application\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003eadd_subdirectory\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003eOpenTimer\u003c/span\u003e)                           \u003cspan class=\"pl-c\"\u003e#\u003cspan class=\"pl-c\"\u003e add OpenTimer project\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003einclude_directories\u003c/span\u003e(\u003cspan class=\"pl-smi\"\u003e${\u003cspan class=\"pl-c1\"\u003ePROJECT_SOURCE_DIR\u003c/span\u003e}\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e/OpenTimer\u003c/span\u003e)  \u003cspan class=\"pl-c\"\u003e#\u003cspan class=\"pl-c\"\u003e add OpenTimer include\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-c1\"\u003efind_package\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003eThreads\u003c/span\u003e \u003cspan class=\"pl-s\"\u003eREQUIRED\u003c/span\u003e)                        \u003cspan class=\"pl-c\"\u003e#\u003cspan class=\"pl-c\"\u003e thread library (pthread)\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-c1\"\u003eadd_executable\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003eapp\u003c/span\u003e \u003cspan class=\"pl-s\"\u003eapp.cpp\u003c/span\u003e)                           \u003cspan class=\"pl-c\"\u003e#\u003cspan class=\"pl-c\"\u003e link to your app.cpp\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003etarget_link_libraries\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003eapp\u003c/span\u003e \u003cspan class=\"pl-s\"\u003eOpenTimer\u003c/span\u003e \u003cspan class=\"pl-s\"\u003eThreads::Threads\u003c/span\u003e \u003cspan class=\"pl-s\"\u003estdc++fs\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOption 2: Install OpenTimer\u003c/h2\u003e\u003ca id=\"user-content-option-2-install-opentimer\" class=\"anchor\" aria-label=\"Permalink: Option 2: Install OpenTimer\" href=\"#option-2-install-opentimer\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOur project \u003ca href=\"/OpenTimer/OpenTimer/blob/master/CMakeLists.txt\"\u003eCMakeLists.txt\u003c/a\u003e has defined the required files\nto install when you hit \u003ccode\u003emake install\u003c/code\u003e.\nThe installation paths are \u003ccode\u003e\u0026lt;prefix\u0026gt;/include\u003c/code\u003e, \u003ccode\u003e\u0026lt;prefix\u0026gt;/lib\u003c/code\u003e, and \u003ccode\u003e\u0026lt;prefix\u0026gt;/bin\u003c/code\u003e\nfor the hpp files, library, and executable where \u003ccode\u003e\u0026lt;prefix\u0026gt;\u003c/code\u003e can be configured\nthrough the cmake variable \u003ca href=\"https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html#variable:CMAKE_INSTALL_PREFIX\" rel=\"nofollow\"\u003eCMAKE_INSTALL_PREFIX\u003c/a\u003e.\nThe following example installs OpenTimer to \u003ccode\u003e/tmp\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"~$ cd build/\n~$ cmake ../ -DCMAKE_INSTALL_PREFIX=/tmp\n~$ make \n~$ make install\n~$ cd /tmp            # install OpenTimer to /tmp\n~$ ls\nbin/  include/  lib/  # OpenTimer headers, libraries, and binaries\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ \u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e build/\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ cmake ../ -DCMAKE_INSTALL_PREFIX=/tmp\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ make \n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ make install\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ \u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e /tmp            \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e install OpenTimer to /tmp\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ ls\nbin/  include/  lib/  \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e OpenTimer headers, libraries, and binaries\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo build your application on top of the OpenTimer headers and library,\nyou need \u003ccode\u003e-std=c++1z\u003c/code\u003e and \u003ccode\u003e-lstdc++fs\u003c/code\u003e flags\nto enable C++17 standard and \u003ca href=\"https://en.cppreference.com/w/cpp/experimental/fs\" rel=\"nofollow\"\u003efilesystem\u003c/a\u003e libraries.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"~$ g++ app.cpp -std=c++1z -O2 -I include -L lib -lOpenTimer -lpthread -o app.out \u0026quot;-lstdc++fs \u0026quot;\n~$ ./app.out\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ g++ app.cpp -std=c++1z -O2 -I include -L lib -lOpenTimer -lpthread -o app.out \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e-lstdc++fs \u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e$ ./app.out\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOpenTimer C++ API\u003c/h1\u003e\u003ca id=\"user-content-opentimer-c-api\" class=\"anchor\" aria-label=\"Permalink: OpenTimer C++ API\" href=\"#opentimer-c-api\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe class \u003ca href=\"/OpenTimer/OpenTimer/blob/master/ot/timer/timer.hpp\"\u003eTimer\u003c/a\u003e is the main entry you need to\ncall OpenTimer in your project.\nThe table below summarizes a list of commonly used methods.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMethod\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eArgument\u003c/th\u003e\n\u003cth\u003eReturn\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eread_celllib\u003c/td\u003e\n\u003ctd\u003ebuilder\u003c/td\u003e\n\u003ctd\u003epath, split\u003c/td\u003e\n\u003ctd\u003eself\u003c/td\u003e\n\u003ctd\u003eread the cell library for early and late splits\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eread_verilog\u003c/td\u003e\n\u003ctd\u003ebuilder\u003c/td\u003e\n\u003ctd\u003epath\u003c/td\u003e\n\u003ctd\u003eself\u003c/td\u003e\n\u003ctd\u003eread a verilog netlist\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eread_spef\u003c/td\u003e\n\u003ctd\u003ebuilder\u003c/td\u003e\n\u003ctd\u003epath\u003c/td\u003e\n\u003ctd\u003eself\u003c/td\u003e\n\u003ctd\u003eread parasitics in SPEF\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eread_sdc\u003c/td\u003e\n\u003ctd\u003ebuilder\u003c/td\u003e\n\u003ctd\u003epath\u003c/td\u003e\n\u003ctd\u003eself\u003c/td\u003e\n\u003ctd\u003eread a Synopsys Design Constraint file\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eupdate_timing\u003c/td\u003e\n\u003ctd\u003eaction\u003c/td\u003e\n\u003ctd\u003evoid\u003c/td\u003e\n\u003ctd\u003evoid\u003c/td\u003e\n\u003ctd\u003eupdate the timing; all timing values are up-to-date upon return\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003etns\u003c/td\u003e\n\u003ctd\u003eaction\u003c/td\u003e\n\u003ctd\u003evoid\u003c/td\u003e\n\u003ctd\u003eoptional of float\u003c/td\u003e\n\u003ctd\u003eupdate the timing and return the total negative slack if exists\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ewns\u003c/td\u003e\n\u003ctd\u003eaction\u003c/td\u003e\n\u003ctd\u003evoid\u003c/td\u003e\n\u003ctd\u003eoptional of float\u003c/td\u003e\n\u003ctd\u003eupdate the timing and return the worst negative slack if exists\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edump_graph\u003c/td\u003e\n\u003ctd\u003eaccessor\u003c/td\u003e\n\u003ctd\u003eostream\u003c/td\u003e\n\u003ctd\u003evoid\u003c/td\u003e\n\u003ctd\u003edump the timing graph in DOT format to an output stream\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edump_timer\u003c/td\u003e\n\u003ctd\u003eaccessor\u003c/td\u003e\n\u003ctd\u003eostream\u003c/td\u003e\n\u003ctd\u003evoid\u003c/td\u003e\n\u003ctd\u003edump the design statistics to an output stream\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eAll public methods are thread-safe\u003c/em\u003e as a result of OpenTimer lineage.\nThe example below shows an OpenTimer application and the use of builder, action, and accessor API.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"#include \u0026lt;ot/timer/timer.hpp\u0026gt;                     // top-level header to include\n\nint main(int argc, char *argv[]) {\n  \n  ot::Timer timer;                                // create a timer instance (thread-safe)\n  \n  timer.read_celllib(\u0026quot;simple.lib\u0026quot;, std::nullopt)  // read the library (O(1) builder)\n       .read_verilog(\u0026quot;simple.v\u0026quot;)                  // read the verilog netlist (O(1) builder)\n       .read_spef(\u0026quot;simple.spef\u0026quot;)                  // read the parasitics (O(1) builder)\n       .read_sdc(\u0026quot;simple.sdc\u0026quot;)                    // read the design constraints (O(1) builder)\n       .update_timing();                          // update timing (O(1) builder)\n\n  if(auto tns = timer.report_tns(); tns) std::cout \u0026lt;\u0026lt; \u0026quot;TNS: \u0026quot; \u0026lt;\u0026lt; *tns \u0026lt;\u0026lt; '\\n';  // (O(N) action)\n  if(auto wns = timer.report_wns(); wns) std::cout \u0026lt;\u0026lt; \u0026quot;WNS: \u0026quot; \u0026lt;\u0026lt; *wns \u0026lt;\u0026lt; '\\n';  // (O(N) action)\n  \n  timer.dump_timer(std::cout);                    // dump the timer details (O(1) accessor)\n  \n  return 0;\n}\"\u003e\u003cpre\u003e#\u003cspan class=\"pl-k\"\u003einclude\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026lt;\u003c/span\u003eot/timer/timer.hpp\u003cspan class=\"pl-pds\"\u003e\u0026gt;\u003c/span\u003e\u003c/span\u003e                     \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e top-level header to include\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003emain\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e argc, \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e *argv[]) {\n  \n  ot::Timer timer;                                \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e create a timer instance (thread-safe)\u003c/span\u003e\n  \n  timer.\u003cspan class=\"pl-c1\"\u003eread_celllib\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003esimple.lib\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, std::\u003cspan class=\"pl-c1\"\u003enullopt\u003c/span\u003e)  \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e read the library (O(1) builder)\u003c/span\u003e\n       .\u003cspan class=\"pl-c1\"\u003eread_verilog\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003esimple.v\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e)                  \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e read the verilog netlist (O(1) builder)\u003c/span\u003e\n       .\u003cspan class=\"pl-c1\"\u003eread_spef\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003esimple.spef\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e)                  \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e read the parasitics (O(1) builder)\u003c/span\u003e\n       .\u003cspan class=\"pl-c1\"\u003eread_sdc\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003esimple.sdc\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e)                    \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e read the design constraints (O(1) builder)\u003c/span\u003e\n       .\u003cspan class=\"pl-c1\"\u003eupdate_timing\u003c/span\u003e();                          \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e update timing (O(1) builder)\u003c/span\u003e\n\n  \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003eauto\u003c/span\u003e tns = timer.\u003cspan class=\"pl-c1\"\u003ereport_tns\u003c/span\u003e(); tns) std::cout \u0026lt;\u0026lt; \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eTNS: \u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u0026lt;\u0026lt; *tns \u0026lt;\u0026lt; \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003cspan class=\"pl-cce\"\u003e\\n\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e;  \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e (O(N) action)\u003c/span\u003e\n  \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003eauto\u003c/span\u003e wns = timer.\u003cspan class=\"pl-c1\"\u003ereport_wns\u003c/span\u003e(); wns) std::cout \u0026lt;\u0026lt; \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eWNS: \u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u0026lt;\u0026lt; *wns \u0026lt;\u0026lt; \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003cspan class=\"pl-cce\"\u003e\\n\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e;  \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e (O(N) action)\u003c/span\u003e\n  \n  timer.\u003cspan class=\"pl-c1\"\u003edump_timer\u003c/span\u003e(std::cout);                    \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e dump the timer details (O(1) accessor)\u003c/span\u003e\n  \n  \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e;\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo see the full API list, visit \u003ca href=\"/OpenTimer/OpenTimer/blob/master/wiki/home.md\"\u003eOpenTimer Wiki\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExamples\u003c/h1\u003e\u003ca id=\"user-content-examples\" class=\"anchor\" aria-label=\"Permalink: Examples\" href=\"#examples\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe folder \u003ca href=\"/OpenTimer/OpenTimer/blob/master/example\"\u003eexample\u003c/a\u003e contains several examples and is a great place to learn how to use OpenTimer.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eLibrary\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"/OpenTimer/OpenTimer/blob/master/example/simple\"\u003esimple\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eA timing report example on a sequential circuit design.\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://vlsiarch.ecen.okstate.edu/flow/\" rel=\"nofollow\"\u003eOSU Free PDK 45nm\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"/OpenTimer/OpenTimer/blob/master/example/incremental\"\u003eincremental\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eAn incremental timing example to create a sequential design from the ground up using OpenTimer's C++ API\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://vlsiarch.ecen.okstate.edu/flow/\" rel=\"nofollow\"\u003eOSU Free PDK 45nm\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"/OpenTimer/OpenTimer/blob/master/example/unit\"\u003eunit\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eA dimensional analysis example with different time unit conversions.\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://vlsiarch.ecen.okstate.edu/flow/\" rel=\"nofollow\"\u003eOSU Free PDK 45nm\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"/OpenTimer/OpenTimer/blob/master/example/sizer\"\u003esizer\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eA gate-sizing example on a design with six NAND2 cells.\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://www.nangate.com/?page_id=22\" rel=\"nofollow\"\u003eNanGate 45nm Open Cell Library\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"/OpenTimer/OpenTimer/blob/master/example/optimizer\"\u003eoptimizer\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eA timing-driven optimization example plus incremental timing update.\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://sites.google.com/site/taucontest2015/\" rel=\"nofollow\"\u003eTAU15 contest library\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eThe folder \u003ca href=\"/OpenTimer/OpenTimer/blob/master/benchmark\"\u003ebenchmark\u003c/a\u003e contains more designs and they are mainly used for internal regression\nand integration tests.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWho is Using OpenTimer?\u003c/h1\u003e\u003ca id=\"user-content-who-is-using-opentimer\" class=\"anchor\" aria-label=\"Permalink: Who is Using OpenTimer?\" href=\"#who-is-using-opentimer\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer is an award-winning tools. It won ACM TAU Timing Analysis Contests multiple times\n(\u003ca href=\"https://sites.google.com/site/taucontest2014/\" rel=\"nofollow\"\u003e1st Place\u003c/a\u003e in 2014, \u003ca href=\"https://sites.google.com/site/taucontest2015/\" rel=\"nofollow\"\u003e2nd Place\u003c/a\u003e in 2015, and \u003ca href=\"https://sites.google.com/site/taucontest2016/\" rel=\"nofollow\"\u003e1st Place\u003c/a\u003e in 2016),\nthe \u003ca href=\"https://fossi-foundation.org/2016/10/13/designcontest\" rel=\"nofollow\"\u003eSpecial Price\u003c/a\u003e in the 2016 LibreCores Design Contest,\nand the Best Tool Winner in the 2018 \u003ca href=\"https://woset-workshop.github.io/\" rel=\"nofollow\"\u003eWOSET\u003c/a\u003e at ICCAD.\nMany industry and academic people are using OpenTimer in their projects:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://sites.google.com/view/tau-contest-2019/home\" rel=\"nofollow\"\u003eGolden Timer\u003c/a\u003e, 2019 ACM TAU Timing Analysis Contest on Timing-driven Optimization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://sites.google.com/view/taucontest2018/\" rel=\"nofollow\"\u003eGolden Timer\u003c/a\u003e, 2018 ACM TAU Timing Analysis Contest on Timing Reports from an STA Graph\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://sites.google.com/site/taucontest2017/\" rel=\"nofollow\"\u003eGolden Timer\u003c/a\u003e, 2017 ACM TAU Timing Analysis Contest on Micro Modeling\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://sites.google.com/site/taucontest2016/\" rel=\"nofollow\"\u003eGolden Timer\u003c/a\u003e, 2016 ACM TAU Timing Analysis Contest on Micro Modeling\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://cad-contest.el.cycu.edu.tw/problem_C/default.html\" rel=\"nofollow\"\u003eGolden Timer\u003c/a\u003e, 2015 ACM/IEEE ICCAD Incremental Timing-driven Placement Contest\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.vlsisystemdesign.com/\" rel=\"nofollow\"\u003eVSD\u003c/a\u003e: VLSI System Design Corporation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jinwookjungs/open_design_flow\"\u003eOpenDesign Flow Database\u003c/a\u003e: the infrastructure for VLSI design and design automation research\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cloudv.io/\" rel=\"nofollow\"\u003eCloudV\u003c/a\u003e: a cloud-based platform to design and test chips for free\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/masc-ucsc/lgraph\"\u003eLGraph\u003c/a\u003e: live graph infrastructure for synthesis and simulation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://opencircuitdesign.com/qflow/history.html\" rel=\"nofollow\"\u003eQflow\u003c/a\u003e: a digital synthesis flow using open-source EDA tools\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gitlab.com/eclufsc/ophidian\" rel=\"nofollow\"\u003eOphidian\u003c/a\u003e: an open-source library for physical design research and teaching\u003c/li\u003e\n\u003c/ul\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://sites.google.com/site/taucontest2016/\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/tau16.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://sites.google.com/site/taucontest2017/\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/tau17.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://sites.google.com/view/taucontest2018/\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/tau18.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://sites.google.com/view/tau-contest-2019/home\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/tau19.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"http://cad-contest.el.cycu.edu.tw/problem_C/default.html\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/CAD-contest.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://www.vlsisystemdesign.com/\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/vsd.jpg\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://gitlab.com/eclufsc/ophidian\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/ophidian.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://cloudv.io/\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/cloudv.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://github.com/masc-ucsc/lgraph\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/lgraph.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"http://opencircuitdesign.com/qflow/history.html\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/qflow.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003ePlease don't hesitate to \u003ca href=\"mailto:twh760812@gmail.com\"\u003elet me know\u003c/a\u003e if I forgot your project!\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGet Involved\u003c/h1\u003e\u003ca id=\"user-content-get-involved\" class=\"anchor\" aria-label=\"Permalink: Get Involved\" href=\"#get-involved\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eReport bugs/issues by submitting a \u003ca href=\"https://github.com/OpenTimer/OpenTimer/issues\"\u003eGithub issue\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eSubmit contributions using \u003ca href=\"https://github.com/OpenTimer/OpenTimer/pulls\"\u003epull requests\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eSee documentation and manual in \u003ca href=\"/OpenTimer/OpenTimer/blob/master/wiki/home.md\"\u003eOpenTimer Wiki\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eStay tuned with our \u003ca href=\"https://github.com/OpenTimer/OpenTimer/projects\"\u003eproject progress\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eRead and cite our \u003ca href=\"/OpenTimer/OpenTimer/blob/master/doc/iccad15.pdf\"\u003eICCAD\u003c/a\u003e and \u003ca href=\"/OpenTimer/OpenTimer/blob/master/doc/tcad16.pdf\"\u003eTCAD\u003c/a\u003e papers.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributors \u0026amp; Acknowledgment\u003c/h1\u003e\u003ca id=\"user-content-contributors--acknowledgment\" class=\"anchor\" aria-label=\"Permalink: Contributors \u0026amp; Acknowledgment\" href=\"#contributors--acknowledgment\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer is being actively developed and contributed by the following people:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://twhuang.ece.illinois.edu/\" rel=\"nofollow\"\u003eTsung-Wei Huang\u003c/a\u003e created the OpenTimer project is now the chief architect.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://ece.illinois.edu/directory/profile/mdfwong\" rel=\"nofollow\"\u003eMartin Wong\u003c/a\u003e supported the OpenTimer project through NSF and DARPA funding.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aolofsson\"\u003eAndreas Olofsson\u003c/a\u003e supported the OpenTimer project through the DARPA IDEA project.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/clin99\"\u003eChun-Xun Lin\u003c/a\u003e implemented the prompt interface of OpenTimer shell.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:kunalpghosh@gmail.com\"\u003eKunal Ghosh\u003c/a\u003e provided a list of practical features to include in OpenTimer.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:palacedeforsaken@gmail.com\"\u003ePei-Yu Lee\u003c/a\u003e provided useful incremental timing discussion and helped fix bugs.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:tinyinlai@gmail.com\"\u003eTin-Yin Lai\u003c/a\u003e discussed micro modeling algorithms and helped fix bugs.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:jinhu@umich.edu\"\u003eJin Hu\u003c/a\u003e helped define the timing API and produced the golden benchmarks for integration tests.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:mckima@us.ibm.com\"\u003eMyung-Chul Kim\u003c/a\u003e helped test OpenTimer through ICCAD CAD contest.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:george@geochrist.com\"\u003eGeorge Chen\u003c/a\u003e helped defined path report formats and test OpenTimer through TAU contest.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:jignesh.shah@intel.com\"\u003eJignesh Shah\u003c/a\u003e contributed to the area and power report commands.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:poyipenny@gmail.com\"\u003ePao-I Chen\u003c/a\u003e helped design the logo of OpenTimer.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:tkdlezz@gmail.com\"\u003eLeslie Hwang\u003c/a\u003e reviewed the documentation and README.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:song.chen@synopsys.com\"\u003eSong Chen\u003c/a\u003e shared his opinion about command designs to avoid naming conflicts and litigation.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://randy1005.github.io/\" rel=\"nofollow\"\u003eChe Chang\u003c/a\u003e designed parallelization strategies and performance optimizations to accelerate critical path generation.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp dir=\"auto\"\u003eMeanwhile, we appreciate the support from many organizations for our development of OpenTimer.\nPlease don't hesitate to \u003ca href=\"mailto:twh760812@gmail.com\"\u003elet me know\u003c/a\u003e if I forgot you!\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://illinois.edu/\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/uiuc.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://csl.illinois.edu/\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/csl.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://www.nsf.gov/\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/nsf.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://www.darpa.mil/news-events/2017-09-13\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/darpa.png\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003ca href=\"https://www.vlsisystemdesign.com/\" rel=\"nofollow\"\u003e\u003cimg src=\"/OpenTimer/OpenTimer/raw/master/image/vsd.jpg\" width=\"100px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLicense\u003c/h1\u003e\u003ca id=\"user-content-license\" class=\"anchor\" aria-label=\"Permalink: License\" href=\"#license\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/026441a10e0fdef1b4e4580b3b4980038df8feb2284aebef08bfdc080b60ab4c/687474703a2f2f6f70656e736f757263652e6f72672f74726164656d61726b732f6f70656e736f757263652f4f53492d417070726f7665642d4c6963656e73652d313030783133372e706e67\"\u003e\u003cimg align=\"right\" src=\"https://camo.githubusercontent.com/026441a10e0fdef1b4e4580b3b4980038df8feb2284aebef08bfdc080b60ab4c/687474703a2f2f6f70656e736f757263652e6f72672f74726164656d61726b732f6f70656e736f757263652f4f53492d417070726f7665642d4c6963656e73652d313030783133372e706e67\" data-canonical-src=\"http://opensource.org/trademarks/opensource/OSI-Approved-License-100x137.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOpenTimer is licensed under the \u003ca href=\"/OpenTimer/OpenTimer/blob/master/LICENSE\"\u003eMIT License\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eCopyright © 2018 \u003ca href=\"https://twhuang.ece.illinois.edu/\" rel=\"nofollow\"\u003eDr. Tsung-Wei Huang\u003c/a\u003e and \u003ca href=\"https://ece.illinois.edu/directory/profile/mdfwong\" rel=\"nofollow\"\u003eDr. Martin Wong\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe University of Illinois at Urbana-Champaign, IL, USA\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003cp dir=\"auto\"\u003eThe core of OpenTimer is under MIT license. However, it is built, tested, and documented\nusing several third-party tools and services. Thanks a lot!\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/nholthaus/units\"\u003eunits\u003c/a\u003e: a compile-time header-only dimensional analysis and unit conversion\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/OpenTimer/Parser-SPEF\"\u003eParser-SPEF\u003c/a\u003e: a fast C++ header-only parser for standard parasitic exchange format (SPEF)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/taocpp/PEGTL\"\u003ePEGTL\u003c/a\u003e: parsing expression grammar template library\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/taskflow/taskflow\"\u003eTaskflow\u003c/a\u003e: fast C++ parallel programming with task dependencies\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.nangate.com/?page_id=22\" rel=\"nofollow\"\u003eNanGate 45nm Library\u003c/a\u003e: open-source standard-cell library for testing and exploring EDA flows\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://vlsiarch.ecen.okstate.edu/flow/\" rel=\"nofollow\"\u003eOSU PDK\u003c/a\u003e: Oklahoma State University system on chip (SoC) design flows\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.synopsys.com/community/interoperability-programs/tap-in.html\" rel=\"nofollow\"\u003eSynopsys TAP-in\u003c/a\u003e: Synopsys technology access program for liberty user guide and open-source SDC parser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eYou can find a copy of these licenses under the folder \u003ca href=\"/OpenTimer/OpenTimer/blob/master/licenses\"\u003elicenses\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"OpenTimer \u003cimg align=\"right\" width=\"10%\" src=\"image/logo.png\"\u003e","fully_qualified_name":"OpenTimer \u003cimg align=\"right\" width=\"10%\" src=\"image/logo.png\"\u003e","kind":"section_1","ident_start":2,"ident_end":64,"extent_start":0,"extent_end":661,"ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":64}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":12,"utf16_col":0}}},{"name":"Why OpenTimer?","fully_qualified_name":"Why OpenTimer?","kind":"section_1","ident_start":663,"ident_end":677,"extent_start":661,"extent_end":1205,"ident_utf16":{"start":{"line_number":12,"utf16_col":2},"end":{"line_number":12,"utf16_col":16}},"extent_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":28,"utf16_col":0}}},{"name":"Get Started with OpenTimer","fully_qualified_name":"Get Started with OpenTimer","kind":"section_1","ident_start":1207,"ident_end":1233,"extent_start":1205,"extent_end":3481,"ident_utf16":{"start":{"line_number":28,"utf16_col":2},"end":{"line_number":28,"utf16_col":28}},"extent_utf16":{"start":{"line_number":28,"utf16_col":0},"end":{"line_number":91,"utf16_col":0}}},{"name":"Compile OpenTimer","fully_qualified_name":"Compile OpenTimer","kind":"section_1","ident_start":3483,"ident_end":3500,"extent_start":3481,"extent_end":4671,"ident_utf16":{"start":{"line_number":91,"utf16_col":2},"end":{"line_number":91,"utf16_col":19}},"extent_utf16":{"start":{"line_number":91,"utf16_col":0},"end":{"line_number":135,"utf16_col":0}}},{"name":"System Requirements","fully_qualified_name":"System Requirements","kind":"section_2","ident_start":3505,"ident_end":3524,"extent_start":3502,"extent_end":3988,"ident_utf16":{"start":{"line_number":93,"utf16_col":3},"end":{"line_number":93,"utf16_col":22}},"extent_utf16":{"start":{"line_number":93,"utf16_col":0},"end":{"line_number":109,"utf16_col":0}}},{"name":"Build through CMake","fully_qualified_name":"Build through CMake","kind":"section_2","ident_start":3991,"ident_end":4010,"extent_start":3988,"extent_end":4386,"ident_utf16":{"start":{"line_number":109,"utf16_col":3},"end":{"line_number":109,"utf16_col":22}},"extent_utf16":{"start":{"line_number":109,"utf16_col":0},"end":{"line_number":126,"utf16_col":0}}},{"name":"Run Tests","fully_qualified_name":"Run Tests","kind":"section_2","ident_start":4389,"ident_end":4398,"extent_start":4386,"extent_end":4671,"ident_utf16":{"start":{"line_number":126,"utf16_col":3},"end":{"line_number":126,"utf16_col":12}},"extent_utf16":{"start":{"line_number":126,"utf16_col":0},"end":{"line_number":135,"utf16_col":0}}},{"name":"Design Philosophy","fully_qualified_name":"Design Philosophy","kind":"section_1","ident_start":4673,"ident_end":4690,"extent_start":4671,"extent_end":7326,"ident_utf16":{"start":{"line_number":135,"utf16_col":2},"end":{"line_number":135,"utf16_col":19}},"extent_utf16":{"start":{"line_number":135,"utf16_col":0},"end":{"line_number":207,"utf16_col":0}}},{"name":"Builder: OpenTimer Lineage","fully_qualified_name":"Builder: OpenTimer Lineage","kind":"section_2","ident_start":5423,"ident_end":5449,"extent_start":5420,"extent_end":6032,"ident_utf16":{"start":{"line_number":149,"utf16_col":3},"end":{"line_number":149,"utf16_col":29}},"extent_utf16":{"start":{"line_number":149,"utf16_col":0},"end":{"line_number":167,"utf16_col":0}}},{"name":"Action: Update Timing","fully_qualified_name":"Action: Update Timing","kind":"section_2","ident_start":6035,"ident_end":6056,"extent_start":6032,"extent_end":6735,"ident_utf16":{"start":{"line_number":167,"utf16_col":3},"end":{"line_number":167,"utf16_col":24}},"extent_utf16":{"start":{"line_number":167,"utf16_col":0},"end":{"line_number":186,"utf16_col":0}}},{"name":"Accessor: Inspect OpenTimer","fully_qualified_name":"Accessor: Inspect OpenTimer","kind":"section_2","ident_start":6738,"ident_end":6765,"extent_start":6735,"extent_end":7326,"ident_utf16":{"start":{"line_number":186,"utf16_col":3},"end":{"line_number":186,"utf16_col":30}},"extent_utf16":{"start":{"line_number":186,"utf16_col":0},"end":{"line_number":207,"utf16_col":0}}},{"name":"OpenTimer Shell","fully_qualified_name":"OpenTimer Shell","kind":"section_1","ident_start":7328,"ident_end":7343,"extent_start":7326,"extent_end":8754,"ident_utf16":{"start":{"line_number":207,"utf16_col":2},"end":{"line_number":207,"utf16_col":17}},"extent_utf16":{"start":{"line_number":207,"utf16_col":0},"end":{"line_number":233,"utf16_col":0}}},{"name":"Commands","fully_qualified_name":"Commands","kind":"section_2","ident_start":7614,"ident_end":7622,"extent_start":7611,"extent_end":8754,"ident_utf16":{"start":{"line_number":214,"utf16_col":3},"end":{"line_number":214,"utf16_col":11}},"extent_utf16":{"start":{"line_number":214,"utf16_col":0},"end":{"line_number":233,"utf16_col":0}}},{"name":"Integrate OpenTimer to your Project","fully_qualified_name":"Integrate OpenTimer to your Project","kind":"section_1","ident_start":8756,"ident_end":8791,"extent_start":8754,"extent_end":10842,"ident_utf16":{"start":{"line_number":233,"utf16_col":2},"end":{"line_number":233,"utf16_col":37}},"extent_utf16":{"start":{"line_number":233,"utf16_col":0},"end":{"line_number":284,"utf16_col":0}}},{"name":"Option 1: Add OpenTimer Subproject","fully_qualified_name":"Option 1: Add OpenTimer Subproject","kind":"section_2","ident_start":8869,"ident_end":8903,"extent_start":8866,"extent_end":9769,"ident_utf16":{"start":{"line_number":237,"utf16_col":3},"end":{"line_number":237,"utf16_col":37}},"extent_utf16":{"start":{"line_number":237,"utf16_col":0},"end":{"line_number":256,"utf16_col":0}}},{"name":"Option 2: Install OpenTimer","fully_qualified_name":"Option 2: Install OpenTimer","kind":"section_2","ident_start":9772,"ident_end":9799,"extent_start":9769,"extent_end":10842,"ident_utf16":{"start":{"line_number":256,"utf16_col":3},"end":{"line_number":256,"utf16_col":30}},"extent_utf16":{"start":{"line_number":256,"utf16_col":0},"end":{"line_number":284,"utf16_col":0}}},{"name":"OpenTimer C++ API","fully_qualified_name":"OpenTimer C++ API","kind":"section_1","ident_start":10844,"ident_end":10861,"extent_start":10842,"extent_end":13176,"ident_utf16":{"start":{"line_number":284,"utf16_col":2},"end":{"line_number":284,"utf16_col":19}},"extent_utf16":{"start":{"line_number":284,"utf16_col":0},"end":{"line_number":330,"utf16_col":0}}},{"name":"Examples","fully_qualified_name":"Examples","kind":"section_1","ident_start":13178,"ident_end":13186,"extent_start":13176,"extent_end":14201,"ident_utf16":{"start":{"line_number":330,"utf16_col":2},"end":{"line_number":330,"utf16_col":10}},"extent_utf16":{"start":{"line_number":330,"utf16_col":0},"end":{"line_number":346,"utf16_col":0}}},{"name":"Who is Using OpenTimer?","fully_qualified_name":"Who is Using OpenTimer?","kind":"section_1","ident_start":14203,"ident_end":14226,"extent_start":14201,"extent_end":16234,"ident_utf16":{"start":{"line_number":346,"utf16_col":2},"end":{"line_number":346,"utf16_col":25}},"extent_utf16":{"start":{"line_number":346,"utf16_col":0},"end":{"line_number":373,"utf16_col":0}}},{"name":"Get Involved","fully_qualified_name":"Get Involved","kind":"section_1","ident_start":16236,"ident_end":16248,"extent_start":16234,"extent_end":16592,"ident_utf16":{"start":{"line_number":373,"utf16_col":2},"end":{"line_number":373,"utf16_col":14}},"extent_utf16":{"start":{"line_number":373,"utf16_col":0},"end":{"line_number":381,"utf16_col":0}}},{"name":"Contributors \u0026 Acknowledgment","fully_qualified_name":"Contributors \u0026 Acknowledgment","kind":"section_1","ident_start":16594,"ident_end":16623,"extent_start":16592,"extent_end":19219,"ident_utf16":{"start":{"line_number":381,"utf16_col":2},"end":{"line_number":381,"utf16_col":31}},"extent_utf16":{"start":{"line_number":381,"utf16_col":0},"end":{"line_number":415,"utf16_col":0}}},{"name":"License","fully_qualified_name":"License","kind":"section_1","ident_start":19221,"ident_end":19228,"extent_start":19219,"extent_end":24890,"ident_utf16":{"start":{"line_number":415,"utf16_col":2},"end":{"line_number":415,"utf16_col":9}},"extent_utf16":{"start":{"line_number":415,"utf16_col":0},"end":{"line_number":502,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":39079545,"defaultBranch":"master","name":"OpenTimer","ownerLogin":"OpenTimer","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2015-07-14T14:26:43.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/40002350?v=4","public":true,"private":false,"isOrgOwned":true,"isArchived":false},"currentUser":null,"uploadToken":"atsCypCoNaYyW1_wRD_3LcBMGLKP2E-yNipVmoOl9uVjC68z2gNLMnx9AxYxji7qnr4JE0FUHekrZEoTqK8Fmg","allShortcutsEnabled":false,"treeExpanded":true,"path":"README.md","symbolsExpanded":false,"refInfo":{"name":"master","listCacheKey":"v0:1561749618.0","canEdit":false,"currentOid":"cd0565fc7a720368e75751c717be92d76350ee8d"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"":{"items":[{"name":".backup_pr1","path":".backup_pr1","contentType":"directory"},{"name":".backup_pr2","path":".backup_pr2","contentType":"directory"},{"name":".backup_pr3","path":".backup_pr3","contentType":"directory"},{"name":".github","path":".github","contentType":"directory"},{"name":"benchmark","path":"benchmark","contentType":"directory"},{"name":"doc","path":"doc","contentType":"directory"},{"name":"example","path":"example","contentType":"directory"},{"name":"image","path":"image","contentType":"directory"},{"name":"inttest","path":"inttest","contentType":"directory"},{"name":"licenses","path":"licenses","contentType":"directory"},{"name":"main","path":"main","contentType":"directory"},{"name":"ot","path":"ot","contentType":"directory"},{"name":"sbin","path":"sbin","contentType":"directory"},{"name":"unittest","path":"unittest","contentType":"directory"},{"name":"wiki","path":"wiki","contentType":"directory"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".travis.yml","path":".travis.yml","contentType":"file"},{"name":"CMakeLists.txt","path":"CMakeLists.txt","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"}],"totalCount":21}},"fileTreeProcessingTime":26.617817,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"master","listCacheKey":"v0:1561749618.0","canEdit":false,"refType":"branch","currentOid":"cd0565fc7a720368e75751c717be92d76350ee8d","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"README.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/OpenTimer/OpenTimer/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"README.md","displayUrl":"https://github.com/OpenTimer/OpenTimer/blob/master/README.md?raw=true","headerInfo":{"blobSize":"24.3 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"bd6c747","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FOpenTimer%2FOpenTimer%2Fblob%2Fmaster%2FREADME.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"502","truncatedSloc":"393"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"isIssueTemplate":false,"isDiscussionTemplate":false,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/OpenTimer/OpenTimer/blob/master/README.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/OpenTimer/OpenTimer/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/OpenTimer/OpenTimer/raw/refs/heads/master/README.md","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null},"copilotInfo":null,"copilotAccessAllowed":false,"copilotSpacesEnabled":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true},"codeViewBlobLayoutRoute.StyledBlob":{"rawLines":["# OpenTimer \u003cimg align=\"right\" width=\"10%\" src=\"image/logo.png\"\u003e","","[![Build Status](https://travis-ci.org/OpenTimer/OpenTimer.svg?branch=master)](https://travis-ci.org/OpenTimer/OpenTimer)","[![Standard](image/cpp17.svg)](https://en.wikipedia.org/wiki/C%2B%2B#Standardization)","[![Download](image/download.svg)](https://github.com/OpenTimer/OpenTimer/archive/master.zip)","[![Version](image/version_badge.svg)](https://github.com/OpenTimer/OpenTimer/tree/master)","[![AskMe](image/askme.svg)][Github issues]","[![Wiki](image/doc-wiki.svg)][OpenTimer Wiki]","[![License: MIT](./image/license_badge.svg)](./LICENSE)","","A High-Performance Timing Analysis Tool for VLSI Systems","","# Why OpenTimer?","","\u003cimg align=\"right\" width=\"30%\" src=\"image/critical_path.jpg\"\u003e","","OpenTimer is a new [static timing analysis (STA)][STA] tool to help IC designers","quickly verify the circuit timing.","It is developed completely from the ground up using *C++17*","to efficiently support parallel and incremental timing. ","Key features are:","","+ Industry standard format (.lib, .v, .spef, .sdc) support","+ Graph- and path-based timing analysis","+ Parallel incremental timing for fast timing closure","+ Award-winning tools and golden timers in CAD Contests","","","# Get Started with OpenTimer","","The easiest way to start using OpenTimer is to use *OpenTimer shell*.","OpenTimer shell is a powerful tool for interactive analysis","and the simplest way to learn core functionalities.","[Compile OpenTimer](#compile-opentimer) and launch the shell program `ot-shell`","under the `bin` directory.","","```bash","~$ ./bin/ot-shell","  ____              _______              "," / __ \\___  ___ ___/_  __(_)_ _  ___ ____","/ /_/ / _ \\/ -_) _ \\/ / / /  ' \\/ -_) __/","\\____/ .__/\\__/_//_/_/ /_/_/_/_/\\__/_/       v2","    /_/                                     ","MIT License: type \"license\" to see more details.","For help, type \"help\".","For bug reports, issues, and manual, please see:","\u003chttps://github.com/OpenTimer/OpenTimer\u003e.","ot\u003e ","```","","We have provided a [simple design](./example/simple)","which consists of five gates (one NAND, one NOR, two INV, one FF) and one clock. ","Move to the folder and read this simple design.","","\u003cimg align=\"right\" src=\"image/simple_schematic.jpg\" width=\"55%\"\u003e","","```bash","ot\u003e cd example/simple","ot\u003e read_celllib osu018_stdcells.lib","ot\u003e read_verilog simple.v   ","ot\u003e read_sdc simple.sdc","```","","Report the timing to show the most critical path.","","```text","ot\u003e report_timing      # report the most critical path","Startpoint    : inp1","Endpoint      : f1:D","Analysis type : min","------------------------------------------------------","       Type       Delay        Time   Dir  Description","------------------------------------------------------","       port       0.000       0.000  fall  inp1","        pin       0.000       0.000  fall  u1:A (NAND2X1)","        pin       2.786       2.786  rise  u1:Y (NAND2X1)","        pin       0.000       2.786  rise  u4:A (NOR2X1)","        pin       0.181       2.967  fall  u4:Y (NOR2X1)","        pin       0.000       2.967  fall  f1:D (DFFNEGX1)","    arrival                   2.967        data arrival time","","related pin      25.000      25.000  fall  f1:CLK (DFFNEGX1)"," constraint       1.518      26.518        library hold_falling","   required                  26.518        data required time","------------------------------------------------------","      slack                 -23.551        VIOLATED","```","","The critical path originates from the primary input `inp1` and ","feed into the data pin `f1:D` of the flip-flop `DFFNEGX1`.","","# Compile OpenTimer","","## System Requirements","","OpenTimer is very self-contained and has very few dependencies.","To compile OpenTimer, you need a [C++17][C++17] compiler. ","We currently support:","","+ GNU C++ Compiler v7.3 with -std=c++1z","+ Clang C++ Compiler v6.0 with -std=c++17","","In addition, you need a tcl shell interpreter:","","+ [tclsh](https://www.tcl.tk/about/language.html) ","(most Unix/Linux/OSX distributions already include tclsh)","","OpenTimer has been tested to run well on Linux distributions and MAC OSX.","","## Build through CMake","","We use [CMake](https://cmake.org/) to manage the source and tests.","We recommend using out-of-source build.","","```bash","~$ git clone https://github.com/OpenTimer/OpenTimer.git","~$ cd OpenTimer","~$ mkdir build","~$ cd build","~$ cmake ../ -DCMAKE_CXX_STANDARD=17","~$ make ","```","","After successful build, you can find binaries and libraries in the folders `bin` ","and `lib`, respectively.","","## Run Tests","OpenTimer uses [Doctest](https://github.com/onqtam/doctest) for unit tests and","[TAU15][TAU15] benchmarks for integration/regression tests. These benchmarks are generated by an ","industry standard timer and are being used by many EDA researchers.","","```bash","~$ make test","```","","# Design Philosophy","","OpenTimer has a unique software architecture to","efficiently enable parallel incremental timing.","We draw two levers on *performance* and *useability*","by grouping each timing operation to one of the three categories,","*builder*, *action*, and *accessor*.","","| Type |  Description | Example | Time Complexity |","| -------  |  ----------- |  --- | -- |","| Builder  | create lazy tasks to build an analysis framework | read_celllib, insert_gate, set_slew | O(1) |","| Action   | carry out builder operations to update the timing | update_timing, report_timing, report_slack | Algorithm-dependent |","| Accessors| inspect the timer without changing any internal data structures | dump_timer, dump_slack, dump_net_load | Operation-dependent |","","## Builder: OpenTimer Lineage","","OpenTimer maintains a lineage graph of *builder* operations ","to create a *task execution plan* (TEP).","A TEP starts with no dependency and keeps adding tasks to the lineage graph","every time you call a builder operation.","It records what transformations need to be executed ","when an action has been called.","","","![](image/lineage.png)","","The above figure shows an example","lineage graph of a sequence of builder operations.","The cyan path is the main lineage line ","with additional tasks attached to enable parallel execution.","OpenTimer use [Taskflow][Taskflow] to create dependency graphs.","","## Action: Update Timing","","A TEP is materialized and executed when the timer is requested to perform ","an *action* operation.","Each action operation triggers timing update","from the earliest task to the one that produces the result","of the action call.","Internally, OpenTimer creates task dependency graph to update timing in parallel,","including forward (slew, arrival time) ","and backward (required arrival time) propagations.","","![](image/update_timing_simple.png)","","The figure above shows the dependency graph (forward in white, backward in cyan) ","to update the timing of the ","[simple](example/simple/simple.v) design.","When an action call finishes, it cleans out the lineage graph","with all timing up-to-date.","","## Accessor: Inspect OpenTimer","","The *accessor* operations let you inspect the timer status and dump timing information.","All accessor operations are declared as *const methods* in the timer class. ","Calling them promises not to alter any internal members.","For example, you can dump the timing graph into a DOT format and use tools like [GraphViz][GraphViz]","for visualization.","","\u003cimg align=\"right\" src=\"image/simple_graph_raw.png\" width=\"70%\"\u003e","","```bash","ot\u003e dump_graph  ","digraph TimingGraph {","  \"inp1\";","  ...  # skip for short","  \"f1:CLK\" -\u003e \"f1:Q\";","  \"u1:B\" -\u003e \"u1:Y\";","  \"u1:A\" -\u003e \"u1:Y\";","}","```","","# OpenTimer Shell","","OpenTimer shell is a powerful command line tool to perform interactive analysis.","It is also the easiest way to get your first timing report off the ground.","The program `ot-shell` can be found in the folder `bin/` after you ","[Compile OpenTimer](#compile-opentimer).","","## Commands","","The table below shows a list of commonly used commands.","","| Command | type | Arguments | Description | Example |","| ------- | ---- | --------- | ----------- | ------- |","| read_celllib | builder | [-min \\| -max] file | read the cell library for early and late splits | read_celllib mylib.lib |","| read_verilog | builder | file | read the verilog netlist | read_verilog mynetlist.v |","| read_spef | builder | file | read parasitics in SPEF | read_spef myparasitics.spef |","| read_sdc | builder | file | read a Synopsys Design Constraint file | read_sdc myrule.sdc |","| update_timing | action | none | update the timing | update_timing |","| report_timing | action | [-num_paths k] | report the critical paths | report_timing -num_paths 10 |","| report_tns | action | none | report the total negative slack | report_tns |","| report_wns | action | none | report the worst negative slack | report_wns |","| dump_graph | accessor | [-o file] | dump the timing graph to a DOT format | dump_graph |","| dump_timer | accessor | [-o file] | dump the design statistics | dump_timer |","","To see the full command list, visit [OpenTimer Wiki][OpenTimer Wiki].","","# Integrate OpenTimer to your Project","","There are a number of ways to develop your project on top of OpenTimer.","","## Option 1: Add OpenTimer Subproject","","The easiest way to build an OpenTimer application is to include it as a subproject","using CMake [add_subdirectory](https://cmake.org/cmake/help/latest/command/add_subdirectory.html).","Copy OpenTimer to your project root directory and configure your CMakeLists ","[as follows](doc/CMakeLists-Subproject.template):","","```CMake","cmake_minimum_required (VERSION 3.9)                  # CMake minimum version","project(app)                                          # your OpenTimer application","add_subdirectory(OpenTimer)                           # add OpenTimer project","include_directories(${PROJECT_SOURCE_DIR}/OpenTimer)  # add OpenTimer include","","find_package(Threads REQUIRED)                        # thread library (pthread)","","add_executable(app app.cpp)                           # link to your app.cpp","target_link_libraries(app OpenTimer Threads::Threads stdc++fs)","```","","## Option 2: Install OpenTimer ","","Our project [CMakeLists.txt](CMakeLists.txt) has defined the required files","to install when you hit `make install`.","The installation paths are `\u003cprefix\u003e/include`, `\u003cprefix\u003e/lib`, and `\u003cprefix\u003e/bin`","for the hpp files, library, and executable where `\u003cprefix\u003e` can be configured ","through the cmake variable [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html#variable:CMAKE_INSTALL_PREFIX).","The following example installs OpenTimer to `/tmp`.","","```bash","~$ cd build/","~$ cmake ../ -DCMAKE_INSTALL_PREFIX=/tmp","~$ make ","~$ make install","~$ cd /tmp            # install OpenTimer to /tmp","~$ ls","bin/  include/  lib/  # OpenTimer headers, libraries, and binaries","```","","To build your application on top of the OpenTimer headers and library,","you need `-std=c++1z` and `-lstdc++fs` flags","to enable C++17 standard and [filesystem](https://en.cppreference.com/w/cpp/experimental/fs) libraries.","","```bash","~$ g++ app.cpp -std=c++1z -O2 -I include -L lib -lOpenTimer -lpthread -o app.out \"-lstdc++fs \"","~$ ./app.out","```","","# OpenTimer C++ API","","The class [Timer](ot/timer/timer.hpp) is the main entry you need to ","call OpenTimer in your project. ","The table below summarizes a list of commonly used methods.","","| Method | Type | Argument | Return | Description |","| ------ | ---- | -------- | ------ | ----------- |","| read_celllib| builder | path, split | self | read the cell library for early and late splits |","| read_verilog| builder | path | self | read a verilog netlist |","| read_spef   | builder | path | self | read parasitics in SPEF |","| read_sdc    | builder | path | self | read a Synopsys Design Constraint file |","| update_timing | action | void | void | update the timing; all timing values are up-to-date upon return |","| tns | action | void | optional of float | update the timing and return the total negative slack if exists |","| wns | action | void | optional of float | update the timing and return the worst negative slack if exists |","| dump_graph | accessor | ostream | void | dump the timing graph in DOT format to an output stream |","| dump_timer | accessor | ostream | void | dump the design statistics to an output stream |","","","*All public methods are thread-safe* as a result of OpenTimer lineage.","The example below shows an OpenTimer application and the use of builder, action, and accessor API.","","```cpp","#include \u003cot/timer/timer.hpp\u003e                     // top-level header to include","","int main(int argc, char *argv[]) {","  ","  ot::Timer timer;                                // create a timer instance (thread-safe)","  ","  timer.read_celllib(\"simple.lib\", std::nullopt)  // read the library (O(1) builder)","       .read_verilog(\"simple.v\")                  // read the verilog netlist (O(1) builder)","       .read_spef(\"simple.spef\")                  // read the parasitics (O(1) builder)","       .read_sdc(\"simple.sdc\")                    // read the design constraints (O(1) builder)","       .update_timing();                          // update timing (O(1) builder)","","  if(auto tns = timer.report_tns(); tns) std::cout \u003c\u003c \"TNS: \" \u003c\u003c *tns \u003c\u003c '\\n';  // (O(N) action)","  if(auto wns = timer.report_wns(); wns) std::cout \u003c\u003c \"WNS: \" \u003c\u003c *wns \u003c\u003c '\\n';  // (O(N) action)","  ","  timer.dump_timer(std::cout);                    // dump the timer details (O(1) accessor)","  ","  return 0;","}","```","","To see the full API list, visit [OpenTimer Wiki][OpenTimer Wiki].","","# Examples","","The folder [example](./example) contains several examples and is a great place to learn how to use OpenTimer.","","| Example |  Description | Library |","| ------- |  ----------- | ---- |","| [simple](./example/simple) | A timing report example on a sequential circuit design. | [OSU Free PDK 45nm][OSUPDK] |","| [incremental](./example/incremental) | An incremental timing example to create a sequential design from the ground up using OpenTimer's C++ API | [OSU Free PDK 45nm][OSUPDK] |","| [unit](./example/unit) | A dimensional analysis example with different time unit conversions. | [OSU Free PDK 45nm][OSUPDK] |","| [sizer](./example/sizer) | A gate-sizing example on a design with six NAND2 cells. | [NanGate 45nm Open Cell Library][NanGate] |","| [optimizer](./example/optimizer) | A timing-driven optimization example plus incremental timing update. | [TAU15 contest library][TAU15] |","","The folder [benchmark](./benchmark) contains more designs and they are mainly used for internal regression ","and integration tests.","","","# Who is Using OpenTimer?","","OpenTimer is an award-winning tools. It won ACM TAU Timing Analysis Contests multiple times","([1st Place][TAU14] in 2014, [2nd Place][TAU15] in 2015, and [1st Place][TAU16] in 2016),","the [Special Price][LibreCores] in the 2016 LibreCores Design Contest,","and the Best Tool Winner in the 2018 [WOSET][WOSET18] at ICCAD.","Many industry and academic people are using OpenTimer in their projects:","","- [Golden Timer][TAU19], 2019 ACM TAU Timing Analysis Contest on Timing-driven Optimization","- [Golden Timer][TAU18], 2018 ACM TAU Timing Analysis Contest on Timing Reports from an STA Graph","- [Golden Timer][TAU17], 2017 ACM TAU Timing Analysis Contest on Micro Modeling","- [Golden Timer][TAU16], 2016 ACM TAU Timing Analysis Contest on Micro Modeling","- [Golden Timer][ICCAD15], 2015 ACM/IEEE ICCAD Incremental Timing-driven Placement Contest","- [VSD][VSD]: VLSI System Design Corporation","- [OpenDesign Flow Database][OpenDesign]: the infrastructure for VLSI design and design automation research","- [CloudV][CloudV]: a cloud-based platform to design and test chips for free","- [LGraph][LGraph]: live graph infrastructure for synthesis and simulation","- [Qflow][Qflow]: a digital synthesis flow using open-source EDA tools","- [Ophidian][Ophidian]: an open-source library for physical design research and teaching","","| [\u003cimg src=\"image/tau16.png\" width=\"100px\"\u003e][TAU16] | [\u003cimg src=\"image/tau17.png\" width=\"100px\"\u003e][TAU17]| [\u003cimg src=\"image/tau18.png\" width=\"100px\"\u003e][TAU18] | [\u003cimg src=\"image/tau19.png\" width=\"100px\"\u003e][TAU19]  | [\u003cimg src=\"image/CAD-contest.png\" width=\"100px\"\u003e][ICCAD15] | [\u003cimg src=\"image/vsd.jpg\" width=\"100px\"\u003e][VSD] | [\u003cimg src=\"image/ophidian.png\" width=\"100px\"\u003e][Ophidian] | [\u003cimg src=\"image/cloudv.png\" width=\"100px\"\u003e][CloudV] | [\u003cimg src=\"image/lgraph.png\" width=\"100px\"\u003e][LGraph] | [\u003cimg src=\"image/qflow.png\" width=\"100px\"\u003e][Qflow] |","| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |","","","Please don't hesitate to [let me know][email me] if I forgot your project! ","","","# Get Involved","","+ Report bugs/issues by submitting a [Github issue][Github issues].","+ Submit contributions using [pull requests][Github pull requests].","+ See documentation and manual in [OpenTimer Wiki][OpenTimer Wiki].","+ Stay tuned with our [project progress][Github projects].","+ Read and cite our [ICCAD][OpenTimerPaper] and [TCAD][UI-TimerPaper] papers.","","# Contributors \u0026 Acknowledgment","","OpenTimer is being actively developed and contributed by the following people:","- [Tsung-Wei Huang][Tsung-Wei Huang] created the OpenTimer project is now the chief architect.","- [Martin Wong][Martin Wong] supported the OpenTimer project through NSF and DARPA funding.","- [Andreas Olofsson][Andreas Olofsson] supported the OpenTimer project through the DARPA IDEA project.","- [Chun-Xun Lin][Chun-Xun Lin] implemented the prompt interface of OpenTimer shell.","- [Kunal Ghosh][Kunal Ghosh] provided a list of practical features to include in OpenTimer.","- [Pei-Yu Lee][Pei-Yu Lee] provided useful incremental timing discussion and helped fix bugs.","- [Tin-Yin Lai][Tin-Yin Lai] discussed micro modeling algorithms and helped fix bugs.","- [Jin Hu][Jin Hu] helped define the timing API and produced the golden benchmarks for integration tests.","- [Myung-Chul Kim][Myung-Chul Kim] helped test OpenTimer through ICCAD CAD contest.","- [George Chen][George Chen] helped defined path report formats and test OpenTimer through TAU contest.","- [Jignesh Shah][Jignesh Shah] contributed to the area and power report commands.","- [Pao-I Chen][Pao-I Chen] helped design the logo of OpenTimer.","- [Leslie Hwang][Leslie Hwang] reviewed the documentation and README.","- [Song Chen][Song Chen] shared his opinion about command designs to avoid naming conflicts and litigation.","- [Che Chang](https://randy1005.github.io/) designed parallelization strategies and performance optimizations to accelerate critical path generation.","","\u003c!--","","| [\u003cimg src=\"image/twhuang.jpg\" width=\"100px\"\u003e][Tsung-Wei Huang] | [\u003cimg src=\"image/mdfwong.jpg\" width=\"100px\"\u003e][Martin Wong] | [\u003cimg src=\"image/cxlin.jpg\" width=\"100px\"\u003e][Chun-Xun Lin] | [\u003cimg src=\"image/kunal_ghosh.jpg\" width=\"100px\"\u003e][Kunal Ghosh] | [\u003cimg src=\"image/pei_yu_lee.jpg\" width=\"100px\"\u003e][Pei-Yu Lee] | [\u003cimg src=\"image/jin_hu.jpg\" width=\"100px\"\u003e][Jin Hu] | [\u003cimg src=\"image/myung_chul_kim.jpg\" width=\"100px\"\u003e][Myung-Chul Kim] |","| :---: | :---: | :---: | :---: | :---: | :---: | :---: |","| [\u003cimg src=\"image/george_chen.jpg\" width=\"100px\"\u003e][George Chen]| [\u003cimg src=\"image/poyi.jpg\" width=\"100px\"\u003e][Pao-I Chen] |","--\u003e","","Meanwhile, we appreciate the support from many organizations for our development of OpenTimer.","Please don't hesitate to [let me know][email me] if I forgot you! ","","| [\u003cimg src=\"image/uiuc.png\" width=\"100px\"\u003e][UIUC] | [\u003cimg src=\"image/csl.png\" width=\"100px\"\u003e][CSL] | [\u003cimg src=\"image/nsf.png\" width=\"100px\"\u003e][NSF] | [\u003cimg src=\"image/darpa.png\" width=\"100px\"\u003e][DARPA IDEA] | [\u003cimg src=\"image/vsd.jpg\" width=\"100px\"\u003e][VSD] |","| :---: | :---: | :---: | :---: | :---: |","","","","# License","","\u003cimg align=\"right\" src=\"http://opensource.org/trademarks/opensource/OSI-Approved-License-100x137.png\"\u003e","","OpenTimer is licensed under the [MIT License](./LICENSE):","","\u003eCopyright \u0026copy; 2018 [Dr. Tsung-Wei Huang][Tsung-Wei Huang] and [Dr. Martin Wong][Martin Wong]","\u003e","\u003eThe University of Illinois at Urbana-Champaign, IL, USA","\u003e","\u003ePermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:","\u003e","\u003eThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.","\u003e","\u003eTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","","---","","The core of OpenTimer is under MIT license. However, it is built, tested, and documented","using several third-party tools and services. Thanks a lot!","+ [units][units]: a compile-time header-only dimensional analysis and unit conversion","+ [Parser-SPEF][Parser-SPEF]: a fast C++ header-only parser for standard parasitic exchange format (SPEF)","+ [PEGTL][PEGTL]: parsing expression grammar template library","+ [Taskflow][Taskflow]: fast C++ parallel programming with task dependencies","+ [NanGate 45nm Library][NanGate]: open-source standard-cell library for testing and exploring EDA flows","+ [OSU PDK][OSUPDK]: Oklahoma State University system on chip (SoC) design flows","+ [Synopsys TAP-in][Synopsys Tap-in]: Synopsys technology access program for liberty user guide and open-source SDC parser.","","You can find a copy of these licenses under the folder [licenses](licenses).","","* * *","","[STA]:                   https://en.wikipedia.org/wiki/Static_timing_analysis","[Tsung-Wei Huang]:       https://twhuang.ece.illinois.edu/","[Chun-Xun Lin]:          https://github.com/clin99","[Martin Wong]:           https://ece.illinois.edu/directory/profile/mdfwong","[Andreas Olofsson]:      https://github.com/aolofsson","[Kunal Ghosh]:           mailto:kunalpghosh@gmail.com","[Jin Hu]:                mailto:jinhu@umich.edu","[Myung-Chul Kim]:        mailto:mckima@us.ibm.com","[Tin-Yin Lai]:           mailto:tinyinlai@gmail.com","[Pei-Yu Lee]:            mailto:palacedeforsaken@gmail.com","[George Chen]:           mailto:george@geochrist.com","[Jignesh Shah]:          mailto:jignesh.shah@intel.com","[Pao-I Chen]:            mailto:poyipenny@gmail.com","[Leslie Hwang]:          mailto:tkdlezz@gmail.com ","[Song Chen]:             mailto:song.chen@synopsys.com","[Github releases]:       https://github.com/OpenTimer/OpenTimer/releases","[Github issues]:         https://github.com/OpenTimer/OpenTimer/issues","[Github pull requests]:  https://github.com/OpenTimer/OpenTimer/pulls","[Github projects]:       https://github.com/OpenTimer/OpenTimer/projects","[Github insights]:       https://github.com/OpenTimer/OpenTimer/pulse","[GraphViz]:              https://dreampuf.github.io/GraphvizOnline/","[OpenTimer Wiki]:        ./wiki/home.md","[OpenTimer-1.0]:         https://web.engr.illinois.edu/~thuang19/software/timer/OpenTimer.html","[OpenTimerCitation]:     https://scholar.google.com/scholar?oi=bibs\u0026hl=en\u0026cites=142282068238605079","[OpenTimerPaper]:        doc/iccad15.pdf","[UI-TimerPaper]:         doc/tcad16.pdf","[email me]:              mailto:twh760812@gmail.com","[VSD]:                   https://www.vlsisystemdesign.com/","[ICCAD15]:               http://cad-contest.el.cycu.edu.tw/problem_C/default.html","[TAU14]:                 https://sites.google.com/site/taucontest2014/","[TAU15]:                 https://sites.google.com/site/taucontest2015/","[TAU16]:                 https://sites.google.com/site/taucontest2016/","[TAU17]:                 https://sites.google.com/site/taucontest2017/","[TAU18]:                 https://sites.google.com/view/taucontest2018/","[TAU19]:                 https://sites.google.com/view/tau-contest-2019/home","[WOSET18]:               https://woset-workshop.github.io/","[LibreCores]:            https://fossi-foundation.org/2016/10/13/designcontest","[OpenDesign]:            https://github.com/jinwookjungs/open_design_flow","[CloudV]:                https://cloudv.io/","[LGraph]:                https://github.com/masc-ucsc/lgraph","[Qflow]:                 http://opencircuitdesign.com/qflow/history.html","[Ophidian]:              https://gitlab.com/eclufsc/ophidian","[DARPA IDEA]:            https://www.darpa.mil/news-events/2017-09-13","[NSF]:                   https://www.nsf.gov/","[UIUC]:                  https://illinois.edu/","[CSL]:                   https://csl.illinois.edu/","[C++17]:                 https://en.wikipedia.org/wiki/C%2B%2B17","[units]:                 https://github.com/nholthaus/units","[PEGTL]:                 https://github.com/taocpp/PEGTL","[Parser-SPEF]:           https://github.com/OpenTimer/Parser-SPEF         ","[Taskflow]:              https://github.com/taskflow/taskflow","[NanGate]:               http://www.nangate.com/?page_id=22","[OSUPDK]:                https://vlsiarch.ecen.okstate.edu/flow/","[Synopsys TAP-in]:       https://www.synopsys.com/community/interoperability-programs/tap-in.html"," "],"stylingDirectives":[[[0,64,"pl-mh"],[2,64,"pl-en"],[13,16,"pl-ent"],[17,22,"pl-e"],[23,24,"pl-s"],[24,29,"pl-s"],[29,30,"pl-s"],[31,36,"pl-e"],[37,38,"pl-s"],[38,41,"pl-s"],[41,42,"pl-s"],[43,46,"pl-e"],[47,48,"pl-s"],[48,62,"pl-s"],[62,63,"pl-s"]],[],[[0,1,"pl-s"],[1,3,"pl-s"],[15,16,"pl-s"],[16,17,"pl-s"],[17,76,"pl-corl"],[76,78,"pl-s"],[78,79,"pl-s"],[79,120,"pl-corl"],[120,121,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,28,"pl-corl"],[28,30,"pl-s"],[30,31,"pl-s"],[31,84,"pl-corl"],[84,85,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,31,"pl-corl"],[31,33,"pl-s"],[33,34,"pl-s"],[34,91,"pl-corl"],[91,92,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[10,11,"pl-s"],[11,12,"pl-s"],[12,35,"pl-corl"],[35,37,"pl-s"],[37,38,"pl-s"],[38,88,"pl-corl"],[88,89,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[8,9,"pl-s"],[9,10,"pl-s"],[10,25,"pl-corl"],[25,27,"pl-s"],[27,28,"pl-s"],[28,41,"pl-en"],[41,42,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[7,8,"pl-s"],[8,9,"pl-s"],[9,27,"pl-corl"],[27,29,"pl-s"],[29,30,"pl-s"],[30,44,"pl-en"],[44,45,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[15,16,"pl-s"],[16,17,"pl-s"],[17,42,"pl-corl"],[42,44,"pl-s"],[44,45,"pl-s"],[45,54,"pl-corl"],[54,55,"pl-s"]],[],[],[],[[0,16,"pl-mh"],[2,16,"pl-en"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,17,"pl-s"],[17,18,"pl-s"],[19,24,"pl-e"],[25,26,"pl-s"],[26,29,"pl-s"],[29,30,"pl-s"],[31,34,"pl-e"],[35,36,"pl-s"],[36,59,"pl-s"],[59,60,"pl-s"]],[],[[19,20,"pl-s"],[48,49,"pl-s"],[49,50,"pl-s"],[50,53,"pl-en"],[53,54,"pl-s"]],[],[[52,53,"pl-s"],[58,59,"pl-s"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[[0,28,"pl-mh"],[2,28,"pl-en"]],[],[[51,52,"pl-s"],[67,68,"pl-s"]],[],[],[[0,1,"pl-s"],[18,19,"pl-s"],[19,20,"pl-s"],[20,38,"pl-corl"],[38,39,"pl-s"],[69,70,"pl-s"],[70,78,"pl-c1"],[78,79,"pl-s"]],[[10,11,"pl-s"],[11,14,"pl-c1"],[14,15,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,1,"pl-k"]],[],[[6,8,"pl-cce"]],[[10,12,"pl-cce"],[19,21,"pl-cce"],[29,41,"pl-s"],[29,30,"pl-pds"]],[[0,47,"pl-s"]],[[0,44,"pl-s"]],[[0,48,"pl-s"]],[[0,22,"pl-s"]],[[0,48,"pl-s"]],[[0,41,"pl-s"]],[[0,4,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,52,"pl-s"]],[[0,81,"pl-s"]],[[0,47,"pl-s"]],[[0,0,"pl-s"]],[[0,64,"pl-s"]],[[0,0,"pl-s"]],[[0,7,"pl-s"]],[[0,21,"pl-s"]],[[0,36,"pl-s"]],[[0,28,"pl-s"]],[[0,23,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,49,"pl-s"]],[[0,0,"pl-s"]],[[0,7,"pl-s"]],[[0,54,"pl-s"]],[[0,20,"pl-s"]],[[0,20,"pl-s"]],[[0,19,"pl-s"]],[[0,54,"pl-s"]],[[0,54,"pl-s"]],[[0,54,"pl-s"]],[[0,47,"pl-s"]],[[0,57,"pl-s"]],[[0,57,"pl-s"]],[[0,56,"pl-s"]],[[0,56,"pl-s"]],[[0,58,"pl-s"]],[[0,60,"pl-s"]],[[0,0,"pl-s"]],[[0,60,"pl-s"]],[[0,63,"pl-s"]],[[0,61,"pl-s"]],[[0,54,"pl-s"]],[[0,51,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,63,"pl-s"]],[[0,58,"pl-s"]],[[0,0,"pl-s"]],[[0,19,"pl-s"]],[[0,0,"pl-s"]],[[0,22,"pl-s"]],[[0,0,"pl-s"]],[[0,63,"pl-s"]],[[0,58,"pl-s"]],[[0,21,"pl-s"]],[[0,0,"pl-s"]],[[0,39,"pl-s"]],[[0,41,"pl-s"]],[[0,0,"pl-s"]],[[0,46,"pl-s"]],[[0,0,"pl-s"]],[[0,50,"pl-s"]],[[0,57,"pl-s"]],[[0,0,"pl-s"]],[[0,73,"pl-s"]],[[0,0,"pl-s"]],[[0,22,"pl-s"]],[[0,0,"pl-s"]],[[0,66,"pl-s"]],[[0,39,"pl-s"]],[[0,0,"pl-s"]],[[0,7,"pl-s"]],[[0,55,"pl-s"]],[[0,15,"pl-s"]],[[0,14,"pl-s"]],[[0,11,"pl-s"]],[[0,36,"pl-s"]],[[0,8,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,81,"pl-s"]],[[0,24,"pl-s"]],[[0,0,"pl-s"]],[[0,12,"pl-s"]],[[0,78,"pl-s"]],[[0,97,"pl-s"]],[[0,67,"pl-s"]],[[0,0,"pl-s"]],[[0,7,"pl-s"]],[[0,12,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,19,"pl-s"]],[[0,0,"pl-s"]],[[0,47,"pl-s"]],[[0,47,"pl-s"]],[[0,52,"pl-s"]],[[0,65,"pl-s"]],[[0,36,"pl-s"]],[[0,0,"pl-s"]],[[0,51,"pl-s"]],[[0,39,"pl-s"]],[[0,108,"pl-s"]],[[0,131,"pl-s"]],[[0,140,"pl-s"]],[[0,0,"pl-s"]],[[0,29,"pl-s"]],[[0,0,"pl-s"]],[[0,60,"pl-s"]],[[0,40,"pl-s"]],[[0,75,"pl-s"]],[[0,40,"pl-s"]],[[0,52,"pl-s"]],[[0,31,"pl-s"]],[[0,0,"pl-s"]],[[0,0,"pl-s"]],[[0,22,"pl-s"]],[[0,0,"pl-s"]],[[0,33,"pl-s"]],[[0,50,"pl-s"]],[[0,39,"pl-s"]],[[0,60,"pl-s"]],[[0,63,"pl-s"]],[[0,0,"pl-s"]],[[0,24,"pl-s"]],[[0,0,"pl-s"]],[[0,74,"pl-s"]],[[0,22,"pl-s"]],[[0,44,"pl-s"]],[[0,58,"pl-s"]],[[0,19,"pl-s"]],[[0,81,"pl-s"]],[[0,39,"pl-s"]],[[0,50,"pl-s"]],[[0,0,"pl-s"]],[[0,35,"pl-s"]],[[0,0,"pl-s"]],[[0,81,"pl-s"]],[[0,28,"pl-s"]],[[0,41,"pl-s"]],[[0,61,"pl-s"]],[[0,27,"pl-s"]],[[0,0,"pl-s"]],[[0,30,"pl-s"]],[[0,0,"pl-s"]],[[0,87,"pl-s"]],[[0,76,"pl-s"]],[[0,56,"pl-s"]],[[0,100,"pl-s"]],[[0,18,"pl-s"]],[[0,0,"pl-s"]],[[0,64,"pl-s"]],[[0,0,"pl-s"]],[[0,7,"pl-s"]],[[0,16,"pl-s"]],[[0,21,"pl-s"]],[[0,9,"pl-s"]],[[0,23,"pl-s"]],[[0,21,"pl-s"]],[[0,19,"pl-s"]],[[0,19,"pl-s"]],[[0,1,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,17,"pl-s"]],[[0,0,"pl-s"]],[[0,80,"pl-s"]],[[0,74,"pl-s"]],[[0,67,"pl-s"]],[[0,40,"pl-s"]],[[0,0,"pl-s"]],[[0,11,"pl-s"]],[[0,0,"pl-s"]],[[0,55,"pl-s"]],[[0,0,"pl-s"]],[[0,54,"pl-s"]],[[0,54,"pl-s"]],[[0,123,"pl-s"]],[[0,87,"pl-s"]],[[0,86,"pl-s"]],[[0,92,"pl-s"]],[[0,69,"pl-s"]],[[0,101,"pl-s"]],[[0,77,"pl-s"]],[[0,77,"pl-s"]],[[0,90,"pl-s"]],[[0,79,"pl-s"]],[[0,0,"pl-s"]],[[0,69,"pl-s"]],[[0,0,"pl-s"]],[[0,37,"pl-s"]],[[0,0,"pl-s"]],[[0,71,"pl-s"]],[[0,0,"pl-s"]],[[0,37,"pl-s"]],[[0,0,"pl-s"]],[[0,82,"pl-s"]],[[0,98,"pl-s"]],[[0,76,"pl-s"]],[[0,49,"pl-s"]],[[0,0,"pl-s"]],[[0,8,"pl-s"]],[[0,77,"pl-s"]],[[0,82,"pl-s"]],[[0,77,"pl-s"]],[[0,77,"pl-s"]],[[0,0,"pl-s"]],[[0,80,"pl-s"]],[[0,0,"pl-s"]],[[0,76,"pl-s"]],[[0,62,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,31,"pl-s"]],[[0,0,"pl-s"]],[[0,75,"pl-s"]],[[0,39,"pl-s"]],[[0,81,"pl-s"]],[[0,78,"pl-s"]],[[0,152,"pl-s"]],[[0,51,"pl-s"]],[[0,0,"pl-s"]],[[0,7,"pl-s"]],[[0,12,"pl-s"]],[[0,40,"pl-s"]],[[0,8,"pl-s"]],[[0,15,"pl-s"]],[[0,49,"pl-s"]],[[0,5,"pl-s"]],[[0,66,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,70,"pl-s"]],[[0,44,"pl-s"]],[[0,103,"pl-s"]],[[0,0,"pl-s"]],[[0,7,"pl-s"]],[[0,94,"pl-s"]],[[0,12,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,19,"pl-s"]],[[0,0,"pl-s"]],[[0,68,"pl-s"]],[[0,32,"pl-s"]],[[0,59,"pl-s"]],[[0,0,"pl-s"]],[[0,51,"pl-s"]],[[0,51,"pl-s"]],[[0,96,"pl-s"]],[[0,64,"pl-s"]],[[0,65,"pl-s"]],[[0,80,"pl-s"]],[[0,106,"pl-s"]],[[0,109,"pl-s"]],[[0,109,"pl-s"]],[[0,100,"pl-s"]],[[0,91,"pl-s"]],[[0,0,"pl-s"]],[[0,0,"pl-s"]],[[0,70,"pl-s"]],[[0,98,"pl-s"]],[[0,0,"pl-s"]],[[0,6,"pl-s"]],[[0,80,"pl-s"]],[[0,0,"pl-s"]],[[0,34,"pl-s"]],[[0,2,"pl-s"]],[[0,90,"pl-s"]],[[0,2,"pl-s"]],[[0,84,"pl-s"]],[[0,92,"pl-s"]],[[0,87,"pl-s"]],[[0,95,"pl-s"]],[[0,81,"pl-s"]],[[0,0,"pl-s"]],[[0,74,"pl-s"],[73,74,"pl-pds"],[74,76,"pl-cce"],[76,96,"pl-s"],[76,77,"pl-pds"]],[[0,74,"pl-s"],[73,74,"pl-pds"],[74,76,"pl-cce"],[76,96,"pl-s"],[76,77,"pl-pds"]],[[0,2,"pl-s"]],[[0,91,"pl-s"]],[[0,2,"pl-s"]],[[0,11,"pl-s"]],[[0,1,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,65,"pl-s"]],[[0,0,"pl-s"]],[[0,10,"pl-s"]],[[0,0,"pl-s"]],[[0,109,"pl-s"]],[[0,0,"pl-s"]],[[0,36,"pl-s"]],[[0,33,"pl-s"]],[[0,118,"pl-s"]],[[0,136,"pl-s"],[135,136,"pl-pds"],[146,147,"pl-k"],[176,177,"pl-k"]],[[0,1,"pl-k"],[25,26,"pl-k"],[73,77,"pl-k"],[96,97,"pl-k"],[126,127,"pl-k"]],[[0,1,"pl-k"],[27,28,"pl-k"],[85,86,"pl-k"],[129,130,"pl-k"]],[[0,1,"pl-k"],[35,36,"pl-k"],[106,107,"pl-k"],[139,140,"pl-k"]],[],[[83,86,"pl-k"]],[],[],[],[[0,25,"pl-c"],[0,1,"pl-c"]],[],[[86,91,"pl-c1"]],[[20,22,"pl-k"],[48,50,"pl-k"],[80,82,"pl-k"]],[[32,34,"pl-k"]],[[25,27,"pl-k"]],[[54,56,"pl-k"]],[],[],[],[],[],[],[],[[61,64,"pl-k"]],[[57,61,"pl-c1"],[68,71,"pl-k"]],[[46,49,"pl-k"]],[],[[47,50,"pl-k"]],[],[[0,1,"pl-k"],[3,4,"pl-k"],[11,12,"pl-k"],[12,29,"pl-s"],[12,13,"pl-pds"],[28,29,"pl-pds"],[35,36,"pl-k"],[36,43,"pl-s"],[36,37,"pl-pds"],[42,43,"pl-pds"],[43,44,"pl-k"],[53,54,"pl-k"],[56,57,"pl-k"],[64,65,"pl-k"],[65,82,"pl-s"],[65,66,"pl-pds"],[81,82,"pl-pds"],[88,89,"pl-k"],[89,96,"pl-s"],[89,90,"pl-pds"],[95,96,"pl-pds"],[96,97,"pl-k"],[105,106,"pl-k"],[108,109,"pl-k"],[116,117,"pl-k"],[117,134,"pl-s"],[117,118,"pl-pds"],[133,134,"pl-pds"],[140,141,"pl-k"],[141,148,"pl-s"],[141,142,"pl-pds"],[147,148,"pl-pds"],[148,149,"pl-k"],[158,159,"pl-k"],[161,162,"pl-k"],[169,170,"pl-k"],[170,187,"pl-s"],[170,171,"pl-pds"],[186,187,"pl-pds"],[193,194,"pl-k"],[194,201,"pl-s"],[194,195,"pl-pds"],[200,201,"pl-pds"],[201,202,"pl-k"],[212,213,"pl-k"],[215,216,"pl-k"],[223,224,"pl-k"],[224,247,"pl-s"],[224,225,"pl-pds"],[246,247,"pl-pds"],[253,254,"pl-k"],[254,261,"pl-s"],[254,255,"pl-pds"],[260,261,"pl-pds"],[261,262,"pl-k"],[273,274,"pl-k"],[276,277,"pl-k"],[284,285,"pl-k"],[285,300,"pl-s"],[285,286,"pl-pds"],[299,300,"pl-pds"],[306,307,"pl-k"],[307,314,"pl-s"],[307,308,"pl-pds"],[313,314,"pl-pds"],[314,315,"pl-k"],[322,323,"pl-k"],[325,326,"pl-k"],[333,334,"pl-k"],[334,354,"pl-s"],[334,335,"pl-pds"],[353,354,"pl-pds"],[360,361,"pl-k"],[361,368,"pl-s"],[361,362,"pl-pds"],[367,368,"pl-pds"],[368,369,"pl-k"],[381,382,"pl-k"],[384,385,"pl-k"],[392,393,"pl-k"],[393,411,"pl-s"],[393,394,"pl-pds"],[410,411,"pl-pds"],[417,418,"pl-k"],[418,425,"pl-s"],[418,419,"pl-pds"],[424,425,"pl-pds"],[425,426,"pl-k"],[436,437,"pl-k"],[439,440,"pl-k"],[447,448,"pl-k"],[448,466,"pl-s"],[448,449,"pl-pds"],[465,466,"pl-pds"],[472,473,"pl-k"],[473,480,"pl-s"],[473,474,"pl-pds"],[479,480,"pl-pds"],[480,481,"pl-k"],[491,492,"pl-k"],[494,495,"pl-k"],[502,503,"pl-k"],[503,520,"pl-s"],[503,504,"pl-pds"],[519,520,"pl-pds"],[526,527,"pl-k"],[527,534,"pl-s"],[527,528,"pl-pds"],[533,534,"pl-pds"],[534,535,"pl-k"],[544,545,"pl-k"]],[[0,1,"pl-k"],[8,9,"pl-k"],[16,17,"pl-k"],[24,25,"pl-k"],[32,33,"pl-k"],[40,41,"pl-k"],[48,49,"pl-k"],[56,57,"pl-k"],[64,65,"pl-k"],[72,73,"pl-k"],[80,81,"pl-k"]],[],[],[[10,75,"pl-s"],[10,11,"pl-pds"]],[[0,0,"pl-s"]],[[0,0,"pl-s"]],[[0,14,"pl-s"]],[[0,0,"pl-s"]],[[0,67,"pl-s"]],[[0,67,"pl-s"]],[[0,67,"pl-s"]],[[0,58,"pl-s"]],[[0,77,"pl-s"]],[[0,0,"pl-s"]],[[0,31,"pl-s"]],[[0,0,"pl-s"]],[[0,78,"pl-s"]],[[0,94,"pl-s"]],[[0,91,"pl-s"]],[[0,102,"pl-s"]],[[0,83,"pl-s"]],[[0,91,"pl-s"]],[[0,93,"pl-s"]],[[0,85,"pl-s"]],[[0,105,"pl-s"]],[[0,83,"pl-s"]],[[0,103,"pl-s"]],[[0,81,"pl-s"]],[[0,63,"pl-s"]],[[0,69,"pl-s"]],[[0,107,"pl-s"]],[[0,149,"pl-s"]],[[0,0,"pl-s"]],[[0,4,"pl-s"]],[[0,0,"pl-s"]],[[0,441,"pl-s"]],[[0,57,"pl-s"]],[[0,122,"pl-s"]],[[0,3,"pl-s"]],[[0,0,"pl-s"]],[[0,94,"pl-s"]],[[0,11,"pl-s"],[10,11,"pl-pds"],[49,51,"pl-k"],[64,65,"pl-k"]],[],[[0,1,"pl-k"],[3,4,"pl-k"],[11,12,"pl-k"],[12,28,"pl-s"],[12,13,"pl-pds"],[27,28,"pl-pds"],[34,35,"pl-k"],[35,42,"pl-s"],[35,36,"pl-pds"],[41,42,"pl-pds"],[42,43,"pl-k"],[51,52,"pl-k"],[54,55,"pl-k"],[62,63,"pl-k"],[63,78,"pl-s"],[63,64,"pl-pds"],[77,78,"pl-pds"],[84,85,"pl-k"],[85,92,"pl-s"],[85,86,"pl-pds"],[91,92,"pl-pds"],[92,93,"pl-k"],[100,101,"pl-k"],[103,104,"pl-k"],[111,112,"pl-k"],[112,127,"pl-s"],[112,113,"pl-pds"],[126,127,"pl-pds"],[133,134,"pl-k"],[134,141,"pl-s"],[134,135,"pl-pds"],[140,141,"pl-pds"],[141,142,"pl-k"],[149,150,"pl-k"],[152,153,"pl-k"],[160,161,"pl-k"],[161,178,"pl-s"],[161,162,"pl-pds"],[177,178,"pl-pds"],[184,185,"pl-k"],[185,192,"pl-s"],[185,186,"pl-pds"],[191,192,"pl-pds"],[192,193,"pl-k"],[207,208,"pl-k"],[210,211,"pl-k"],[218,219,"pl-k"],[219,234,"pl-s"],[219,220,"pl-pds"],[233,234,"pl-pds"],[240,241,"pl-k"],[241,248,"pl-s"],[241,242,"pl-pds"],[247,248,"pl-pds"],[248,249,"pl-k"],[256,257,"pl-k"]],[[0,1,"pl-k"],[8,9,"pl-k"],[16,17,"pl-k"],[24,25,"pl-k"],[32,33,"pl-k"],[40,41,"pl-k"]],[],[],[],[[0,9,"pl-c"],[0,1,"pl-c"]],[],[[0,1,"pl-k"],[11,18,"pl-s"],[11,12,"pl-pds"],[17,18,"pl-pds"],[23,101,"pl-s"],[23,24,"pl-pds"],[100,101,"pl-pds"],[101,102,"pl-k"]],[],[],[],[[0,1,"pl-k"],[11,12,"pl-k"],[16,17,"pl-k"]],[[0,1,"pl-k"]],[[0,1,"pl-k"]],[[0,1,"pl-k"]],[[0,1,"pl-k"],[156,158,"pl-k"],[390,392,"pl-k"]],[[0,1,"pl-k"]],[[0,1,"pl-k"],[73,75,"pl-k"]],[[0,1,"pl-k"]],[[0,1,"pl-k"]],[],[],[],[],[[58,59,"pl-k"]],[],[[60,63,"pl-k"]],[],[],[[69,72,"pl-k"]],[],[[73,76,"pl-k"]],[],[],[],[[0,1,"pl-k"],[2,3,"pl-k"],[4,5,"pl-k"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[59,60,"pl-k"],[67,68,"pl-k"],[73,74,"pl-k"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[48,49,"pl-k"]],[],[],[]],"colorizedLines":null}},"title":"OpenTimer/README.md at master · OpenTimer/OpenTimer","appPayload":{},"meta":{"title":"OpenTimer/README.md at master · OpenTimer/OpenTimer"}}</script>
  <div data-target="react-app.reactRoot"><meta name="github-code-view-meta-stats" id="github-code-view-meta-stats" data-hydrostats="publish"/> <!-- --> <a hidden="" id="code-view-repo-link" href="/OpenTimer/OpenTimer" data-discover="true"></a> <div class="d-none"></div><div><div style="--spacing:var(--spacing-none)" class="prc-PageLayout-PageLayoutRoot--KH-d" data-component="SplitPageLayout" data-has-sidebar="true"><div class="prc-PageLayout-SidebarWrapper-kLG4B CopilotSidePanelSidebar-module__SidePanel__L3O0C CopilotSidePanelSidebar-module__HiddenSidePanel__TBRGn" style="--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="end" data-sticky="true" data-responsive-variant="fullscreen"><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-SidebarVerticalDivider-0Rl0V" data-component="PageLayout.VerticalDivider" data-variant="line" data-position="end" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="450" aria-valuemax="768" aria-valuenow="544" aria-valuetext="Pane width 544 pixels" tabindex="0"></div></div><div class="prc-PageLayout-Sidebar-iciWg" data-component="SplitPageLayout.Sidebar" data-resizable="true" style="--spacing:var(--spacing-normal);--pane-min-width:450px;--pane-max-width:768px;--pane-width-custom:544px;--pane-width-size:var(--pane-width-custom);--pane-width:544px"><div class="height-full" data-testid="copilot-code-view-side-panel"><div id="copilot-side-panel-content" class="height-full"></div></div></div></div><div class="prc-PageLayout-PageLayoutWrapper-2BhU2" data-width="full"><div class="prc-PageLayout-PageLayoutContent-BneH9"><div id="repos-file-tree-sidebar" class="CodeViewFileTreeLayout-module__sidebar__n_Aau" tabindex="0"><div class="prc-PageLayout-PaneWrapper-pHPop ReposFileTreePane-module__Pane__rBZpI ReposFileTreePane-module__HideTree__AYZnm ReposFileTreePane-module__HidePane__VHAVt" style="--offset-header:0px;--spacing-row:var(--spacing-none);--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="start" data-sticky="true"><div class="prc-PageLayout-HorizontalDivider-JLVqp prc-PageLayout-PaneHorizontalDivider-9tbnE" data-component="PageLayout.HorizontalDivider" data-variant-regular="none" data-variant-narrow="none" data-position="start" style="--spacing-divider:var(--spacing-none);--spacing:var(--spacing-none)"></div><div class="prc-PageLayout-Pane-AyzHK" data-component="SplitPageLayout.Pane" data-resizable="true" style="--spacing:var(--spacing-none);--pane-min-width:256px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));--pane-width-size:var(--pane-width-large);--pane-width:320px"></div><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-PaneVerticalDivider-le57g" data-component="PageLayout.VerticalDivider" data-variant-narrow="none" data-variant-regular="line" data-variant-wide="line" data-position="start" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="256" aria-valuemax="600" aria-valuenow="320" aria-valuetext="Pane width 320 pixels" tabindex="0"></div></div></div></div><div data-component="SplitPageLayout.Content" class="prc-PageLayout-ContentWrapper-gR9eG"><div class="prc-PageLayout-Content-xWL-A" data-width="full" style="--spacing:var(--spacing-none)"><div class="SharedPageLayout-module__content__IwGAp" data-selector="repos-split-pane-content" id="repos-split-pane-content" tabindex="0"> <!-- --> <div class="container CodeViewHeader-module__Box__JkPOb"><div class="CodeViewHeader-module__StickyHeader__Qn7UN" id="StickyHeader"><div class="CodeViewHeader-module__Box_1__SbNDV"><div class="CodeViewHeader-module__Box_2__TB46f"><div class="react-code-view-header-wrap--narrow CodeViewHeader-module__Box_3__q1zUL"><div class="CodeViewHeader-module__treeToggleWrapper__RQ__9"><h2 class="use-tree-pane-module__Heading__s4QbZ prc-Heading-Heading-MtWFE" data-component="Heading"><button data-component="Button" type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="prc-Button-ButtonBase-9n-Xk ExpandFileTreeButton-module__Button_1__Svs95" data-loading="false" data-size="medium" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Files</span></span></button><button data-component="IconButton" type="button" data-testid="expand-file-tree-button" aria-controls="repos-file-tree" class="prc-Button-ButtonBase-9n-Xk position-relative ExpandFileTreeButton-module__expandButton__hDOcv ExpandFileTreeButton-module__filesButtonBreakpoint__zEvz3 fgColor-muted prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_4lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sidebar-collapse" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"></path><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="se" data-component="Tooltip" aria-hidden="true" id="_R_4lla9lik5_">Expand file tree</span><div class="d-none"></div></h2></div><div class="react-code-view-header-mb--narrow mr-2"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector-wide"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="react-code-view-header-mb--narrow CodeViewHeader-module__Box_5__MQ0hL"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__lg__Rjz0A"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb-heading" id="repos-header-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="repos-header-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/OpenTimer/OpenTimer/tree/master" data-discover="true">OpenTimer</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__lg__Rjz0A prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="file-name-id">README.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lla9lik5_">Copy path</span></div></div></div><div class="react-code-view-header-element--wide"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><div><div class="CodeViewHeader-module__FileResultsList__JDzUy"><span class="d-flex FileResultsList-module__FilesSearchBox__ivVkc TextInput-wrapper prc-components-TextInputWrapper-Hpdqi prc-components-TextInputBaseWrapper-wY-n0" data-no-trailing-action="true" data-component="TextInput" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id="_R_1cpla9lik5_" aria-hidden="true" data-component="TextInput.LeadingVisual"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellCheck="false" placeholder="Go to file" aria-describedby="_R_1cpla9lik5_ _R_1cpla9lik5H1_" data-component="input" class="prc-components-Input-IwWrt" value=""/><span class="TextInput-icon" id="_R_1cpla9lik5H1_" aria-hidden="true" data-component="TextInput.TrailingVisual"></span></span></div><div class="d-none"></div></div><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_7p9la9lik5_" id="_R_99la9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_7p9la9lik5_">More file actions</span></div></div></div><div class="react-code-view-header-element--narrow"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_7pdla9lik5_" id="_R_9dla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_7pdla9lik5_">More file actions</span></div></div></div></div></div></div></div><div class="CodeView-module__contentWrapper__cG2JH"><div class="react-code-view-bottom-padding"><div class="BlobTopBanners-module__Box__v_nvx"></div></div> <div class="d-none"></div><div class="d-flex flex-column border rounded-2 tmp-mb-3 pl-1"><div class="LatestCommit-module__Box__B25ZT"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">History</h2><a data-component="LinkButton" href="/OpenTimer/OpenTimer/commits/master/README.md" class="prc-Button-ButtonBase-9n-Xk d-none d-lg-flex LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><a data-component="LinkButton" aria-label="View commit history for this file." href="/OpenTimer/OpenTimer/commits/master/README.md" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby="_R_4mlala9lik5_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" role="tooltip" aria-hidden="true" id="_R_4mlala9lik5_">History</span></div></div></div></div></div><div class="d-flex flex-row"><div class="container BlobViewContent-module__blobContainer__DtH2d"><div class="react-code-size-details-banner BlobViewContent-module__codeSizeDetails__e5sUw"><div class="react-code-size-details-banner CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="24.3 KB" style="--truncate-max-width:100%"><span>502 lines (393 loc) · 24.3 KB</span></div></div></div></div><div class="react-blob-view-header-sticky BlobViewContent-module__stickyHeader__VwxB5" id="repos-sticky-header"><div class="BlobViewHeader-module__Box__yhm9u"><div class="react-blob-sticky-header"><div class="FileNameStickyHeader-module__outerWrapper__ZL4Xc FileNameStickyHeader-module__outerWrapperHidden__Zpynk"><div class="FileNameStickyHeader-module__Box_1__Hazu5"><div class="FileNameStickyHeader-module__Box_2__hoolP"><div class="FileNameStickyHeader-module__Box_3__MVKsk"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="FileNameStickyHeader-module__Box_4__FLhtt"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__md__Wb1Gs"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/OpenTimer/OpenTimer/tree/master" data-discover="true">OpenTimer</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__md__Wb1Gs prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="sticky-file-name-id">README.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lcpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lcpala9lik5_">Copy path</span></div></div></div><button data-component="Button" type="button" class="prc-Button-ButtonBase-9n-Xk FileNameStickyHeader-module__Button__LSEU_ FileNameStickyHeader-module__GoToTopButton__nxAFn" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Top</span></span></button></div></div></div><div class="BlobViewHeader-module__Box_1__VEmuQ"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">File metadata and controls</h2><div class="BlobViewHeader-module__Box_2__icUs2"><ul aria-label="File view" class="prc-SegmentedControl-SegmentedControl-lqIXp BlobTabButtons-module__SegmentedControl__jen2u" data-variant="default" data-size="small" data-component="SegmentedControl"><li class="prc-SegmentedControl-Item-tSCQh" data-selected="" data-component="SegmentedControl.Button"><button aria-pressed="true" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:transparent"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Preview">Preview</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Code">Code</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Blame">Blame</div></span></button></li></ul><div class="d-none"></div><div class="react-code-size-details-in-header CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="24.3 KB" style="--truncate-max-width:100%"><span>502 lines (393 loc) · 24.3 KB</span></div></div></div></div><div class="BlobViewHeader-module__Box_3__ng6v2"><div class="d-none"></div><div class="react-blob-header-edit-and-raw-actions BlobViewHeader-module__Box_4__J4Y4W"><div class="d-none"></div><div class="prc-ButtonGroup-ButtonGroup-vFUrY" data-component="ButtonGroup"><div class="prc-ButtonGroup-Item-PqvDl"><a data-component="LinkButton" href="https://github.com/OpenTimer/OpenTimer/raw/refs/heads/master/README.md" data-testid="raw-button" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov BlobViewHeader-module__LinkButton__X9kx2" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Raw</span></span></a></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="copy-raw-button" class="prc-Button-ButtonBase-9n-Xk prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_qaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_qaucpala9lik5_">Copy raw file</span></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="download-raw-button" class="prc-Button-ButtonBase-9n-Xk BlobViewHeader-module__downloadButton__ef459 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_eaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_eaucpala9lik5_">Download raw file</span></div></div></div><button data-component="IconButton" type="button" aria-pressed="false" class="prc-Button-ButtonBase-9n-Xk tmp-mr-2 TableOfContents-module__IconButton__jrlNM prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_3ucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_3ucpala9lik5_">Outline</span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click BlobViewHeader-module__IconButton__XrMQY prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fkecpala9lik5_" id="_R_kecpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_fkecpala9lik5_">Edit and raw actions</span></div></div></div></div><div></div></div><div class="BlobViewContent-module__blobContentWrapper__JS0W6"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="BlobContent-module__blobContentSection__VOgZq BlobContent-module__blobContentSectionMarkdown__mPLOK" style="margin-top:46px"><div class="js-snippet-clipboard-copy-unpositioned BlobContent-module__markdownBlob__T8jpG" data-hpc="true" containertiming="hpc"><article class="markdown-body entry-content container-lg" itemprop="text"><div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">OpenTimer <a target="_blank" rel="noopener noreferrer" href="/OpenTimer/OpenTimer/blob/master/image/logo.png"><img align="right" width="10%" src="/OpenTimer/OpenTimer/raw/master/image/logo.png" style="max-width: 100%;"></a></h1><a id="user-content-opentimer-" class="anchor" aria-label="Permalink: OpenTimer " href="#opentimer-"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><a href="https://travis-ci.org/OpenTimer/OpenTimer" rel="nofollow"><img src="https://camo.githubusercontent.com/16326b16aafd2855c4fe1838ee103929f31deab042aa7e1a77f09e0f87313d3a/68747470733a2f2f7472617669732d63692e6f72672f4f70656e54696d65722f4f70656e54696d65722e7376673f6272616e63683d6d6173746572" alt="Build Status" data-canonical-src="https://travis-ci.org/OpenTimer/OpenTimer.svg?branch=master" style="max-width: 100%;"></a>
<a href="https://en.wikipedia.org/wiki/C%2B%2B#Standardization" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/cpp17.svg" alt="Standard" style="max-width: 100%;"></a>
<a href="https://github.com/OpenTimer/OpenTimer/archive/master.zip"><img src="/OpenTimer/OpenTimer/raw/master/image/download.svg" alt="Download" style="max-width: 100%;"></a>
<a href="https://github.com/OpenTimer/OpenTimer/tree/master"><img src="/OpenTimer/OpenTimer/raw/master/image/version_badge.svg" alt="Version" style="max-width: 100%;"></a>
<a href="https://github.com/OpenTimer/OpenTimer/issues"><img src="/OpenTimer/OpenTimer/raw/master/image/askme.svg" alt="AskMe" style="max-width: 100%;"></a>
<a href="/OpenTimer/OpenTimer/blob/master/wiki/home.md"><img src="/OpenTimer/OpenTimer/raw/master/image/doc-wiki.svg" alt="Wiki" style="max-width: 100%;"></a>
<a href="/OpenTimer/OpenTimer/blob/master/LICENSE"><img src="/OpenTimer/OpenTimer/raw/master/image/license_badge.svg" alt="License: MIT" style="max-width: 100%;"></a></p>
<p dir="auto">A High-Performance Timing Analysis Tool for VLSI Systems</p>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Why OpenTimer?</h1><a id="user-content-why-opentimer" class="anchor" aria-label="Permalink: Why OpenTimer?" href="#why-opentimer"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/OpenTimer/OpenTimer/blob/master/image/critical_path.jpg"><img align="right" width="30%" src="/OpenTimer/OpenTimer/raw/master/image/critical_path.jpg" style="max-width: 100%;"></a></p>
<p dir="auto">OpenTimer is a new <a href="https://en.wikipedia.org/wiki/Static_timing_analysis" rel="nofollow">static timing analysis (STA)</a> tool to help IC designers
quickly verify the circuit timing.
It is developed completely from the ground up using <em>C++17</em>
to efficiently support parallel and incremental timing.
Key features are:</p>
<ul dir="auto">
<li>Industry standard format (.lib, .v, .spef, .sdc) support</li>
<li>Graph- and path-based timing analysis</li>
<li>Parallel incremental timing for fast timing closure</li>
<li>Award-winning tools and golden timers in CAD Contests</li>
</ul>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Get Started with OpenTimer</h1><a id="user-content-get-started-with-opentimer" class="anchor" aria-label="Permalink: Get Started with OpenTimer" href="#get-started-with-opentimer"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The easiest way to start using OpenTimer is to use <em>OpenTimer shell</em>.
OpenTimer shell is a powerful tool for interactive analysis
and the simplest way to learn core functionalities.
<a href="#compile-opentimer">Compile OpenTimer</a> and launch the shell program <code>ot-shell</code>
under the <code>bin</code> directory.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="~$ ./bin/ot-shell
  ____              _______              
 / __ \___  ___ ___/_  __(_)_ _  ___ ____
/ /_/ / _ \/ -_) _ \/ / / /  ' \/ -_) __/
\____/ .__/\__/_//_/_/ /_/_/_/_/\__/_/       v2
    /_/                                     
MIT License: type &quot;license&quot; to see more details.
For help, type &quot;help&quot;.
For bug reports, issues, and manual, please see:
&lt;https://github.com/OpenTimer/OpenTimer&gt;.
ot&gt; "><pre><span class="pl-k">~</span>$ ./bin/ot-shell
  ____              _______              
 / __ <span class="pl-cce">\_</span>__  ___ ___/_  __(_)_ _  ___ ____
/ /_/ / _ <span class="pl-cce">\/</span> -_) _ <span class="pl-cce">\/</span> / / /  <span class="pl-s"><span class="pl-pds">'</span> \/ -_) __/</span>
<span class="pl-s">\____/ .__/\__/_//_/_/ /_/_/_/_/\__/_/       v2</span>
<span class="pl-s">    /_/                                     </span>
<span class="pl-s">MIT License: type "license" to see more details.</span>
<span class="pl-s">For help, type "help".</span>
<span class="pl-s">For bug reports, issues, and manual, please see:</span>
<span class="pl-s">&lt;https://github.com/OpenTimer/OpenTimer&gt;.</span>
<span class="pl-s">ot&gt; </span></pre></div>
<p dir="auto">We have provided a <a href="/OpenTimer/OpenTimer/blob/master/example/simple">simple design</a>
which consists of five gates (one NAND, one NOR, two INV, one FF) and one clock.
Move to the folder and read this simple design.</p>
<p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/OpenTimer/OpenTimer/blob/master/image/simple_schematic.jpg"><img align="right" src="/OpenTimer/OpenTimer/raw/master/image/simple_schematic.jpg" width="55%" style="max-width: 100%;"></a></p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="ot&gt; cd example/simple
ot&gt; read_celllib osu018_stdcells.lib
ot&gt; read_verilog simple.v   
ot&gt; read_sdc simple.sdc"><pre>ot<span class="pl-k">&gt;</span> <span class="pl-c1">cd</span> example/simple
ot<span class="pl-k">&gt;</span> read_celllib osu018_stdcells.lib
ot<span class="pl-k">&gt;</span> read_verilog simple.v   
ot<span class="pl-k">&gt;</span> read_sdc simple.sdc</pre></div>
<p dir="auto">Report the timing to show the most critical path.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ot&gt; report_timing      # report the most critical path
Startpoint    : inp1
Endpoint      : f1:D
Analysis type : min
------------------------------------------------------
       Type       Delay        Time   Dir  Description
------------------------------------------------------
       port       0.000       0.000  fall  inp1
        pin       0.000       0.000  fall  u1:A (NAND2X1)
        pin       2.786       2.786  rise  u1:Y (NAND2X1)
        pin       0.000       2.786  rise  u4:A (NOR2X1)
        pin       0.181       2.967  fall  u4:Y (NOR2X1)
        pin       0.000       2.967  fall  f1:D (DFFNEGX1)
    arrival                   2.967        data arrival time

related pin      25.000      25.000  fall  f1:CLK (DFFNEGX1)
 constraint       1.518      26.518        library hold_falling
   required                  26.518        data required time
------------------------------------------------------
      slack                 -23.551        VIOLATED"><pre lang="text" class="notranslate"><code>ot&gt; report_timing      # report the most critical path
Startpoint    : inp1
Endpoint      : f1:D
Analysis type : min
------------------------------------------------------
       Type       Delay        Time   Dir  Description
------------------------------------------------------
       port       0.000       0.000  fall  inp1
        pin       0.000       0.000  fall  u1:A (NAND2X1)
        pin       2.786       2.786  rise  u1:Y (NAND2X1)
        pin       0.000       2.786  rise  u4:A (NOR2X1)
        pin       0.181       2.967  fall  u4:Y (NOR2X1)
        pin       0.000       2.967  fall  f1:D (DFFNEGX1)
    arrival                   2.967        data arrival time

related pin      25.000      25.000  fall  f1:CLK (DFFNEGX1)
 constraint       1.518      26.518        library hold_falling
   required                  26.518        data required time
------------------------------------------------------
      slack                 -23.551        VIOLATED
</code></pre></div>
<p dir="auto">The critical path originates from the primary input <code>inp1</code> and
feed into the data pin <code>f1:D</code> of the flip-flop <code>DFFNEGX1</code>.</p>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Compile OpenTimer</h1><a id="user-content-compile-opentimer" class="anchor" aria-label="Permalink: Compile OpenTimer" href="#compile-opentimer"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">System Requirements</h2><a id="user-content-system-requirements" class="anchor" aria-label="Permalink: System Requirements" href="#system-requirements"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">OpenTimer is very self-contained and has very few dependencies.
To compile OpenTimer, you need a <a href="https://en.wikipedia.org/wiki/C%2B%2B17" rel="nofollow">C++17</a> compiler.
We currently support:</p>
<ul dir="auto">
<li>GNU C++ Compiler v7.3 with -std=c++1z</li>
<li>Clang C++ Compiler v6.0 with -std=c++17</li>
</ul>
<p dir="auto">In addition, you need a tcl shell interpreter:</p>
<ul dir="auto">
<li><a href="https://www.tcl.tk/about/language.html" rel="nofollow">tclsh</a>
(most Unix/Linux/OSX distributions already include tclsh)</li>
</ul>
<p dir="auto">OpenTimer has been tested to run well on Linux distributions and MAC OSX.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Build through CMake</h2><a id="user-content-build-through-cmake" class="anchor" aria-label="Permalink: Build through CMake" href="#build-through-cmake"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">We use <a href="https://cmake.org/" rel="nofollow">CMake</a> to manage the source and tests.
We recommend using out-of-source build.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="~$ git clone https://github.com/OpenTimer/OpenTimer.git
~$ cd OpenTimer
~$ mkdir build
~$ cd build
~$ cmake ../ -DCMAKE_CXX_STANDARD=17
~$ make "><pre><span class="pl-k">~</span>$ git clone https://github.com/OpenTimer/OpenTimer.git
<span class="pl-k">~</span>$ <span class="pl-c1">cd</span> OpenTimer
<span class="pl-k">~</span>$ mkdir build
<span class="pl-k">~</span>$ <span class="pl-c1">cd</span> build
<span class="pl-k">~</span>$ cmake ../ -DCMAKE_CXX_STANDARD=17
<span class="pl-k">~</span>$ make </pre></div>
<p dir="auto">After successful build, you can find binaries and libraries in the folders <code>bin</code>
and <code>lib</code>, respectively.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Run Tests</h2><a id="user-content-run-tests" class="anchor" aria-label="Permalink: Run Tests" href="#run-tests"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">OpenTimer uses <a href="https://github.com/onqtam/doctest">Doctest</a> for unit tests and
<a href="https://sites.google.com/site/taucontest2015/" rel="nofollow">TAU15</a> benchmarks for integration/regression tests. These benchmarks are generated by an
industry standard timer and are being used by many EDA researchers.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="~$ make test"><pre><span class="pl-k">~</span>$ make <span class="pl-c1">test</span></pre></div>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Design Philosophy</h1><a id="user-content-design-philosophy" class="anchor" aria-label="Permalink: Design Philosophy" href="#design-philosophy"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">OpenTimer has a unique software architecture to
efficiently enable parallel incremental timing.
We draw two levers on <em>performance</em> and <em>useability</em>
by grouping each timing operation to one of the three categories,
<em>builder</em>, <em>action</em>, and <em>accessor</em>.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
<th>Example</th>
<th>Time Complexity</th>
</tr>
</thead>
<tbody>
<tr>
<td>Builder</td>
<td>create lazy tasks to build an analysis framework</td>
<td>read_celllib, insert_gate, set_slew</td>
<td>O(1)</td>
</tr>
<tr>
<td>Action</td>
<td>carry out builder operations to update the timing</td>
<td>update_timing, report_timing, report_slack</td>
<td>Algorithm-dependent</td>
</tr>
<tr>
<td>Accessors</td>
<td>inspect the timer without changing any internal data structures</td>
<td>dump_timer, dump_slack, dump_net_load</td>
<td>Operation-dependent</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Builder: OpenTimer Lineage</h2><a id="user-content-builder-opentimer-lineage" class="anchor" aria-label="Permalink: Builder: OpenTimer Lineage" href="#builder-opentimer-lineage"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">OpenTimer maintains a lineage graph of <em>builder</em> operations
to create a <em>task execution plan</em> (TEP).
A TEP starts with no dependency and keeps adding tasks to the lineage graph
every time you call a builder operation.
It records what transformations need to be executed
when an action has been called.</p>
<p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/OpenTimer/OpenTimer/blob/master/image/lineage.png"><img src="/OpenTimer/OpenTimer/raw/master/image/lineage.png" alt="" style="max-width: 100%;"></a></p>
<p dir="auto">The above figure shows an example
lineage graph of a sequence of builder operations.
The cyan path is the main lineage line
with additional tasks attached to enable parallel execution.
OpenTimer use <a href="https://github.com/taskflow/taskflow">Taskflow</a> to create dependency graphs.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Action: Update Timing</h2><a id="user-content-action-update-timing" class="anchor" aria-label="Permalink: Action: Update Timing" href="#action-update-timing"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">A TEP is materialized and executed when the timer is requested to perform
an <em>action</em> operation.
Each action operation triggers timing update
from the earliest task to the one that produces the result
of the action call.
Internally, OpenTimer creates task dependency graph to update timing in parallel,
including forward (slew, arrival time)
and backward (required arrival time) propagations.</p>
<p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/OpenTimer/OpenTimer/blob/master/image/update_timing_simple.png"><img src="/OpenTimer/OpenTimer/raw/master/image/update_timing_simple.png" alt="" style="max-width: 100%;"></a></p>
<p dir="auto">The figure above shows the dependency graph (forward in white, backward in cyan)
to update the timing of the
<a href="/OpenTimer/OpenTimer/blob/master/example/simple/simple.v">simple</a> design.
When an action call finishes, it cleans out the lineage graph
with all timing up-to-date.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Accessor: Inspect OpenTimer</h2><a id="user-content-accessor-inspect-opentimer" class="anchor" aria-label="Permalink: Accessor: Inspect OpenTimer" href="#accessor-inspect-opentimer"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The <em>accessor</em> operations let you inspect the timer status and dump timing information.
All accessor operations are declared as <em>const methods</em> in the timer class.
Calling them promises not to alter any internal members.
For example, you can dump the timing graph into a DOT format and use tools like <a href="https://dreampuf.github.io/GraphvizOnline/" rel="nofollow">GraphViz</a>
for visualization.</p>
<p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/OpenTimer/OpenTimer/blob/master/image/simple_graph_raw.png"><img align="right" src="/OpenTimer/OpenTimer/raw/master/image/simple_graph_raw.png" width="70%" style="max-width: 100%;"></a></p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="ot&gt; dump_graph  
digraph TimingGraph {
  &quot;inp1&quot;;
  ...  # skip for short
  &quot;f1:CLK&quot; -&gt; &quot;f1:Q&quot;;
  &quot;u1:B&quot; -&gt; &quot;u1:Y&quot;;
  &quot;u1:A&quot; -&gt; &quot;u1:Y&quot;;
}"><pre>ot<span class="pl-k">&gt;</span> dump_graph  
digraph TimingGraph {
  <span class="pl-s"><span class="pl-pds">"</span>inp1<span class="pl-pds">"</span></span><span class="pl-k">;</span>
  ...  <span class="pl-c"><span class="pl-c">#</span> skip for short</span>
  <span class="pl-s"><span class="pl-pds">"</span>f1:CLK<span class="pl-pds">"</span></span> -<span class="pl-k">&gt;</span> <span class="pl-s"><span class="pl-pds">"</span>f1:Q<span class="pl-pds">"</span></span><span class="pl-k">;</span>
  <span class="pl-s"><span class="pl-pds">"</span>u1:B<span class="pl-pds">"</span></span> -<span class="pl-k">&gt;</span> <span class="pl-s"><span class="pl-pds">"</span>u1:Y<span class="pl-pds">"</span></span><span class="pl-k">;</span>
  <span class="pl-s"><span class="pl-pds">"</span>u1:A<span class="pl-pds">"</span></span> -<span class="pl-k">&gt;</span> <span class="pl-s"><span class="pl-pds">"</span>u1:Y<span class="pl-pds">"</span></span><span class="pl-k">;</span>
}</pre></div>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">OpenTimer Shell</h1><a id="user-content-opentimer-shell" class="anchor" aria-label="Permalink: OpenTimer Shell" href="#opentimer-shell"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">OpenTimer shell is a powerful command line tool to perform interactive analysis.
It is also the easiest way to get your first timing report off the ground.
The program <code>ot-shell</code> can be found in the folder <code>bin/</code> after you
<a href="#compile-opentimer">Compile OpenTimer</a>.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Commands</h2><a id="user-content-commands" class="anchor" aria-label="Permalink: Commands" href="#commands"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The table below shows a list of commonly used commands.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Command</th>
<th>type</th>
<th>Arguments</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>read_celllib</td>
<td>builder</td>
<td>[-min | -max] file</td>
<td>read the cell library for early and late splits</td>
<td>read_celllib mylib.lib</td>
</tr>
<tr>
<td>read_verilog</td>
<td>builder</td>
<td>file</td>
<td>read the verilog netlist</td>
<td>read_verilog mynetlist.v</td>
</tr>
<tr>
<td>read_spef</td>
<td>builder</td>
<td>file</td>
<td>read parasitics in SPEF</td>
<td>read_spef myparasitics.spef</td>
</tr>
<tr>
<td>read_sdc</td>
<td>builder</td>
<td>file</td>
<td>read a Synopsys Design Constraint file</td>
<td>read_sdc myrule.sdc</td>
</tr>
<tr>
<td>update_timing</td>
<td>action</td>
<td>none</td>
<td>update the timing</td>
<td>update_timing</td>
</tr>
<tr>
<td>report_timing</td>
<td>action</td>
<td>[-num_paths k]</td>
<td>report the critical paths</td>
<td>report_timing -num_paths 10</td>
</tr>
<tr>
<td>report_tns</td>
<td>action</td>
<td>none</td>
<td>report the total negative slack</td>
<td>report_tns</td>
</tr>
<tr>
<td>report_wns</td>
<td>action</td>
<td>none</td>
<td>report the worst negative slack</td>
<td>report_wns</td>
</tr>
<tr>
<td>dump_graph</td>
<td>accessor</td>
<td>[-o file]</td>
<td>dump the timing graph to a DOT format</td>
<td>dump_graph</td>
</tr>
<tr>
<td>dump_timer</td>
<td>accessor</td>
<td>[-o file]</td>
<td>dump the design statistics</td>
<td>dump_timer</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">To see the full command list, visit <a href="/OpenTimer/OpenTimer/blob/master/wiki/home.md">OpenTimer Wiki</a>.</p>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Integrate OpenTimer to your Project</h1><a id="user-content-integrate-opentimer-to-your-project" class="anchor" aria-label="Permalink: Integrate OpenTimer to your Project" href="#integrate-opentimer-to-your-project"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">There are a number of ways to develop your project on top of OpenTimer.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Option 1: Add OpenTimer Subproject</h2><a id="user-content-option-1-add-opentimer-subproject" class="anchor" aria-label="Permalink: Option 1: Add OpenTimer Subproject" href="#option-1-add-opentimer-subproject"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The easiest way to build an OpenTimer application is to include it as a subproject
using CMake <a href="https://cmake.org/cmake/help/latest/command/add_subdirectory.html" rel="nofollow">add_subdirectory</a>.
Copy OpenTimer to your project root directory and configure your CMakeLists
<a href="/OpenTimer/OpenTimer/blob/master/doc/CMakeLists-Subproject.template">as follows</a>:</p>
<div class="highlight highlight-source-cmake notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="cmake_minimum_required (VERSION 3.9)                  # CMake minimum version
project(app)                                          # your OpenTimer application
add_subdirectory(OpenTimer)                           # add OpenTimer project
include_directories(${PROJECT_SOURCE_DIR}/OpenTimer)  # add OpenTimer include

find_package(Threads REQUIRED)                        # thread library (pthread)

add_executable(app app.cpp)                           # link to your app.cpp
target_link_libraries(app OpenTimer Threads::Threads stdc++fs)"><pre><span class="pl-c1">cmake_minimum_required</span> (<span class="pl-c1">VERSION</span> <span class="pl-s">3.9</span>)                  <span class="pl-c">#<span class="pl-c"> CMake minimum version</span></span>
<span class="pl-c1">project</span>(app)                                          <span class="pl-c">#<span class="pl-c"> your OpenTimer application</span></span>
<span class="pl-c1">add_subdirectory</span>(<span class="pl-s">OpenTimer</span>)                           <span class="pl-c">#<span class="pl-c"> add OpenTimer project</span></span>
<span class="pl-c1">include_directories</span>(<span class="pl-smi">${<span class="pl-c1">PROJECT_SOURCE_DIR</span>}</span><span class="pl-s">/OpenTimer</span>)  <span class="pl-c">#<span class="pl-c"> add OpenTimer include</span></span>

<span class="pl-c1">find_package</span>(<span class="pl-s">Threads</span> <span class="pl-s">REQUIRED</span>)                        <span class="pl-c">#<span class="pl-c"> thread library (pthread)</span></span>

<span class="pl-c1">add_executable</span>(<span class="pl-s">app</span> <span class="pl-s">app.cpp</span>)                           <span class="pl-c">#<span class="pl-c"> link to your app.cpp</span></span>
<span class="pl-c1">target_link_libraries</span>(<span class="pl-s">app</span> <span class="pl-s">OpenTimer</span> <span class="pl-s">Threads::Threads</span> <span class="pl-s">stdc++fs</span>)</pre></div>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Option 2: Install OpenTimer</h2><a id="user-content-option-2-install-opentimer" class="anchor" aria-label="Permalink: Option 2: Install OpenTimer" href="#option-2-install-opentimer"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Our project <a href="/OpenTimer/OpenTimer/blob/master/CMakeLists.txt">CMakeLists.txt</a> has defined the required files
to install when you hit <code>make install</code>.
The installation paths are <code>&lt;prefix&gt;/include</code>, <code>&lt;prefix&gt;/lib</code>, and <code>&lt;prefix&gt;/bin</code>
for the hpp files, library, and executable where <code>&lt;prefix&gt;</code> can be configured
through the cmake variable <a href="https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html#variable:CMAKE_INSTALL_PREFIX" rel="nofollow">CMAKE_INSTALL_PREFIX</a>.
The following example installs OpenTimer to <code>/tmp</code>.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="~$ cd build/
~$ cmake ../ -DCMAKE_INSTALL_PREFIX=/tmp
~$ make 
~$ make install
~$ cd /tmp            # install OpenTimer to /tmp
~$ ls
bin/  include/  lib/  # OpenTimer headers, libraries, and binaries"><pre><span class="pl-k">~</span>$ <span class="pl-c1">cd</span> build/
<span class="pl-k">~</span>$ cmake ../ -DCMAKE_INSTALL_PREFIX=/tmp
<span class="pl-k">~</span>$ make 
<span class="pl-k">~</span>$ make install
<span class="pl-k">~</span>$ <span class="pl-c1">cd</span> /tmp            <span class="pl-c"><span class="pl-c">#</span> install OpenTimer to /tmp</span>
<span class="pl-k">~</span>$ ls
bin/  include/  lib/  <span class="pl-c"><span class="pl-c">#</span> OpenTimer headers, libraries, and binaries</span></pre></div>
<p dir="auto">To build your application on top of the OpenTimer headers and library,
you need <code>-std=c++1z</code> and <code>-lstdc++fs</code> flags
to enable C++17 standard and <a href="https://en.cppreference.com/w/cpp/experimental/fs" rel="nofollow">filesystem</a> libraries.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="~$ g++ app.cpp -std=c++1z -O2 -I include -L lib -lOpenTimer -lpthread -o app.out &quot;-lstdc++fs &quot;
~$ ./app.out"><pre><span class="pl-k">~</span>$ g++ app.cpp -std=c++1z -O2 -I include -L lib -lOpenTimer -lpthread -o app.out <span class="pl-s"><span class="pl-pds">"</span>-lstdc++fs <span class="pl-pds">"</span></span>
<span class="pl-k">~</span>$ ./app.out</pre></div>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">OpenTimer C++ API</h1><a id="user-content-opentimer-c-api" class="anchor" aria-label="Permalink: OpenTimer C++ API" href="#opentimer-c-api"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The class <a href="/OpenTimer/OpenTimer/blob/master/ot/timer/timer.hpp">Timer</a> is the main entry you need to
call OpenTimer in your project.
The table below summarizes a list of commonly used methods.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Method</th>
<th>Type</th>
<th>Argument</th>
<th>Return</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>read_celllib</td>
<td>builder</td>
<td>path, split</td>
<td>self</td>
<td>read the cell library for early and late splits</td>
</tr>
<tr>
<td>read_verilog</td>
<td>builder</td>
<td>path</td>
<td>self</td>
<td>read a verilog netlist</td>
</tr>
<tr>
<td>read_spef</td>
<td>builder</td>
<td>path</td>
<td>self</td>
<td>read parasitics in SPEF</td>
</tr>
<tr>
<td>read_sdc</td>
<td>builder</td>
<td>path</td>
<td>self</td>
<td>read a Synopsys Design Constraint file</td>
</tr>
<tr>
<td>update_timing</td>
<td>action</td>
<td>void</td>
<td>void</td>
<td>update the timing; all timing values are up-to-date upon return</td>
</tr>
<tr>
<td>tns</td>
<td>action</td>
<td>void</td>
<td>optional of float</td>
<td>update the timing and return the total negative slack if exists</td>
</tr>
<tr>
<td>wns</td>
<td>action</td>
<td>void</td>
<td>optional of float</td>
<td>update the timing and return the worst negative slack if exists</td>
</tr>
<tr>
<td>dump_graph</td>
<td>accessor</td>
<td>ostream</td>
<td>void</td>
<td>dump the timing graph in DOT format to an output stream</td>
</tr>
<tr>
<td>dump_timer</td>
<td>accessor</td>
<td>ostream</td>
<td>void</td>
<td>dump the design statistics to an output stream</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto"><em>All public methods are thread-safe</em> as a result of OpenTimer lineage.
The example below shows an OpenTimer application and the use of builder, action, and accessor API.</p>
<div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="#include &lt;ot/timer/timer.hpp&gt;                     // top-level header to include

int main(int argc, char *argv[]) {
  
  ot::Timer timer;                                // create a timer instance (thread-safe)
  
  timer.read_celllib(&quot;simple.lib&quot;, std::nullopt)  // read the library (O(1) builder)
       .read_verilog(&quot;simple.v&quot;)                  // read the verilog netlist (O(1) builder)
       .read_spef(&quot;simple.spef&quot;)                  // read the parasitics (O(1) builder)
       .read_sdc(&quot;simple.sdc&quot;)                    // read the design constraints (O(1) builder)
       .update_timing();                          // update timing (O(1) builder)

  if(auto tns = timer.report_tns(); tns) std::cout &lt;&lt; &quot;TNS: &quot; &lt;&lt; *tns &lt;&lt; '\n';  // (O(N) action)
  if(auto wns = timer.report_wns(); wns) std::cout &lt;&lt; &quot;WNS: &quot; &lt;&lt; *wns &lt;&lt; '\n';  // (O(N) action)
  
  timer.dump_timer(std::cout);                    // dump the timer details (O(1) accessor)
  
  return 0;
}"><pre>#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>ot/timer/timer.hpp<span class="pl-pds">&gt;</span></span>                     <span class="pl-c"><span class="pl-c">//</span> top-level header to include</span>

<span class="pl-k">int</span> <span class="pl-en">main</span>(<span class="pl-k">int</span> argc, <span class="pl-k">char</span> *argv[]) {
  
  ot::Timer timer;                                <span class="pl-c"><span class="pl-c">//</span> create a timer instance (thread-safe)</span>
  
  timer.<span class="pl-c1">read_celllib</span>(<span class="pl-s"><span class="pl-pds">"</span>simple.lib<span class="pl-pds">"</span></span>, std::<span class="pl-c1">nullopt</span>)  <span class="pl-c"><span class="pl-c">//</span> read the library (O(1) builder)</span>
       .<span class="pl-c1">read_verilog</span>(<span class="pl-s"><span class="pl-pds">"</span>simple.v<span class="pl-pds">"</span></span>)                  <span class="pl-c"><span class="pl-c">//</span> read the verilog netlist (O(1) builder)</span>
       .<span class="pl-c1">read_spef</span>(<span class="pl-s"><span class="pl-pds">"</span>simple.spef<span class="pl-pds">"</span></span>)                  <span class="pl-c"><span class="pl-c">//</span> read the parasitics (O(1) builder)</span>
       .<span class="pl-c1">read_sdc</span>(<span class="pl-s"><span class="pl-pds">"</span>simple.sdc<span class="pl-pds">"</span></span>)                    <span class="pl-c"><span class="pl-c">//</span> read the design constraints (O(1) builder)</span>
       .<span class="pl-c1">update_timing</span>();                          <span class="pl-c"><span class="pl-c">//</span> update timing (O(1) builder)</span>

  <span class="pl-k">if</span>(<span class="pl-k">auto</span> tns = timer.<span class="pl-c1">report_tns</span>(); tns) std::cout &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>TNS: <span class="pl-pds">"</span></span> &lt;&lt; *tns &lt;&lt; <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span>;  <span class="pl-c"><span class="pl-c">//</span> (O(N) action)</span>
  <span class="pl-k">if</span>(<span class="pl-k">auto</span> wns = timer.<span class="pl-c1">report_wns</span>(); wns) std::cout &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>WNS: <span class="pl-pds">"</span></span> &lt;&lt; *wns &lt;&lt; <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span>;  <span class="pl-c"><span class="pl-c">//</span> (O(N) action)</span>
  
  timer.<span class="pl-c1">dump_timer</span>(std::cout);                    <span class="pl-c"><span class="pl-c">//</span> dump the timer details (O(1) accessor)</span>
  
  <span class="pl-k">return</span> <span class="pl-c1">0</span>;
}</pre></div>
<p dir="auto">To see the full API list, visit <a href="/OpenTimer/OpenTimer/blob/master/wiki/home.md">OpenTimer Wiki</a>.</p>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Examples</h1><a id="user-content-examples" class="anchor" aria-label="Permalink: Examples" href="#examples"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The folder <a href="/OpenTimer/OpenTimer/blob/master/example">example</a> contains several examples and is a great place to learn how to use OpenTimer.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Example</th>
<th>Description</th>
<th>Library</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="/OpenTimer/OpenTimer/blob/master/example/simple">simple</a></td>
<td>A timing report example on a sequential circuit design.</td>
<td><a href="https://vlsiarch.ecen.okstate.edu/flow/" rel="nofollow">OSU Free PDK 45nm</a></td>
</tr>
<tr>
<td><a href="/OpenTimer/OpenTimer/blob/master/example/incremental">incremental</a></td>
<td>An incremental timing example to create a sequential design from the ground up using OpenTimer's C++ API</td>
<td><a href="https://vlsiarch.ecen.okstate.edu/flow/" rel="nofollow">OSU Free PDK 45nm</a></td>
</tr>
<tr>
<td><a href="/OpenTimer/OpenTimer/blob/master/example/unit">unit</a></td>
<td>A dimensional analysis example with different time unit conversions.</td>
<td><a href="https://vlsiarch.ecen.okstate.edu/flow/" rel="nofollow">OSU Free PDK 45nm</a></td>
</tr>
<tr>
<td><a href="/OpenTimer/OpenTimer/blob/master/example/sizer">sizer</a></td>
<td>A gate-sizing example on a design with six NAND2 cells.</td>
<td><a href="http://www.nangate.com/?page_id=22" rel="nofollow">NanGate 45nm Open Cell Library</a></td>
</tr>
<tr>
<td><a href="/OpenTimer/OpenTimer/blob/master/example/optimizer">optimizer</a></td>
<td>A timing-driven optimization example plus incremental timing update.</td>
<td><a href="https://sites.google.com/site/taucontest2015/" rel="nofollow">TAU15 contest library</a></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">The folder <a href="/OpenTimer/OpenTimer/blob/master/benchmark">benchmark</a> contains more designs and they are mainly used for internal regression
and integration tests.</p>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Who is Using OpenTimer?</h1><a id="user-content-who-is-using-opentimer" class="anchor" aria-label="Permalink: Who is Using OpenTimer?" href="#who-is-using-opentimer"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">OpenTimer is an award-winning tools. It won ACM TAU Timing Analysis Contests multiple times
(<a href="https://sites.google.com/site/taucontest2014/" rel="nofollow">1st Place</a> in 2014, <a href="https://sites.google.com/site/taucontest2015/" rel="nofollow">2nd Place</a> in 2015, and <a href="https://sites.google.com/site/taucontest2016/" rel="nofollow">1st Place</a> in 2016),
the <a href="https://fossi-foundation.org/2016/10/13/designcontest" rel="nofollow">Special Price</a> in the 2016 LibreCores Design Contest,
and the Best Tool Winner in the 2018 <a href="https://woset-workshop.github.io/" rel="nofollow">WOSET</a> at ICCAD.
Many industry and academic people are using OpenTimer in their projects:</p>
<ul dir="auto">
<li><a href="https://sites.google.com/view/tau-contest-2019/home" rel="nofollow">Golden Timer</a>, 2019 ACM TAU Timing Analysis Contest on Timing-driven Optimization</li>
<li><a href="https://sites.google.com/view/taucontest2018/" rel="nofollow">Golden Timer</a>, 2018 ACM TAU Timing Analysis Contest on Timing Reports from an STA Graph</li>
<li><a href="https://sites.google.com/site/taucontest2017/" rel="nofollow">Golden Timer</a>, 2017 ACM TAU Timing Analysis Contest on Micro Modeling</li>
<li><a href="https://sites.google.com/site/taucontest2016/" rel="nofollow">Golden Timer</a>, 2016 ACM TAU Timing Analysis Contest on Micro Modeling</li>
<li><a href="http://cad-contest.el.cycu.edu.tw/problem_C/default.html" rel="nofollow">Golden Timer</a>, 2015 ACM/IEEE ICCAD Incremental Timing-driven Placement Contest</li>
<li><a href="https://www.vlsisystemdesign.com/" rel="nofollow">VSD</a>: VLSI System Design Corporation</li>
<li><a href="https://github.com/jinwookjungs/open_design_flow">OpenDesign Flow Database</a>: the infrastructure for VLSI design and design automation research</li>
<li><a href="https://cloudv.io/" rel="nofollow">CloudV</a>: a cloud-based platform to design and test chips for free</li>
<li><a href="https://github.com/masc-ucsc/lgraph">LGraph</a>: live graph infrastructure for synthesis and simulation</li>
<li><a href="http://opencircuitdesign.com/qflow/history.html" rel="nofollow">Qflow</a>: a digital synthesis flow using open-source EDA tools</li>
<li><a href="https://gitlab.com/eclufsc/ophidian" rel="nofollow">Ophidian</a>: an open-source library for physical design research and teaching</li>
</ul>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="center"><a href="https://sites.google.com/site/taucontest2016/" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/tau16.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://sites.google.com/site/taucontest2017/" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/tau17.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://sites.google.com/view/taucontest2018/" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/tau18.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://sites.google.com/view/tau-contest-2019/home" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/tau19.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="http://cad-contest.el.cycu.edu.tw/problem_C/default.html" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/CAD-contest.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://www.vlsisystemdesign.com/" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/vsd.jpg" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://gitlab.com/eclufsc/ophidian" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/ophidian.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://cloudv.io/" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/cloudv.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://github.com/masc-ucsc/lgraph"><img src="/OpenTimer/OpenTimer/raw/master/image/lgraph.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="http://opencircuitdesign.com/qflow/history.html" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/qflow.png" width="100px" style="max-width: 100%;"></a></th>
</tr>
</thead>
</table></markdown-accessiblity-table>
<p dir="auto">Please don't hesitate to <a href="mailto:twh760812@gmail.com">let me know</a> if I forgot your project!</p>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Get Involved</h1><a id="user-content-get-involved" class="anchor" aria-label="Permalink: Get Involved" href="#get-involved"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li>Report bugs/issues by submitting a <a href="https://github.com/OpenTimer/OpenTimer/issues">Github issue</a>.</li>
<li>Submit contributions using <a href="https://github.com/OpenTimer/OpenTimer/pulls">pull requests</a>.</li>
<li>See documentation and manual in <a href="/OpenTimer/OpenTimer/blob/master/wiki/home.md">OpenTimer Wiki</a>.</li>
<li>Stay tuned with our <a href="https://github.com/OpenTimer/OpenTimer/projects">project progress</a>.</li>
<li>Read and cite our <a href="/OpenTimer/OpenTimer/blob/master/doc/iccad15.pdf">ICCAD</a> and <a href="/OpenTimer/OpenTimer/blob/master/doc/tcad16.pdf">TCAD</a> papers.</li>
</ul>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Contributors &amp; Acknowledgment</h1><a id="user-content-contributors--acknowledgment" class="anchor" aria-label="Permalink: Contributors &amp; Acknowledgment" href="#contributors--acknowledgment"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">OpenTimer is being actively developed and contributed by the following people:</p>
<ul dir="auto">
<li><a href="https://twhuang.ece.illinois.edu/" rel="nofollow">Tsung-Wei Huang</a> created the OpenTimer project is now the chief architect.</li>
<li><a href="https://ece.illinois.edu/directory/profile/mdfwong" rel="nofollow">Martin Wong</a> supported the OpenTimer project through NSF and DARPA funding.</li>
<li><a href="https://github.com/aolofsson">Andreas Olofsson</a> supported the OpenTimer project through the DARPA IDEA project.</li>
<li><a href="https://github.com/clin99">Chun-Xun Lin</a> implemented the prompt interface of OpenTimer shell.</li>
<li><a href="mailto:kunalpghosh@gmail.com">Kunal Ghosh</a> provided a list of practical features to include in OpenTimer.</li>
<li><a href="mailto:palacedeforsaken@gmail.com">Pei-Yu Lee</a> provided useful incremental timing discussion and helped fix bugs.</li>
<li><a href="mailto:tinyinlai@gmail.com">Tin-Yin Lai</a> discussed micro modeling algorithms and helped fix bugs.</li>
<li><a href="mailto:jinhu@umich.edu">Jin Hu</a> helped define the timing API and produced the golden benchmarks for integration tests.</li>
<li><a href="mailto:mckima@us.ibm.com">Myung-Chul Kim</a> helped test OpenTimer through ICCAD CAD contest.</li>
<li><a href="mailto:george@geochrist.com">George Chen</a> helped defined path report formats and test OpenTimer through TAU contest.</li>
<li><a href="mailto:jignesh.shah@intel.com">Jignesh Shah</a> contributed to the area and power report commands.</li>
<li><a href="mailto:poyipenny@gmail.com">Pao-I Chen</a> helped design the logo of OpenTimer.</li>
<li><a href="mailto:tkdlezz@gmail.com">Leslie Hwang</a> reviewed the documentation and README.</li>
<li><a href="mailto:song.chen@synopsys.com">Song Chen</a> shared his opinion about command designs to avoid naming conflicts and litigation.</li>
<li><a href="https://randy1005.github.io/" rel="nofollow">Che Chang</a> designed parallelization strategies and performance optimizations to accelerate critical path generation.</li>
</ul>

<p dir="auto">Meanwhile, we appreciate the support from many organizations for our development of OpenTimer.
Please don't hesitate to <a href="mailto:twh760812@gmail.com">let me know</a> if I forgot you!</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="center"><a href="https://illinois.edu/" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/uiuc.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://csl.illinois.edu/" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/csl.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://www.nsf.gov/" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/nsf.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://www.darpa.mil/news-events/2017-09-13" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/darpa.png" width="100px" style="max-width: 100%;"></a></th>
<th align="center"><a href="https://www.vlsisystemdesign.com/" rel="nofollow"><img src="/OpenTimer/OpenTimer/raw/master/image/vsd.jpg" width="100px" style="max-width: 100%;"></a></th>
</tr>
</thead>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">License</h1><a id="user-content-license" class="anchor" aria-label="Permalink: License" href="#license"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/026441a10e0fdef1b4e4580b3b4980038df8feb2284aebef08bfdc080b60ab4c/687474703a2f2f6f70656e736f757263652e6f72672f74726164656d61726b732f6f70656e736f757263652f4f53492d417070726f7665642d4c6963656e73652d313030783133372e706e67"><img align="right" src="https://camo.githubusercontent.com/026441a10e0fdef1b4e4580b3b4980038df8feb2284aebef08bfdc080b60ab4c/687474703a2f2f6f70656e736f757263652e6f72672f74726164656d61726b732f6f70656e736f757263652f4f53492d417070726f7665642d4c6963656e73652d313030783133372e706e67" data-canonical-src="http://opensource.org/trademarks/opensource/OSI-Approved-License-100x137.png" style="max-width: 100%;"></a></p>
<p dir="auto">OpenTimer is licensed under the <a href="/OpenTimer/OpenTimer/blob/master/LICENSE">MIT License</a>:</p>
<blockquote>
<p dir="auto">Copyright © 2018 <a href="https://twhuang.ece.illinois.edu/" rel="nofollow">Dr. Tsung-Wei Huang</a> and <a href="https://ece.illinois.edu/directory/profile/mdfwong" rel="nofollow">Dr. Martin Wong</a></p>
<p dir="auto">The University of Illinois at Urbana-Champaign, IL, USA</p>
<p dir="auto">Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
<p dir="auto">The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
<p dir="auto">THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>
</blockquote>
<hr>
<p dir="auto">The core of OpenTimer is under MIT license. However, it is built, tested, and documented
using several third-party tools and services. Thanks a lot!</p>
<ul dir="auto">
<li><a href="https://github.com/nholthaus/units">units</a>: a compile-time header-only dimensional analysis and unit conversion</li>
<li><a href="https://github.com/OpenTimer/Parser-SPEF">Parser-SPEF</a>: a fast C++ header-only parser for standard parasitic exchange format (SPEF)</li>
<li><a href="https://github.com/taocpp/PEGTL">PEGTL</a>: parsing expression grammar template library</li>
<li><a href="https://github.com/taskflow/taskflow">Taskflow</a>: fast C++ parallel programming with task dependencies</li>
<li><a href="http://www.nangate.com/?page_id=22" rel="nofollow">NanGate 45nm Library</a>: open-source standard-cell library for testing and exploring EDA flows</li>
<li><a href="https://vlsiarch.ecen.okstate.edu/flow/" rel="nofollow">OSU PDK</a>: Oklahoma State University system on chip (SoC) design flows</li>
<li><a href="https://www.synopsys.com/community/interoperability-programs/tap-in.html" rel="nofollow">Synopsys TAP-in</a>: Synopsys technology access program for liberty user guide and open-source SDC parser.</li>
</ul>
<p dir="auto">You can find a copy of these licenses under the folder <a href="/OpenTimer/OpenTimer/blob/master/licenses">licenses</a>.</p>
<hr>
</article></div><div class="d-none"></div></section></div></div></div> </div> <!-- --> </div></div></div></div></div></div><div class="ScrollMarksContainer-module__scrollMarksContainer__Eu7uU" id="find-result-marks-container"></div><div class="d-none"></div><div class="d-none"></div></div> <!-- --> <!-- --> </div>
</react-app>




  </div>

</turbo-frame>

    </main>
  </div>

  </div>

          <footer class="footer f6 color-fg-muted color-border-subtle tmp-pt-7 tmp-pb-6 p-responsive" role="contentinfo"  >
  <h2 class='sr-only'>Footer</h2>

  


  <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
    <div class="d-flex flex-items-center flex-shrink-0 mx-2">
      <a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
        <svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
</a>
      <span>
        &copy; 2026 GitHub,&nbsp;Inc.
      </span>
    </div>

    <nav aria-label="Footer">
      <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>

      <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">


          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
          </li>


            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
            </li>

            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
            </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to community&quot;,&quot;label&quot;:&quot;text:community&quot;}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
          </li>

          
<li class="mx-2" >
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}"
    >
      Manage cookies
    </button>
  </cookie-consent-link>
</li>

  <li class="mx-2">
    <cookie-consent-link>
      <button
        type="button"
        class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
        data-action="click:cookie-consent-link#showConsentManagement"
        data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}"
      >
        Do not share my personal information
      </button>
    </cookie-consent-link>
  </li>

      </ul>
    </nav>
  </div>
</footer>



    <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
      data-locale="en"
      data-initial-cookie-consent-allowed=""
      data-cookie-consent-required="true"
    ></ghcc-consent>




  <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
    <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    You can’t perform that action at this time.
  </div>

    <template id="site-details-dialog">
  <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
    <summary role="button" aria-label="Close dialog"></summary>
    <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
      <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
      </button>
      <div class="octocat-spinner tmp-my-6 js-details-dialog-spinner"></div>
    </details-dialog>
  </details>
</template>

    <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
  <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
  </div>
</div>

    <template id="snippet-clipboard-copy-button">
  <div class="zeroclipboard-container position-absolute right-0 top-0">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2 tmp-m-2">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2 tmp-m-2">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>
<template id="snippet-clipboard-copy-button-unpositioned">
  <div class="zeroclipboard-container">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>




    </div>
    <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
    <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
  </body>
</html>

