
// This file is part of the Coriolis Project.
// Copyright (C) Laboratoire LIP6 - Departement ASIM
// Universite Pierre et Marie Curie
//
// Main contributors :
//        Christophe Alexandre   <Christophe.Alexandre@lip6.fr>
//        Sophie Belloeil             <Sophie.Belloeil@lip6.fr>
//        Hugo Clément                   <Hugo.Clement@lip6.fr>
//        Jean-Paul Chaput           <Jean-Paul.Chaput@lip6.fr>
//        Damien Dupuis                 <Damien.Dupuis@lip6.fr>
//        Christian Masson           <Christian.Masson@lip6.fr>
//        Marek Sroka                     <Marek.Sroka@lip6.fr>
// 
// The Coriolis Project  is free software;  you can  redistribute it and/or
// modify  it  under the  terms  of  the  GNU  General  Public License  as
// published by  the Free  Software Foundation; either  version 2  of  the
// License, or (at your option) any later version.
// 
// The Coriolis Project  is distributed in the hope that it will be useful,
// but  WITHOUT  ANY  WARRANTY;  without  even  the  implied  warranty  of
// MERCHANTABILITY  or  FITNESS  FOR A  PARTICULAR PURPOSE.   See  the GNU
// General Public License for more details.
// 
// You should have received a copy  of  the  GNU  General  Public  License
// along with  the Coriolis Project;  if  not,  write to the  Free Software
// Foundation, inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
//
// License-Tag
//
// Date   : 19/07/2006
// Author : Christophe Alexandre  <Christophe.Alexandre@lip6.fr>
//
// Authors-Tag 
#ifndef __SUBROW_H
#define __SUBROW_H

#include "mauka/Container.h"
#include "mauka/Bin.h"

namespace Mauka {

using Hurricane::DbU;
using Hurricane::Box;
using Hurricane::Cell;
using Hurricane::Instance;

class Surface;
class Row;
    
// ****************************************************************************************************
// SubRow declaration
// ****************************************************************************************************

class SubRow : public Container {
// *************************
    friend class Surface;
    friend class Bin;
    friend class Row;
    friend class BBPlacer;
// Types
// *****
    public: typedef Container Inherit;
    public: typedef std::vector<Bin*> BinVector;
    public: typedef std::map<double, unsigned> BinXMax;
    public: typedef std::vector<Instance*> InstanceVector; // for bbplacer
            
// Attributes
// **********
    private: Surface* _surface;
    private: Row* _row;
    private: BinVector _binVector;
    private: BinXMax _binXMax;
    private: DbU::Unit _size; // sum of the bins size
    private: DbU::Unit _capa; // ideal occupation of the subrow

// Constructors
// ************
    protected: SubRow(Cell* cell, Surface* surface, const Box& box);
    public: static SubRow* create(Cell* cell, Surface* surface, const Box& box, bool orientation);

// Accessors
// *********
    public: virtual Cell* getCell() const;
    public: Row* getRow() { return _row; } 
    public: Surface* getSurface() { return _surface; }
    public: DbU::Unit getCapa() const { return _capa; }
    public: DbU::Unit getSize() const { return _size; }
    public: DbU::Unit getCapaVsSize() const { return (_capa - _size);}
    public: DbU::Unit getWidthVsSize() const { return (getWidth() - _size);}
    public: Bin* getBinBetween(DbU::Unit lowerX, DbU::Unit upperX, const Bin* srcbin);

// Updators
// ********
    private: void _AddSize(DbU::Unit value);

// Others
// ******
    private: void _computeCapacity(double margin);
    private: bool _MergeBins();
    public: void DisplayBinHits() const;
    protected: virtual void _postCreate(bool orientation);
    protected: virtual void _preDestroy();
    public: double getBinCost() const;
    public: DbU::Unit getBinsSize() const;
    public: DbU::Unit getBinsCapa() const;
    public: double getCost() const;
    public: virtual std::string _getTypeName() const {return "SubRow";};
};

}

#endif // __SUBROW_H
