112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de/*****************************************************************************
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de  scfx_mant.cpp -
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Robert Graulich, Synopsys, Inc.
2512027Sjungma@eit.uni-kl.de                   Martin Janssen,  Synopsys, Inc.
2612027Sjungma@eit.uni-kl.de
2712027Sjungma@eit.uni-kl.de *****************************************************************************/
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de/*****************************************************************************
3012027Sjungma@eit.uni-kl.de
3112027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3212027Sjungma@eit.uni-kl.de  changes you are making here.
3312027Sjungma@eit.uni-kl.de
3412027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
3512027Sjungma@eit.uni-kl.de  Description of Modification:
3612027Sjungma@eit.uni-kl.de
3712027Sjungma@eit.uni-kl.de *****************************************************************************/
3812027Sjungma@eit.uni-kl.de
3912027Sjungma@eit.uni-kl.de
4012027Sjungma@eit.uni-kl.de// $Log: scfx_mant.cpp,v $
4112027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:04  acg
4212027Sjungma@eit.uni-kl.de// SystemC 2.3
4312027Sjungma@eit.uni-kl.de//
4412027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:53:58  acg
4512027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in
4612027Sjungma@eit.uni-kl.de// the source.
4712027Sjungma@eit.uni-kl.de//
4812027Sjungma@eit.uni-kl.de
4912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_mant.h"
5012027Sjungma@eit.uni-kl.de
5112027Sjungma@eit.uni-kl.de
5212027Sjungma@eit.uni-kl.denamespace sc_dt
5312027Sjungma@eit.uni-kl.de{
5412027Sjungma@eit.uni-kl.de
5512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
5612027Sjungma@eit.uni-kl.de//  word memory management
5712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
5812027Sjungma@eit.uni-kl.de
5912027Sjungma@eit.uni-kl.declass word_list { // Entry in free_words bucket.
6012027Sjungma@eit.uni-kl.de  public:
6112027Sjungma@eit.uni-kl.de    word_list* m_next_p;
6212027Sjungma@eit.uni-kl.de};
6312027Sjungma@eit.uni-kl.de
6412027Sjungma@eit.uni-kl.destatic inline
6512027Sjungma@eit.uni-kl.deint
6612027Sjungma@eit.uni-kl.denext_pow2_index( std::size_t size )
6712027Sjungma@eit.uni-kl.de{
6812027Sjungma@eit.uni-kl.de    int index = scfx_find_msb( size );
6912027Sjungma@eit.uni-kl.de    // If this was a power of 2 we are one bucket too low.
7012027Sjungma@eit.uni-kl.de    if( ~ (1 << index) & size ) index ++;
7112027Sjungma@eit.uni-kl.de    // If this is a 64-bit machine and we are using 32-bit words go down
7212027Sjungma@eit.uni-kl.de	// one slot size, as all the slots are 2x in size.
7312027Sjungma@eit.uni-kl.de    if ( index != 0 && ( sizeof(word_list) != sizeof(word) ) )
7412027Sjungma@eit.uni-kl.de	{
7512027Sjungma@eit.uni-kl.de		index -= 1;
7612027Sjungma@eit.uni-kl.de	}
7712027Sjungma@eit.uni-kl.de    return index;
7812027Sjungma@eit.uni-kl.de}
7912027Sjungma@eit.uni-kl.de
8012027Sjungma@eit.uni-kl.destatic word_list* free_words[32] = { 0 };
8112027Sjungma@eit.uni-kl.de
8212027Sjungma@eit.uni-kl.deword*
8312027Sjungma@eit.uni-kl.descfx_mant::alloc_word( std::size_t size )
8412027Sjungma@eit.uni-kl.de{
8512027Sjungma@eit.uni-kl.de    const int ALLOC_SIZE = 128;
8612027Sjungma@eit.uni-kl.de
8712027Sjungma@eit.uni-kl.de    int slot_index = next_pow2_index( size );
8812027Sjungma@eit.uni-kl.de
8912027Sjungma@eit.uni-kl.de    int alloc_size = ( 1 << slot_index );
9012027Sjungma@eit.uni-kl.de
9112027Sjungma@eit.uni-kl.de    word_list*& slot = free_words[slot_index];
9212027Sjungma@eit.uni-kl.de
9312027Sjungma@eit.uni-kl.de    if( ! slot )
9412027Sjungma@eit.uni-kl.de    {
9512027Sjungma@eit.uni-kl.de        slot = new word_list[ALLOC_SIZE * alloc_size];
9612027Sjungma@eit.uni-kl.de	int i;
9712027Sjungma@eit.uni-kl.de	for( i = 0; i < alloc_size*(ALLOC_SIZE-1) ; i+=alloc_size )
9812027Sjungma@eit.uni-kl.de	{
9912027Sjungma@eit.uni-kl.de	    slot[i].m_next_p = &slot[i+alloc_size];
10012027Sjungma@eit.uni-kl.de	}
10112027Sjungma@eit.uni-kl.de	slot[i].m_next_p = 0;
10212027Sjungma@eit.uni-kl.de    }
10312027Sjungma@eit.uni-kl.de
10412027Sjungma@eit.uni-kl.de    word* result = (word*)slot;
10512027Sjungma@eit.uni-kl.de    free_words[slot_index] = slot[0].m_next_p;
10612027Sjungma@eit.uni-kl.de    return result;
10712027Sjungma@eit.uni-kl.de}
10812027Sjungma@eit.uni-kl.de
10912027Sjungma@eit.uni-kl.devoid
11012027Sjungma@eit.uni-kl.descfx_mant::free_word( word* array, std::size_t size )
11112027Sjungma@eit.uni-kl.de{
11212027Sjungma@eit.uni-kl.de    if( array && size )
11312027Sjungma@eit.uni-kl.de    {
11412027Sjungma@eit.uni-kl.de        int slot_index = next_pow2_index( size );
11512027Sjungma@eit.uni-kl.de	word_list* wl_p = (word_list*)array;
11612027Sjungma@eit.uni-kl.de
11712027Sjungma@eit.uni-kl.de	wl_p->m_next_p = free_words[slot_index];
11812027Sjungma@eit.uni-kl.de	free_words[slot_index] = wl_p;
11912027Sjungma@eit.uni-kl.de    }
12012027Sjungma@eit.uni-kl.de}
12112027Sjungma@eit.uni-kl.de
12212027Sjungma@eit.uni-kl.de} // namespace sc_dt
12312027Sjungma@eit.uni-kl.de
12412027Sjungma@eit.uni-kl.de
12512027Sjungma@eit.uni-kl.de// Taf!
126