/*
 Copyright 2019 Alain Dargelas
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
 http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

/* 
 * File:   ClockingBlock.h
 * Author: alain
 *
 * Created on May 26, 2018, 11:07 AM
 */

#ifndef CLOCKINGBLOCK_H
#define CLOCKINGBLOCK_H

#include <vector>

namespace SURELOG {


class ClockingBlock {
public:
    ClockingBlock(FileContent* fileContent, NodeId blockId, NodeId clockingBlockId) : 
       m_fileContent(fileContent), m_blockId(blockId),  m_clockingBlockId(clockingBlockId) {}
       void addSignal(Signal& signal) { m_signals.push_back(signal); }
    NodeId getNodeId() { return m_blockId; }
    virtual ~ClockingBlock();
    std::vector<Signal>& getAllSignals() { return m_signals; }
private:
    FileContent* m_fileContent; 
    NodeId m_blockId;
    NodeId m_clockingBlockId;
    std::vector<Signal> m_signals;
};

};

#endif /* CLOCKINGBLOCK_H */


