112854Sgabeblack@google.com/*****************************************************************************
212854Sgabeblack@google.com
312854Sgabeblack@google.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412854Sgabeblack@google.com  more contributor license agreements.  See the NOTICE file distributed
512854Sgabeblack@google.com  with this work for additional information regarding copyright ownership.
612854Sgabeblack@google.com  Accellera licenses this file to you under the Apache License, Version 2.0
712854Sgabeblack@google.com  (the "License"); you may not use this file except in compliance with the
812854Sgabeblack@google.com  License.  You may obtain a copy of the License at
912854Sgabeblack@google.com
1012854Sgabeblack@google.com    http://www.apache.org/licenses/LICENSE-2.0
1112854Sgabeblack@google.com
1212854Sgabeblack@google.com  Unless required by applicable law or agreed to in writing, software
1312854Sgabeblack@google.com  distributed under the License is distributed on an "AS IS" BASIS,
1412854Sgabeblack@google.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512854Sgabeblack@google.com  implied.  See the License for the specific language governing
1612854Sgabeblack@google.com  permissions and limitations under the License.
1712854Sgabeblack@google.com
1812854Sgabeblack@google.com *****************************************************************************/
1912854Sgabeblack@google.com
2012854Sgabeblack@google.com/*****************************************************************************
2112854Sgabeblack@google.com
2212854Sgabeblack@google.com  scfx_mant.cpp -
2312854Sgabeblack@google.com
2412854Sgabeblack@google.com  Original Author: Robert Graulich, Synopsys, Inc.
2512854Sgabeblack@google.com                   Martin Janssen,  Synopsys, Inc.
2612854Sgabeblack@google.com
2712854Sgabeblack@google.com *****************************************************************************/
2812854Sgabeblack@google.com
2912854Sgabeblack@google.com/*****************************************************************************
3012854Sgabeblack@google.com
3112854Sgabeblack@google.com  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3212854Sgabeblack@google.com  changes you are making here.
3312854Sgabeblack@google.com
3412854Sgabeblack@google.com      Name, Affiliation, Date:
3512854Sgabeblack@google.com  Description of Modification:
3612854Sgabeblack@google.com
3712854Sgabeblack@google.com *****************************************************************************/
3812854Sgabeblack@google.com
3912854Sgabeblack@google.com
4012854Sgabeblack@google.com// $Log: scfx_mant.cpp,v $
4112854Sgabeblack@google.com// Revision 1.1.1.1  2006/12/15 20:20:04  acg
4212854Sgabeblack@google.com// SystemC 2.3
4312854Sgabeblack@google.com//
4412854Sgabeblack@google.com// Revision 1.3  2006/01/13 18:53:58  acg
4512854Sgabeblack@google.com// Andy Goodrich: added $Log command so that CVS comments are reproduced in
4612854Sgabeblack@google.com// the source.
4712854Sgabeblack@google.com//
4812854Sgabeblack@google.com
4912854Sgabeblack@google.com#include "systemc/ext/dt/fx/scfx_mant.hh"
5012854Sgabeblack@google.com
5112854Sgabeblack@google.comnamespace sc_dt
5212854Sgabeblack@google.com{
5312854Sgabeblack@google.com
5412854Sgabeblack@google.com// ----------------------------------------------------------------------------
5512854Sgabeblack@google.com//  word memory management
5612854Sgabeblack@google.com// ----------------------------------------------------------------------------
5712854Sgabeblack@google.com
5812854Sgabeblack@google.comclass word_list // Entry in free_words bucket.
5912854Sgabeblack@google.com{
6012854Sgabeblack@google.com  public:
6112854Sgabeblack@google.com    word_list *m_next_p;
6212854Sgabeblack@google.com};
6312854Sgabeblack@google.com
6412854Sgabeblack@google.comstatic inline unsigned
6512854Sgabeblack@google.comnext_pow2_index(std::size_t size)
6612854Sgabeblack@google.com{
6712854Sgabeblack@google.com    unsigned index = scfx_find_msb(size);
6812854Sgabeblack@google.com    // If this was a power of 2 we are one bucket too low.
6912854Sgabeblack@google.com    if (~(UINT64_ONE << index) & size)
7012854Sgabeblack@google.com        index++;
7112854Sgabeblack@google.com    // If this is a 64-bit machine and we are using 32-bit words go down
7212854Sgabeblack@google.com    // one slot size, as all the slots are 2x in size.
7312854Sgabeblack@google.com    if (index != 0 && (sizeof(word_list) != sizeof(word))) {
7412854Sgabeblack@google.com        index -= 1;
7512854Sgabeblack@google.com    }
7612854Sgabeblack@google.com    return index;
7712854Sgabeblack@google.com}
7812854Sgabeblack@google.com
7912854Sgabeblack@google.comstatic word_list *free_words[32] = { 0 };
8012854Sgabeblack@google.com
8112854Sgabeblack@google.comword *
8212854Sgabeblack@google.comscfx_mant::alloc_word(std::size_t size)
8312854Sgabeblack@google.com{
8412854Sgabeblack@google.com    const int ALLOC_SIZE = 128;
8512854Sgabeblack@google.com
8612854Sgabeblack@google.com    unsigned slot_index = next_pow2_index(size);
8712854Sgabeblack@google.com    unsigned alloc_size = (UINT64_ONE << slot_index);
8812854Sgabeblack@google.com
8912854Sgabeblack@google.com    word_list*& slot = free_words[slot_index];
9012854Sgabeblack@google.com
9112854Sgabeblack@google.com    if (!slot) {
9212854Sgabeblack@google.com        slot = new word_list[ALLOC_SIZE * alloc_size];
9312854Sgabeblack@google.com        unsigned i;
9412854Sgabeblack@google.com        for (i = 0; i < alloc_size * (ALLOC_SIZE - 1) ; i += alloc_size) {
9512854Sgabeblack@google.com            slot[i].m_next_p = &slot[i + alloc_size];
9612854Sgabeblack@google.com        }
9712854Sgabeblack@google.com        slot[i].m_next_p = 0;
9812854Sgabeblack@google.com    }
9912854Sgabeblack@google.com
10012854Sgabeblack@google.com    word *result = (word *)slot;
10112854Sgabeblack@google.com    free_words[slot_index] = slot[0].m_next_p;
10212854Sgabeblack@google.com    return result;
10312854Sgabeblack@google.com}
10412854Sgabeblack@google.com
10512854Sgabeblack@google.comvoid
10612854Sgabeblack@google.comscfx_mant::free_word(word *array, std::size_t size)
10712854Sgabeblack@google.com{
10812854Sgabeblack@google.com    if (array && size) {
10912854Sgabeblack@google.com        int slot_index = next_pow2_index(size);
11012854Sgabeblack@google.com        word_list *wl_p = (word_list *)array;
11112854Sgabeblack@google.com
11212854Sgabeblack@google.com        wl_p->m_next_p = free_words[slot_index];
11312854Sgabeblack@google.com        free_words[slot_index] = wl_p;
11412854Sgabeblack@google.com    }
11512854Sgabeblack@google.com}
11612854Sgabeblack@google.com
11712854Sgabeblack@google.com} // namespace sc_dt
118