1815{
1816 Vec_Int_t * vBox2Obj = Vec_IntStart( Prs_NtkBoxNum(pNtk) );
1818 int i, k, iObj, iTerm, iFon, FormId, ActId, RangeId, NameId, Type;
1819
1820 Cba_NtkCleanMap(
p );
1822 Cba_NtkSetMap(
p, Cba_ObjName(
p, iObj), Cba_ObjFon0(
p, iObj) );
1823
1824
1826 Cba_NtkSetMap(
p, NameId, -RangeId );
1828 Cba_NtkSetMap(
p, NameId, -RangeId );
1829
1830
1832 if ( vAllRams )
1834 {
1835 char * pRamName = (char *)Vec_PtrEntry( vRam, 0 );
1836 int MemSize = Abc_Ptr2Int( (char *)Vec_PtrEntry( vRam, 1 ) );
1837
1838
1839 NameId = Cba_NtkNewStrId(
p,
"%s_box", pRamName );
1840
1842 Cba_ObjSetName(
p, iObj, NameId );
1843 iFon = Cba_ObjFon0(
p, iObj);
1844 NameId = Cba_NtkNewStrId(
p, pRamName );
1845 Cba_FonSetName(
p, iFon, NameId );
1847 assert( Cba_FonLeft(
p, iFon) <= MemSize-1 );
1848 assert( Cba_FonRight(
p, iFon) == 0 );
1849
1850
1852 {
1854 int Line = Vec_IntPop( vBox );
1855 Vec_IntWriteEntry( vBox2Obj, Line, iObjNew );
1856 if ( Prs_BoxName(pNtk, Line) )
1857 Cba_ObjSetName(
p, iObjNew, Prs_BoxName(pNtk, Line) );
1858
1859
1860 iFon = Cba_ObjFon0(
p, iObjNew);
1861 Cba_FonSetRange(
p, iFon, Cba_NtkHashRange(
p, MemSize-1, 0) );
1862
1863
1864 NameId = Cba_NtkNewStrId(
p,
"%s_wp%d", pRamName, k-2 );
1865 Cba_FonSetName(
p, iFon, NameId );
1866 Cba_NtkSetMap(
p, NameId, iFon );
1867
1868 Cba_ObjSetFinFon(
p, iObj, (k++)-2, iFon );
1869 Vec_IntFree( vBox );
1870 }
1871 Vec_PtrFree( vRam );
1872 }
1873 Vec_PtrFreeP( &vAllRams );
1874
1875
1876 Vec_IntClear( &
p->vArray0 );
1878 {
1879 if ( Prs_BoxIsNode(pNtk, i) )
1880 {
1881 Type = Prs_BoxNtk(pNtk, i);
1884 }
1885 else
1886 {
1887 Cba_Ntk_t * pBox = NULL;
int nInputs, nOutputs = 1;
1888 char ** pOutNames = NULL, * pNtkName = Prs_NtkStr(pNtk, Prs_BoxNtk(pNtk, i));
1889 Type = Prs_ManFindType( pNtkName, &nInputs, 1, &pOutNames );
1891 continue;
1893 {
1894 pBox = Cba_ManNtkFind(
p->pDesign, pNtkName );
1895 if ( pBox == NULL )
1896 {
1897 printf( "Fatal error: Cannot find module \"%s\".\n", pNtkName );
1898 continue;
1899 }
1900 nInputs = Cba_NtkPiNum(pBox);
1901 nOutputs = Cba_NtkPoNum(pBox);
1902 }
1904 nOutputs = 2;
1906 {
1908 nInputs = 1 + (1 << atoi(pNtkName+
strlen(
"wide_mux_")));
1910 nInputs = 1 + (1 << atoi(pNtkName+
strlen(
"Mux_")));
1912 }
1914 {
1915 if ( !
strncmp(pNtkName,
"wide_select_",
strlen(
"wide_select_")) )
1916 nInputs = 1 + atoi(pNtkName+
strlen(
"wide_select_"));
1917 else if ( !
strncmp(pNtkName,
"Select_",
strlen(
"Select_")) )
1918 nInputs = 1 + atoi(pNtkName+
strlen(
"Select_"));
1920 }
1923
1924 iObj = Cba_ObjAlloc(
p, (
Cba_ObjType_t)Type, nInputs, nOutputs );
1925 if ( pBox ) Cba_ObjSetFunc(
p, iObj, Cba_NtkId(pBox) );
1926
1927 Cba_NtkCleanMap2(
p );
1928 if ( pBox )
1930 Cba_NtkSetMap2(
p, Cba_ObjName(pBox, iTerm), k+1 );
1931 else
1932 for ( k = 0; k < nOutputs; k++ )
1933 Cba_NtkSetMap2(
p, Cba_NtkStrId(
p, pOutNames[k]), k+1 );
1934
1936 if ( Cba_NtkGetMap2(
p, FormId) )
1937 {
1938 iFon = Cba_ObjFon(
p, iObj, Cba_NtkGetMap2(
p, FormId)-1);
1940 }
1941 }
1942 Vec_IntWriteEntry( vBox2Obj, i, iObj );
1943 if ( Prs_BoxName(pNtk, i) )
1944 Cba_ObjSetName(
p, iObj, Prs_BoxName(pNtk, i) );
1945
1946 }
1947
1948
1949 if ( Vec_IntSize(&
p->vArray0) )
1950 {
1951 int Prev = -1, Index = 0;
1952 Vec_IntSortMulti( &
p->vArray0, 3, 0 );
1954 {
1955 if ( Prev != -1 && Prev != NameId )
1957 Prev = NameId;
1958 }
1960
1961 }
1962
1963
1965 {
1966 iObj = Vec_IntEntry( vBox2Obj, i );
1967 if ( Prs_BoxIsNode(pNtk, i) )
1968 {
1969 Type = Prs_BoxNtk(pNtk, i);
1971 {
1973 if ( iFon )
1974 Cba_ObjSetFinFon(
p, iObj, k/2-1, iFon );
1975 }
1976 }
1977 else
1978 {
1979 int nInputs = -1;
1980 char ** pInNames = NULL, * pNtkName = Prs_NtkStr(pNtk, Prs_BoxNtk(pNtk, i));
1981 Type = Prs_ManFindType( pNtkName, &nInputs, 0, &pInNames );
1983 {
1984 int IndexSet = -1, IndexRst = -1, iBitSet = -1, iBitRst = -1;
1986 if ( Status )
1987 {
1988 Vec_IntWriteEntry( vBox, IndexSet, iBitSet );
1989 Vec_IntWriteEntry( vBox, IndexRst, iBitRst );
1990
1991 }
1992 else
1993 {
1994 int w, Width = atoi( pNtkName +
strlen(Type ==
CBA_BOX_DFFRS ?
"wide_dffrs_" :
"wide_latchrs_") );
1996
1998 Cba_NtkCleanMap2(
p );
1999 for ( k = 0; k < nInputs; k++ )
2000 Cba_NtkSetMap2(
p, Cba_NtkStrId(
p, pInNames[k]), k+1 );
2001
2002 for ( w = 0; w < Width; w++ )
2003 {
2004
2006 if ( Prs_BoxName(pNtk, i) )
2007 {
2008 NameId = Cba_NtkNewStrId(
p,
"%s[%d]", Prs_NtkStr(pNtk, Prs_BoxName(pNtk, i)), w );
2009 Cba_ObjSetName(
p, iObjNew, NameId );
2010 }
2011
2012
2013 iFon = Cba_ObjFon0(
p, iObjNew);
2014 {
2015 NameId = Cba_NtkNewStrId(
p,
"%s[%d]", Cba_FonNameStr(
p, Cba_ObjFon0(
p, iObj)), w );
2016 Cba_FonSetName(
p, iFon, NameId );
2017 }
2018
2019
2020
2021 Cba_ObjSetFinFon(
p, iObj, Width-1-w, iFon );
2022
2024 if ( Cba_NtkGetMap2(
p, FormId) )
2025 {
2026 int Index = Cba_NtkGetMap2(
p, FormId)-1;
2028
2029 if ( Index < 3 )
2031 Cba_ObjSetFinFon(
p, iObjNew, Index, iFon );
2032 }
2033 }
2034 continue;
2035 }
2036 }
2037 assert( Type == Cba_ObjType(
p, iObj) );
2038
2039
2040 Cba_NtkCleanMap2(
p );
2042 {
2044 assert( Cba_NtkPiNum(pBox) == Cba_ObjFinNum(
p, iObj) );
2045 assert( Cba_NtkPoNum(pBox) == Cba_ObjFonNum(
p, iObj) );
2047 Cba_NtkSetMap2(
p, Cba_ObjName(pBox, iTerm), k+1 );
2048 }
2049 else
2050 {
2052 for ( k = 0; k < nInputs; k++ )
2053 Cba_NtkSetMap2(
p, Cba_NtkStrId(
p, pInNames[k]), k+1 );
2054 }
2055
2057 if ( Cba_NtkGetMap2(
p, FormId) )
2058 {
2059 int Index = Cba_NtkGetMap2(
p, FormId)-1;
2060 int nBits = Cba_ObjFinNum(
p, iObj);
2063 if ( iFon )
2064 Cba_ObjSetFinFon(
p, iObj, Index, iFon );
2065 }
2066
2068 {
2069 int FonCat = Cba_ObjFinFon(
p, iObj, 1 );
2070 int nBits = Cba_FonRangeSize(
p, FonCat );
2071 int nParts = Cba_ObjFinNum(
p, iObj) - 1;
2072 int Slice = nBits / nParts;
2073 int nFins = Cba_ObjFinNum(
p, iObj);
2074 assert( Cba_ObjFinNum(
p, iObj) >= 2 );
2075 assert( Slice * nParts == nBits );
2076 assert( nFins == 1 + nParts );
2077 Cba_ObjCleanFinFon(
p, iObj, 1 );
2078
2079 if ( FonCat < 0 )
2080 {
2082 Cba_ObjSetFinFon(
p, iObjNew, 0, FonCat );
2083 FonCat = Cba_ObjFon0(
p, iObjNew );
2084 NameId = Cba_NtkNewStrId(
p,
"_buf_const_%d", iObjNew );
2085 Cba_FonSetName(
p, FonCat, NameId );
2086 Cba_FonSetRange(
p, FonCat, Cba_NtkHashRange(
p, nBits-1, 0) );
2087 }
2088 for ( k = 0; k < nParts; k++ )
2089 {
2090
2091 iFon =
Prs_CreateSlice(
p, FonCat, pNtk, Cba_NtkHashRange(
p, k*Slice+Slice-1, k*Slice) );
2092 Cba_ObjSetFinFon(
p, iObj, k+1, iFon );
2093 }
2094 }
2095 }
2096
2097 if ( Type ==
CBA_BOX_ADD && Cba_ObjFinFon(
p, iObj, 0) == 0 )
2098 Cba_ObjSetFinFon(
p, iObj, 0, Cba_FonFromConst(1) );
2099
2101 Cba_ObjSetFinFon(
p, iObj, 1, Cba_FonFromConst(1) );
2103 Cba_ObjSetFinFon(
p, iObj, 2, Cba_FonFromConst(1) );
2104 }
2105 Vec_IntFree( vBox2Obj );
2106
2108 {
2109 iObj = Cba_NtkPo(
p, i );
2110 assert( NameId == Cba_ObjName(
p, iObj) );
2112 if ( !iFon )
2113 continue;
2114 Cba_ObjSetFinFon(
p, iObj, 0, iFon );
2115 if ( RangeId )
2116 {
2117 assert( Cba_NtkRangeLeft(
p, Abc_Lit2Var(RangeId)) == Cba_FonLeft(
p, iFon) );
2118 assert( Cba_NtkRangeRight(
p, Abc_Lit2Var(RangeId)) == Cba_FonRight(
p, iFon) );
2119 }
2120 }
2121 return 0;
2122}
int Prs_CreateFlopSetReset(Cba_Ntk_t *p, Prs_Ntk_t *pNtk, Vec_Int_t *vBox, int *pIndexSet, int *pIndexRst, int *pBitSet, int *pBitRst)
Vec_Ptr_t * Prs_CreateDetectRams(Prs_Ntk_t *pNtk)
void Prs_CreateOutConcat(Cba_Ntk_t *p, int *pSlices, int nSlices)
void Prs_CreateSignalOut(Cba_Ntk_t *p, int iFon, Prs_Ntk_t *pNtk, int Sig)
Cba_ObjType_t
INCLUDES ///.
#define Cba_NtkForEachPo(p, iObj, i)
#define Cba_NtkForEachPi(p, iObj, i)
#define Vec_IntForEachEntryTwo(vVec1, vVec2, Entry1, Entry2, i)
#define Vec_IntForEachEntryTriple(vVec, Entry1, Entry2, Entry3, i)
#define Vec_IntForEachEntryDoubleStart(vVec, Entry1, Entry2, i, Start)
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)