<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://www.verific.com/faq/index.php?action=history&amp;feed=atom&amp;title=Fanout_cone_and_grouping</id>
		<title>Fanout cone and grouping - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://www.verific.com/faq/index.php?action=history&amp;feed=atom&amp;title=Fanout_cone_and_grouping"/>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Fanout_cone_and_grouping&amp;action=history"/>
		<updated>2026-05-02T10:19:43Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.3</generator>

	<entry>
		<id>https://www.verific.com/faq/index.php?title=Fanout_cone_and_grouping&amp;diff=666&amp;oldid=prev</id>
		<title>Vince at 03:34, 19 April 2021</title>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Fanout_cone_and_grouping&amp;diff=666&amp;oldid=prev"/>
				<updated>2021-04-19T03:34:36Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 03:34, 19 April 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l68&quot; &gt;Line 68:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 68:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; }&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; // Now, let group the fan-out into a new netlist&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; // Now, let&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;'s &lt;/ins&gt;group the fan-out into a new netlist&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; // Netlist::Group(const Set &amp;amp;instances, const char *inst_name, const char *cell_name, const char *netlist_name)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; // Netlist::Group(const Set &amp;amp;instances, const char *inst_name, const char *cell_name, const char *netlist_name)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; top-&amp;gt;Group(group, &amp;quot;new_instance&amp;quot;, &amp;quot;new_cell&amp;quot;, &amp;quot;&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; top-&amp;gt;Group(group, &amp;quot;new_instance&amp;quot;, &amp;quot;new_cell&amp;quot;, &amp;quot;&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vince</name></author>	</entry>

	<entry>
		<id>https://www.verific.com/faq/index.php?title=Fanout_cone_and_grouping&amp;diff=546&amp;oldid=prev</id>
		<title>Hoa: Created page with &quot;C++ code:  &lt;nowiki&gt; /* This application example collects instances in the fanout cone of a signal, and groups those instances into a new netlist */  #include &quot;Set.h&quot; #include...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Fanout_cone_and_grouping&amp;diff=546&amp;oldid=prev"/>
				<updated>2020-08-24T22:25:23Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;C++ code:  &amp;lt;nowiki&amp;gt; ‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;This application example collects instances in the fanout cone of a signal, and groups those instances into a new netlist: &lt;/span&gt;  #include &amp;quot;Set.h&amp;quot; #include...&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;C++ code:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/* This application example collects instances in the fanout cone of a signal,&lt;br /&gt;
and groups those instances into a new netlist */&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;Set.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Array.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Message.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;veri_file.h&amp;quot;&lt;br /&gt;
#include &amp;quot;DataBase.h&amp;quot;&lt;br /&gt;
#include &amp;quot;VeriWrite.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#ifdef VERIFIC_NAMESPACE&lt;br /&gt;
using namespace Verific ;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    const char *file_name = &amp;quot;prep2.v&amp;quot;;&lt;br /&gt;
    const char *net_name = &amp;quot;compare_output&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    Array files(1) ;&lt;br /&gt;
    files.Insert(file_name) ;&lt;br /&gt;
    if (!veri_file::AnalyzeMultipleFiles(&amp;amp;files, veri_file::VERILOG_2K)) {&lt;br /&gt;
        return 1 ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const char *name = veri_file::TopModule() ;&lt;br /&gt;
&lt;br /&gt;
    if (!veri_file::Elaborate(name /*module_name*/, &amp;quot;work&amp;quot; /*work_lib*/, 0 /*parameter_values_map*/)) return 4 ;&lt;br /&gt;
&lt;br /&gt;
    // After elaboration, we can now delete the parse-trees (to conserve memory) since&lt;br /&gt;
    // we don't need them anymore.&lt;br /&gt;
    veri_file::RemoveAllModules() ;&lt;br /&gt;
&lt;br /&gt;
    Netlist *top = Netlist::PresentDesign() ;&lt;br /&gt;
    if (!top) {&lt;br /&gt;
        Message::PrintLine(&amp;quot;Cannot find any handle to the top-level netlist&amp;quot;) ;&lt;br /&gt;
        return 5 ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Message::Msg(VERIFIC_INFO, 0, top-&amp;gt;Linefile(), &amp;quot;last elaborated design is %s(%s)&amp;quot;,&lt;br /&gt;
                 top-&amp;gt;Owner()-&amp;gt;Name(), top-&amp;gt;Name()) ;&lt;br /&gt;
&lt;br /&gt;
    VeriWrite veriWriter;&lt;br /&gt;
    veriWriter.WriteFile(&amp;quot;netlist_out1.v&amp;quot;, top);&lt;br /&gt;
&lt;br /&gt;
    const Net *net = top-&amp;gt;GetNet(net_name);&lt;br /&gt;
    if (!net) {&lt;br /&gt;
        Message::Msg(VERIFIC_ERROR, 0, 0, &amp;quot;can't find net '%s'&amp;quot;, net_name);&lt;br /&gt;
        return 1 ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Set fanout(POINTER_HASH) ;&lt;br /&gt;
    top-&amp;gt;LabelFanOut (net, fanout, 0, 0, 0);&lt;br /&gt;
    SetIter si;&lt;br /&gt;
    DesignObj *designobj;&lt;br /&gt;
    Set group(POINTER_HASH) ;&lt;br /&gt;
    FOREACH_SET_ITEM (&amp;amp;fanout, si, &amp;amp;designobj) {&lt;br /&gt;
        if (designobj-&amp;gt;IsInstance()) {&lt;br /&gt;
            Message::Msg(VERIFIC_INFO, 0, 0, &amp;quot;&amp;gt;&amp;gt; instance '%s'&amp;quot;, designobj-&amp;gt;Name());&lt;br /&gt;
            // Insert it in the set that is used for grouping later&lt;br /&gt;
            group.Insert(designobj);&lt;br /&gt;
        } else { // Not an Instance, must be a Net&lt;br /&gt;
            Message::Msg(VERIFIC_INFO, 0, 0, &amp;quot;&amp;gt;&amp;gt; net '%s'&amp;quot;, designobj-&amp;gt;Name());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Now, let group the fan-out into a new netlist&lt;br /&gt;
    // Netlist::Group(const Set &amp;amp;instances, const char *inst_name, const char *cell_name, const char *netlist_name)&lt;br /&gt;
    top-&amp;gt;Group(group, &amp;quot;new_instance&amp;quot;, &amp;quot;new_cell&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
    veriWriter.WriteFile(&amp;quot;netlist_out2.v&amp;quot;, top);&lt;br /&gt;
&lt;br /&gt;
    return 0 ;&lt;br /&gt;
} &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perl script:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
# This application example collects instances in the fanout cone of a signal,&lt;br /&gt;
# and groups those instances into a new netlist.&lt;br /&gt;
&lt;br /&gt;
push (@INC,&amp;quot;../../../perlmain/install&amp;quot;);&lt;br /&gt;
require &amp;quot;Verific.pm&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$file_name = &amp;quot;prep2.v&amp;quot;;&lt;br /&gt;
$net_name = &amp;quot;compare_output&amp;quot;;&lt;br /&gt;
if (!Verific::veri_file::Analyze($file_name, $Verific::veri_file::VERILOG_2K)) {&lt;br /&gt;
    exit(1) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Ok now let's elaborate this module. In case of failure return.&lt;br /&gt;
if (!Verific::veri_file::ElaborateAll()) {&lt;br /&gt;
    exit(1) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# After elaboration, we can now delete the parse-trees (to conserve memory) since&lt;br /&gt;
# we don't need them anymore.&lt;br /&gt;
Verific::veri_file::RemoveAllModules() ;&lt;br /&gt;
&lt;br /&gt;
# Get a handle to the top-level netlist&lt;br /&gt;
$top = Verific::Netlist::PresentDesign() ;&lt;br /&gt;
if (!$top) {&lt;br /&gt;
    print &amp;quot;Cannot find any handle to the top-level netlist\n&amp;quot;;&lt;br /&gt;
    exit(1) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Print out module that we have handle to&lt;br /&gt;
vfcprintf(&amp;quot;INFO: last elaborated design is %s(%s)&amp;quot;,$top-&amp;gt;Linefile(),$top-&amp;gt;Owner()-&amp;gt;Name(), $top-&amp;gt;Name());&lt;br /&gt;
&lt;br /&gt;
$veriWriter = Verific::VeriWrite-&amp;gt;new();&lt;br /&gt;
$veriWriter-&amp;gt;WriteFile(&amp;quot;netlist1.v&amp;quot;, $top) ;&lt;br /&gt;
&lt;br /&gt;
my $net = $top-&amp;gt;GetNet($net_name);&lt;br /&gt;
if (!$net) {&lt;br /&gt;
    print &amp;quot;Cannot find net $net_name&amp;quot;;&lt;br /&gt;
    exit(1) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
my $fanout = Verific::Set::New();&lt;br /&gt;
$top-&amp;gt;LabelFanOut($net, $fanout, 0, 0, 0);&lt;br /&gt;
&lt;br /&gt;
my $group = Verific::Set::New();&lt;br /&gt;
$fanout_iter = new Verific::DesignObjSetIter($fanout);&lt;br /&gt;
if ($fanout_iter) {&lt;br /&gt;
    for ($designobj = $fanout_iter-&amp;gt;First(); $fanout_iter-&amp;gt;GetIndex() &amp;lt; $fanout_iter-&amp;gt;Size(); $designobj = $fanout_iter-&amp;gt;Next()) {&lt;br /&gt;
        if ($designobj-&amp;gt;IsInstance()) {&lt;br /&gt;
            vfcprintf(&amp;quot;INFO: instance %s&amp;quot;, undef, $designobj-&amp;gt;Name());&lt;br /&gt;
            # insert the instance in a set that will be used later to create a new level of hierarchy&lt;br /&gt;
            $group-&amp;gt;Insert($designobj);&lt;br /&gt;
        } else {&lt;br /&gt;
            vfcprintf(&amp;quot;INFO: net %s&amp;quot;, undef, $designobj-&amp;gt;Name());&lt;br /&gt;
        }&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Group the fanout into a new level of hierarchy&lt;br /&gt;
$top-&amp;gt;Group($group, &amp;quot;new_instance&amp;quot;, &amp;quot;new_cell&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
$veriWriter-&amp;gt;WriteFile(&amp;quot;netlist2.v&amp;quot;, $top) ;&lt;br /&gt;
&lt;br /&gt;
exit(0) ;&lt;br /&gt;
&lt;br /&gt;
# moved this to a subroutine to keep above code clean,&lt;br /&gt;
# this subroutine shows how to resolve linefile information&lt;br /&gt;
sub vfcprintf {&lt;br /&gt;
   my ($format) = (@_[0]);&lt;br /&gt;
   my ($lf) = (@_[1]);&lt;br /&gt;
   my @PARAMS;&lt;br /&gt;
   for (my $i = 2; $i &amp;lt; scalar(@_); $i++) {&lt;br /&gt;
       push(@PARAMS,&amp;quot;@_[$i]&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
   my $lf_format = &amp;quot;&amp;quot;;&lt;br /&gt;
   if (Verific::LineFile::GetFileName($lf) &amp;amp;&amp;amp; Verific::LineFile::GetLineNo($lf)) {&lt;br /&gt;
       my $lf_format = sprintf(&amp;quot;%s(%s)&amp;quot;,Verific::LineFile::GetFileName($lf), Verific::LineFile::GetLineNo($lf));&lt;br /&gt;
       printf &amp;quot;%s: $format\n&amp;quot;,$lf_format,@PARAMS;&lt;br /&gt;
   } else {&lt;br /&gt;
       printf &amp;quot;$format\n&amp;quot;,@PARAMS;&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verilog testcase, prep2.v:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// PREP Benchmark 2, Timer/Counter&lt;br /&gt;
&lt;br /&gt;
/* PREP2 contains 8 bit registers, a mux, counter and comparator&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 1994 Synplicity, Inc.&lt;br /&gt;
You may distribute freely, as long as this header remains attached. */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
module prep2(DATA0, CLK, RST, SEL, LDCOMP, LDPRE, DATA1, DATA2);&lt;br /&gt;
output [7:0] DATA0;&lt;br /&gt;
input CLK, RST, SEL, LDCOMP, LDPRE;&lt;br /&gt;
input [7:0] DATA1, DATA2;&lt;br /&gt;
reg [7:0] DATA0;&lt;br /&gt;
reg [7:0] highreg_output, lowreg_output; // internal registers&lt;br /&gt;
&lt;br /&gt;
wire compare_output =    DATA0 == lowreg_output;  // comparator&lt;br /&gt;
wire [7:0]  mux_output =    SEL ? DATA1 : highreg_output;  // mux&lt;br /&gt;
&lt;br /&gt;
// registers&lt;br /&gt;
always @ (posedge CLK  or posedge RST)&lt;br /&gt;
begin&lt;br /&gt;
	if (RST) begin&lt;br /&gt;
		highreg_output = 0;&lt;br /&gt;
		lowreg_output = 0;&lt;br /&gt;
	end else begin&lt;br /&gt;
		if (LDPRE)&lt;br /&gt;
			highreg_output = DATA2;&lt;br /&gt;
		if (LDCOMP)&lt;br /&gt;
			lowreg_output  = DATA2;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
// counter&lt;br /&gt;
always @(posedge CLK or posedge RST)&lt;br /&gt;
begin&lt;br /&gt;
	if (RST)&lt;br /&gt;
		DATA0 = 0;&lt;br /&gt;
	else if (compare_output)  // load&lt;br /&gt;
		DATA0 = mux_output;&lt;br /&gt;
	else&lt;br /&gt;
		DATA0 = DATA0 + 1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
 &amp;lt;./nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hoa</name></author>	</entry>

	</feed>