@@ -1866,6 +1866,72 @@ void Gia_ManDumpIoList( Gia_Man_t * p, FILE * pFile, int fOuts, int fReverse )
18661866 Vec_IntFree ( vArray );
18671867 }
18681868}
1869+ static Vec_Bit_t * Gia_ManCollectMultiBits ( Vec_Ptr_t * vNames , int n )
1870+ {
1871+ Vec_Bit_t * vBits = Vec_BitStart ( n );
1872+ if ( n == 0 )
1873+ return vBits ;
1874+ if ( vNames == NULL )
1875+ {
1876+ if ( n > 1 )
1877+ {
1878+ int i ;
1879+ for ( i = 0 ; i < n ; i ++ )
1880+ Vec_BitWriteEntry ( vBits , i , 1 );
1881+ }
1882+ return vBits ;
1883+ }
1884+ {
1885+ Vec_Int_t * vArray = Gia_ManCountSymbsAll ( vNames );
1886+ int iName , Size , i ;
1887+ int nNames = Vec_PtrSize ( vNames );
1888+ Vec_IntForEachEntryDouble ( vArray , iName , Size , i )
1889+ {
1890+ int iNameNext = Vec_IntSize (vArray ) > i + 2 ? Vec_IntEntry (vArray , i + 2 ) : nNames ;
1891+ int k ;
1892+ if ( iNameNext - iName <= 1 )
1893+ continue ;
1894+ for ( k = iName ; k < iNameNext && k < n ; k ++ )
1895+ Vec_BitWriteEntry ( vBits , k , 1 );
1896+ }
1897+ Vec_IntFree ( vArray );
1898+ }
1899+ return vBits ;
1900+ }
1901+ static int Gia_ManDumpIoListMulti ( Gia_Man_t * p , FILE * pFile , int fOuts , int fReverse )
1902+ {
1903+ Vec_Ptr_t * vNames = fOuts ? p -> vNamesOut : p -> vNamesIn ;
1904+ int nNames = vNames ? Vec_PtrSize (vNames ) : (fOuts ? Gia_ManCoNum (p ) : Gia_ManCiNum (p ));
1905+ if ( vNames == NULL )
1906+ {
1907+ if ( nNames > 1 )
1908+ {
1909+ fprintf ( pFile , "_%c_" , fOuts ? 'o' : 'i' );
1910+ return 1 ;
1911+ }
1912+ return 0 ;
1913+ }
1914+ {
1915+ Vec_Int_t * vArray = Gia_ManCountSymbsAll ( vNames );
1916+ int nGroups = Vec_IntSize (vArray ) / 2 ;
1917+ int idx , fFirst = 1 ;
1918+ for ( idx = 0 ; idx < nGroups ; idx ++ )
1919+ {
1920+ int g = fReverse ? (nGroups - 1 - idx ) : idx ;
1921+ int iName = Vec_IntEntry (vArray , 2 * g );
1922+ int Size = Vec_IntEntry (vArray , 2 * g + 1 );
1923+ int iNameNext = (g + 1 < nGroups ) ? Vec_IntEntry (vArray , 2 * (g + 1 )) : nNames ;
1924+ if ( iNameNext - iName <= 1 )
1925+ continue ;
1926+ if ( !fFirst )
1927+ fprintf ( pFile , ", " );
1928+ Gia_ManPrintOneName ( pFile , (char * )Vec_PtrEntry (vNames , iName ), Size );
1929+ fFirst = 0 ;
1930+ }
1931+ Vec_IntFree ( vArray );
1932+ return !fFirst ;
1933+ }
1934+ }
18691935void Gia_ManDumpIoRanges ( Gia_Man_t * p , FILE * pFile , int fOuts )
18701936{
18711937 Vec_Ptr_t * vNames = fOuts ? p -> vNamesOut : p -> vNamesIn ;
@@ -1943,17 +2009,30 @@ void Gia_ManDumpInterface( Gia_Man_t * p, char * pFileName )
19432009 Gia_ManWriteNames ( pFile , 'z' , Gia_ManPoNum (p ), p -> vNamesOut , 9 , 4 , NULL , 0 );
19442010 fprintf ( pFile , ";\n\n" );
19452011
1946- fprintf ( pFile , " assign { " );
1947- Gia_ManWriteNames ( pFile , 'x' , Gia_ManCiNum (p ), p -> vNamesIn , 8 , 4 , NULL , 1 );
1948- fprintf ( pFile , " } = { " );
1949- Gia_ManDumpIoList ( p , pFile , 0 , 1 );
1950- fprintf ( pFile , " };\n\n" );
1951-
1952- fprintf ( pFile , " assign { " );
1953- Gia_ManDumpIoList ( p , pFile , 1 , 1 );
1954- fprintf ( pFile , " } = { " );
1955- Gia_ManWriteNames ( pFile , 'z' , Gia_ManCoNum (p ), p -> vNamesOut , 9 , 4 , NULL , 1 );
1956- fprintf ( pFile , " };\n\n" );
2012+ {
2013+ Vec_Bit_t * vMultiIn = Gia_ManCollectMultiBits ( p -> vNamesIn , Gia_ManCiNum (p ) );
2014+ Vec_Bit_t * vMultiOut = Gia_ManCollectMultiBits ( p -> vNamesOut , Gia_ManCoNum (p ) );
2015+ int fHasMultiIn = Vec_BitCount ( vMultiIn );
2016+ int fHasMultiOut = Vec_BitCount ( vMultiOut );
2017+ if ( fHasMultiIn )
2018+ {
2019+ fprintf ( pFile , " assign { " );
2020+ Gia_ManWriteNames ( pFile , 'x' , Gia_ManCiNum (p ), p -> vNamesIn , 8 , 4 , vMultiIn , 1 );
2021+ fprintf ( pFile , " } = { " );
2022+ Gia_ManDumpIoListMulti ( p , pFile , 0 , 1 );
2023+ fprintf ( pFile , " };\n\n" );
2024+ }
2025+ if ( fHasMultiOut )
2026+ {
2027+ fprintf ( pFile , " assign { " );
2028+ Gia_ManDumpIoListMulti ( p , pFile , 1 , 1 );
2029+ fprintf ( pFile , " } = { " );
2030+ Gia_ManWriteNames ( pFile , 'z' , Gia_ManCoNum (p ), p -> vNamesOut , 9 , 4 , vMultiOut , 1 );
2031+ fprintf ( pFile , " };\n\n" );
2032+ }
2033+ Vec_BitFree ( vMultiIn );
2034+ Vec_BitFree ( vMultiOut );
2035+ }
19572036
19582037 if ( Vec_BitCount (vUsed ) )
19592038 {
@@ -2054,17 +2133,30 @@ void Gia_ManDumpInterfaceAssign( Gia_Man_t * p, char * pFileName )
20542133 Gia_ManWriteNames ( pFile , 'z' , Gia_ManPoNum (p ), p -> vNamesOut , 9 , 4 , NULL , 0 );
20552134 fprintf ( pFile , ";\n\n" );
20562135
2057- fprintf ( pFile , " assign { " );
2058- Gia_ManWriteNames ( pFile , 'x' , Gia_ManCiNum (p ), p -> vNamesIn , 8 , 4 , NULL , 1 );
2059- fprintf ( pFile , " } = { " );
2060- Gia_ManDumpIoList ( p , pFile , 0 , 1 );
2061- fprintf ( pFile , " };\n\n" );
2062-
2063- fprintf ( pFile , " assign { " );
2064- Gia_ManDumpIoList ( p , pFile , 1 , 1 );
2065- fprintf ( pFile , " } = { " );
2066- Gia_ManWriteNames ( pFile , 'z' , Gia_ManCoNum (p ), p -> vNamesOut , 9 , 4 , NULL , 1 );
2067- fprintf ( pFile , " };\n\n" );
2136+ {
2137+ Vec_Bit_t * vMultiIn = Gia_ManCollectMultiBits ( p -> vNamesIn , Gia_ManCiNum (p ) );
2138+ Vec_Bit_t * vMultiOut = Gia_ManCollectMultiBits ( p -> vNamesOut , Gia_ManCoNum (p ) );
2139+ int fHasMultiIn = Vec_BitCount ( vMultiIn );
2140+ int fHasMultiOut = Vec_BitCount ( vMultiOut );
2141+ if ( fHasMultiIn )
2142+ {
2143+ fprintf ( pFile , " assign { " );
2144+ Gia_ManWriteNames ( pFile , 'x' , Gia_ManCiNum (p ), p -> vNamesIn , 8 , 4 , vMultiIn , 1 );
2145+ fprintf ( pFile , " } = { " );
2146+ Gia_ManDumpIoListMulti ( p , pFile , 0 , 1 );
2147+ fprintf ( pFile , " };\n\n" );
2148+ }
2149+ if ( fHasMultiOut )
2150+ {
2151+ fprintf ( pFile , " assign { " );
2152+ Gia_ManDumpIoListMulti ( p , pFile , 1 , 1 );
2153+ fprintf ( pFile , " } = { " );
2154+ Gia_ManWriteNames ( pFile , 'z' , Gia_ManCoNum (p ), p -> vNamesOut , 9 , 4 , vMultiOut , 1 );
2155+ fprintf ( pFile , " };\n\n" );
2156+ }
2157+ Vec_BitFree ( vMultiIn );
2158+ Vec_BitFree ( vMultiOut );
2159+ }
20682160
20692161 if ( Vec_BitCount (vUsed ) )
20702162 {
0 commit comments