123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306(*
Copyright 2012-2025 Codinuum Software Lab <https://codinuum.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*)(* verilog/change.ml *)moduleChange_base=Diffast_core.Change_basemoduleTriple=Diffast_core.TriplemoduleInfo=Diffast_core.InfomoduleEdit=Diffast_core.EditmoduleV_label=Verilog_base.V_labelmoduleUID=Diffast_misc.UIDmoduleF(L:V_label.T)=structmoduleI=InfomoduleE=Edit(*let sprintf = Printf.sprintf*)includeChange_basemoduleCB=F(L)(* predicates *)letgetlab=L.getlabletis_always_constructnd=L.is_always_construct(getlabnd)letis_timing_control nd=L.is_timing_control(getlabnd)letis_continuous_assignnd=L.is_continuous_assign(getlabnd)letis_blocking_assignnd=L.is_blocking_assign(getlabnd)letis_non_blocking_assignnd=L.is_non_blocking_assign (getlab nd)letis_ifnd=L.is_if(getlabnd)letis_casend=L.is_case(getlabnd)letis_case_itemnd=L.is_case_item(getlabnd)letis_case_condnd=L.is_case_cond(getlabnd)letis_portsnd=L.is_ports(getlabnd)letis_portnd=L.is_port(getlabnd)letis_port_dirnd=L.is_port_dir(getlabnd)letis_net_typend=L.is_net_type(getlabnd)letis_data_typend=L.is_data_type(getlabnd)letis_var_data_typend=L.is_var_data_type(getlabnd)letis_signingnd=L.is_signing(getlabnd)letis_rangesnd=L.is_ranges(getlabnd)letis_variable_dimsnd=L.is_variable_dims(getlabnd)letis_instnd=L.is_inst(getlabnd)letis_initial_constructnd=L.is_initial_construct(getlabnd)letis_final_constructnd=L.is_final_construct(getlabnd)letis_generate_regionnd=L.is_generate_region(getlabnd)letis_param_port_declnd=L.is_param_port_decl(getlabnd)letis_param_assignnd=L.is_param_assign(getlabnd)letis_regnd=L.is_reg(getlabnd)letis_data_decl_varnd=L.is_data_decl_var(getlabnd)letis_net_declnd=L.is_net_decl(getlabnd)letis_wirend=L.is_wire(getlabnd)letis_exprnd=L.is_expr(getlabnd)letis_stmtnd=L.is_stmt(getlabnd)letis_pp_definend=L.is_pp_define(getlabnd)letis_pp_includend=L.is_pp_include(getlabnd)letis_if_condnd=tryletpnd=nd#initial_parentinis_ifpnd&&is_exprndwith_->falseletis_branchndn=tryletpnd=nd#initial_parentinifis_ifpnd&&is_stmtndthenletstmts=List.filteris_stmt(Array.to_listpnd#children)intryList.nthstmtsn==ndwith_->raise(Invalid_argument"Verilog.Change.F.is_branch")elsefalsewith_->falseletis_then_branchnd=is_branchnd0letis_else_branchnd=is_branchnd1letis_port_valuend=tryletpnd=nd#initial_parentinis_portpnd&&is_exprndwith_->falseletis_reg_declnd=ifis_data_decl_varndthentrylethead=nd#initial_children.(0)inletx=head#initial_children.(head#initial_nchildren-1)inis_regxwith_->falseelsefalseletis_wire_declnd=ifis_net_declndthentryis_wirend#initial_children.(0)with_->falseelsefalse(* *)letget_unittreend=tryletu=tree#get_nearest_containing_unitndinu#data#labelwithNot_found->""letids_to_strids=ifids=[]then""elsesprintf"{%s}"(String.concat","ids)letsubtree_to_strtreend=sprintf"[%s]"(tree#subtree_to_simple_stringnd#gindex)letget_desc1(*is_whole*)_treend=letids=tree#get_ident_use_listnd#gindexinletextra2=if(* is_whole *)truethensubtree_to_strtreendelse""innd#data#label^(ids_to_strids)^extra2letget_desc2tree1tree2nd1nd2=letids1=tree1#get_ident_use_listnd1#gindexinletids2=tree2#get_ident_use_listnd2#gindexinsprintf"%s%s%s -> %s%s%s"nd1#data#label(ids_to_strids1)(subtree_to_strtree1nd1)nd2#data#label(ids_to_strids2)(subtree_to_strtree2nd2)(* class Change.F.c *)classcoptionstree1tree2uidmappingeditsget_unitget_desc1get_desc2=object(self)inheritCB.coptionstree1tree2uidmappingeditsget_unitget_desc1get_desc2method!make_changes_list()=letmkt_del=self#mkt_deleted~category:Triple.ghostinletmkt_ins=self#mkt_inserted~category:Triple.ghostinletmkt_mod=self#mkt_modified~category:Triple.ghostin(*
let mkt_chgto = self#mkt_changed_to ~category:Triple.ghost in
let mkt_ren = self#mkt_renamed ~category:Triple.ghost in
let mkt_mov = self#mkt_moved_to ~category:Triple.ghost in
let mkt_chgodr = self#mkt_changed_order ~category:Triple.ghost in
*)letmkt_chgcard_=[]in[(* always-construct *)"always-construct removed",Smedium,(self#make_delete_stis_always_construct),mkt_del;"always-construct added",Smedium,(self#make_insert_stis_always_construct),mkt_ins;"timing control modified",Smedium,(self#aggregate_changesis_timing_control),mkt_mod;(* continuous assignment *)"continuous-assignment removed",Smedium,(self#make_delete_stis_continuous_assign),mkt_del;"continuous-assignment added",Smedium,(self#make_insert_stis_continuous_assign),mkt_ins;"continuous-assignment modified",Smedium,(self#aggregate_changesis_continuous_assign),mkt_mod;(* blocking assignment *)"blocking-assignment removed",Smedium,(self#make_delete_stis_blocking_assign),mkt_del;"blocking-assignment added",Smedium,(self#make_insert_stis_blocking_assign),mkt_ins;"blocking-assignment modified",Smedium,(self#aggregate_changesis_blocking_assign),mkt_mod;(* non-blocking assignment *)"non-blocking-assignment removed",Smedium,(self#make_delete_stis_non_blocking_assign),mkt_del;"non-blocking-assignment added",Smedium,(self#make_insert_stis_non_blocking_assign),mkt_ins;"non-blocking-assignment modified",Smedium,(self#aggregate_changesis_non_blocking_assign),mkt_mod;(* if-statement *)"if-condition modified",Smedium,(self#aggregate_changesis_if_cond),mkt_mod;"then-branch deleted",Smedium,(self#make_deleteis_then_branch),mkt_del;"then-branch inserted",Smedium,(self#make_insertis_then_branch),mkt_ins;"then-branch removed",Smedium,(self#make_delete_stis_then_branch),mkt_del;"then-branch added",Smedium,(self#make_insert_stis_then_branch),mkt_ins;"else-branch deleted",Smedium,(self#make_deleteis_else_branch),mkt_del;"else-branch inserted",Smedium,(self#make_insertis_else_branch),mkt_ins;"else-branch removed",Smedium,(self#make_delete_stis_else_branch),mkt_del;"else-branch added",Smedium,(self#make_insert_stis_else_branch),mkt_ins;"case statement modified",Smedium,(self#aggregate_changesis_case),mkt_mod;"case-branch removed",Smedium,(self#make_delete_stis_case_item),mkt_del;"case-branch added",Smedium,(self#make_insert_stis_case_item),mkt_ins;"case-condition modified",Smedium,(self#aggregate_changesis_case_cond),mkt_mod;(* port *)"port direction removed",Smedium,(self#make_delete_stis_port_dir),mkt_del;"port direction added",Smedium,(self#make_insert_stis_port_dir),mkt_ins;"port direction modified",Smedium,(self#aggregate_changesis_port_dir),mkt_mod;"net type removed",Smedium,(self#make_delete_stis_net_type),mkt_del;"net type added",Smedium,(self#make_insert_stis_net_type),mkt_ins;"net type modified",Smedium,(self#aggregate_changesis_net_type),mkt_mod;"data type removed",Smedium,(self#make_delete_stis_data_type),mkt_del;"data type added",Smedium,(self#make_insert_stis_data_type),mkt_ins;"data type modified",Smedium,(self#aggregate_changesis_data_type),mkt_mod;"var data type removed",Smedium,(self#make_delete_stis_var_data_type),mkt_del;"var data type added",Smedium,(self#make_insert_stis_var_data_type),mkt_ins;"var data type modified",Smedium,(self#aggregate_changesis_var_data_type),mkt_mod;"signing removed",Smedium,(self#make_delete_stis_signing),mkt_del;"signing added",Smedium,(self#make_insert_stis_signing),mkt_ins;"signing modified",Smedium,(self#aggregate_changesis_signing),mkt_mod;"ranges removed",Smedium,(self#make_delete_stis_ranges),mkt_del;"ranges added",Smedium,(self#make_insert_stis_ranges),mkt_ins;"ranges modified",Smedium,(self#aggregate_changesis_ranges),mkt_mod;"variable dimensions removed",Smedium,(self#make_delete_stis_variable_dims),mkt_del;"variable dimensions added",Smedium,(self#make_insert_stis_variable_dims),mkt_ins;"variable dimensions modified",Smedium,(self#aggregate_changesis_variable_dims),mkt_mod;"number of ports changed",Smedium,(self#make_cardinality_changeis_port),mkt_chgcard;(* instantiation *)"instantiation removed",Smedium,(self#make_delete_stis_inst),mkt_del;"instantiation added",Smedium,(self#make_insert_stis_inst),mkt_ins;"instantiation modified",Smedium,(self#aggregate_changesis_inst),mkt_mod;(* initial-construct *)"initial-construct removed",Smedium,(self#make_delete_stis_initial_construct),mkt_del;"initial-construct added",Smedium,(self#make_insert_stis_initial_construct),mkt_ins;"initial-construct modified",Smedium,(self#aggregate_changesis_initial_construct),mkt_mod;(* final-construct *)"final-construct removed",Smedium,(self#make_delete_stis_final_construct),mkt_del;"final-construct added",Smedium,(self#make_insert_stis_final_construct),mkt_ins;"final-construct modified",Smedium,(self#aggregate_changesis_final_construct),mkt_mod;(* generate region *)"generate-region removed",Smedium,(self#make_delete_stis_generate_region),mkt_del;"generate-region added",Smedium,(self#make_insert_stis_generate_region),mkt_ins;"generate-region modified",Smedium,(self#aggregate_changesis_generate_region),mkt_mod;(* parameter *)"parameter port declaration removed",Smedium,(self#make_delete_stis_param_port_decl),mkt_del;"parameter port declaration added",Smedium,(self#make_insert_stis_param_port_decl),mkt_ins;"parameter port declaration modified",Smedium,(self#aggregate_changesis_param_port_decl),mkt_mod;"parameter assignment removed",Smedium,(self#make_delete_stis_param_assign),mkt_del;"parameter assignment added",Smedium,(self#make_insert_stis_param_assign),mkt_ins;"parameter assignment modified",Smedium,(self#aggregate_changesis_param_assign),mkt_mod;(* register *)"register removed",Smedium,(self#make_delete_stis_reg_decl),mkt_del;"register added",Smedium,(self#make_insert_stis_reg_decl),mkt_ins;"register modified",Smedium,(self#aggregate_changesis_reg_decl),mkt_mod;(* wire *)"wire removed",Smedium,(self#make_delete_stis_wire_decl),mkt_del;"wire added",Smedium,(self#make_insert_stis_wire_decl),mkt_ins;"wire modified",Smedium,(self#aggregate_changesis_wire_decl),mkt_mod;(* define-directive *)"define-directive removed",Smedium,(self#make_delete_stis_pp_define),mkt_del;"define-directive added",Smedium,(self#make_insert_stis_pp_define),mkt_ins;"define-directive modified",Smedium,(self#aggregate_changesis_pp_define),mkt_mod;(* include-directive *)"include-directive removed",Smedium,(self#make_delete_stis_pp_include),mkt_del;"include-directive added",Smedium,(self#make_insert_stis_pp_include),mkt_ins;"include-directive modified",Smedium,(self#aggregate_changesis_pp_include),mkt_mod;](* end of method make_changes_list *)end(* of class Change.F.c *)letextractoptionstree1tree2uidmappingedits=letchg=newcoptionstree1tree2uidmappingeditsget_unitget_desc1get_desc2inletres=chg#extractinchg#recover_edits;resend(* of functor Change.F *)