emacs自定义tcl-like-mode.el,支持dc、icc、innovus命令高亮
专栏:ExASIC July 17, 2025, 1:17 a.m. 55 阅读
dc、icc、innovus等芯片中后端eda的脚本一般是tcl格式,但是eda基于扩展了很多很多命令,如果能够高亮这些eda命令,将大大方便了脚本的编写和修改。

dc、icc、innovus等芯片中后端eda的脚本一般是tcl格式,但是eda基于扩展了很多很多命令,如果能够高亮这些eda命令,将大大方便了脚本的编写和修改。

因此,总结了几点需求:
1、高亮tcl自身的关键字,如set、puts、for等。
2、注释、字符串显示高亮颜色
3、高亮标点符号,如[]{}/\*
4、支持自定义dc、icc、innovus等工具的命令为关键字,并指定颜色
5、支持常见后缀,如.tcl.enc.do.cmd.sdc.view

下面是经过实践,可用的一个emacs major mode,取名tcl-like-mode。

;;; tcl-like-mode.el --- major mode for tcl like file

;;; Code:

(defvar tcl-like-mode-syntax-table
  (let ((st (make-syntax-table)))
    (modify-syntax-entry ?%  "_"  st)
    (modify-syntax-entry ?@  "_"  st)
    (modify-syntax-entry ?&  "_"  st)
    (modify-syntax-entry ?*  "_"  st)
    (modify-syntax-entry ?+  "_"  st)
    (modify-syntax-entry ?-  "_"  st)
    (modify-syntax-entry ?.  "_"  st)
    (modify-syntax-entry ?:  "_"  st)
    (modify-syntax-entry ?!  "_"  st)
    (modify-syntax-entry ?$  "_"  st)
    (modify-syntax-entry ?/  "_"  st)
    (modify-syntax-entry ?~  "_"  st)
    (modify-syntax-entry ?<  "_"  st)
    (modify-syntax-entry ?=  "_"  st)
    (modify-syntax-entry ?>  "_"  st)
    (modify-syntax-entry ?|  "_"  st)
    (modify-syntax-entry ?\( "()" st)
    (modify-syntax-entry ?\) ")(" st)
    (modify-syntax-entry ?\[ "()" st)
    (modify-syntax-entry ?\] ")(" st)
    (modify-syntax-entry ?\{ "()" st)
    (modify-syntax-entry ?\} ")(" st)
    (modify-syntax-entry ?\; "."  st)
    (modify-syntax-entry ?\n ">"  st)
    (modify-syntax-entry ?#  "<"  st)
    st)
  "Syntax table in use in `tcl-mode' buffers.")

(define-derived-mode tcl-like-mode prog-mode "TclLike"
  "Major mode for script files (.tcl, .cmd, .do, .enc)."
  
  (set-syntax-table tcl-like-mode-syntax-table)
  
  ;; font lock default
  (setq font-lock-defaults
        '((
	   ;; comment
	   ("#.*" 0 'font-lock-comment-face)
	   
           ;; string
	   ("\".*\"" 0 'font-lock-string-face)
	   
	   ;; punctuation
	   ("[^a-z0-9A-z_#,]" 0 'punc-symbol-face)
	   ("\\[" 0 'punc-symbol-face)
	   ("\\]" 0 'punc-symbol-face)

	   ;; dc cmd
	   ("\\b\\(get_designs\\|set_svf\\|set_vsdc\\|elaborate\\|uniquify\\|write_file\\|set_driving_cell\\|set_max_capacitance\\|set_max_transition\\|set_max_fanout\\|set_load\\|set_max_area\\|foreach_in_collection\\|set_dont_touch\\|set_dont_touch_network\\|set_dont_use\\|set_fix_multiple_port_nets\\|create_scenario\\|set_operating_conditions\\|set_tlu_plus_files\\|set_active_scenarios\\|report_scenarios\\|set_clock_gating_style\\|set_clock_gating_objects\\|check_timing\\|set_preferred_routing_direction\\|extract_physical_constraints\\|set_optimize_registers\\|set_host_options\\|compile_ultra\\|report_clock_gating\\|report_area\\|report_constraints\\|report_timing\\|current_scenario\\|write_sdc\\|create_mw_lib\\|open_mw_lib\\|analyze\\|define_name_rules\\|change_names\\)\\b" 1 font-lock-function-name-face)
	   
	   ;; innovus cmd
	   ("\\b\\(init_design\\|saveDesign\\|loadIoFile\\|setPreference\\|floorPlan\\|setObjFPlanPolygon\\|cutRow\\|addInst\\|attachTerm\\|deleteInst\\|dbQuery\\|add_welltap\\|saveNetlist\\|ecoPlace\\|setNanoRouteMode\\|ecoRoute\\|optDesign\\|editPin\\|setStreamOutMode\\|streamOut\\|setDesignMode\\|setExtractRCMode\\|extractRC\\|rcOut\\|set_ccopt_property\\|ccopt_design\\|dbGet\\|dbSet\\)\\b" 1 font-lock-function-name-face)

	   ;; tcl keywords
	   ("\\b\\(break\\|catch\\|cd\\|chan\\|clock\\|close\\|concat\\|continue\\|dict\\|eof\\|eval\\|exec\\|expr\\|file\\|for\\|foreach\\|format\\|gets\\|glob\\|global\\|if\\|incr\\|join\\|lappend\\|lindex\\|linsert\\|list\\|llength\\|next\\|open\\|proc\\|puts\\|regexp\\|regsub\\|return\\|seek\\|self\\|set\\|socket\\|source\\|split\\|subst\\|switch\\|tell\\|throw\\|time\\|try\\|while\\|yield\\)\\b" 1 'font-lock-keyword-face)
	   
           ))
	)
)

;; punctuation face
(defface punc-symbol-face
  '((t :foreground "#ff63d0" :weight bold))
  "Face for special symbols in script mode."
  :group 'prog-mode)

(provide 'tcl-like-mode)

;;;

~/.emacs里调用tcl-like-mode.el,如下:

(add-to-list 'load-path "~/elisp/tcl-like-mode")
(require 'tcl-like-mode)
(setq auto-mode-alist
      (rassq-delete-all 'tcl-mode auto-mode-alist))
(setq interpreter-mode-alist
      (rassq-delete-all 'tcl-mode interpreter-mode-alist))
(add-to-list 'auto-mode-alist '("\\.tcl\\'" . tcl-like-mode))
(add-to-list 'auto-mode-alist '("\\.cmd\\'" . tcl-like-mode))
(add-to-list 'auto-mode-alist '("\\.do\\'" . tcl-like-mode))
(add-to-list 'auto-mode-alist '("\\.enc\\'" . tcl-like-mode))
(add-to-list 'auto-mode-alist '("\\.sdc\\'" . tcl-like-mode))
(add-to-list 'auto-mode-alist '("\\.view\\'" . tcl-like-mode))

效果如下图:

image.png

image.png

感谢阅读,更多文章点击这里:【专栏:ExASIC】
最新20篇 开设专栏