pygen.cc revision 12813
112813Sandreas.sandberg@arm.com/* 212813Sandreas.sandberg@arm.com * Copyright (c) 2018 ARM Limited 312813Sandreas.sandberg@arm.com * All rights reserved 412813Sandreas.sandberg@arm.com * 512813Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall 612813Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual 712813Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 812813Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 912813Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1012813Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1112813Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1212813Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form. 1312813Sandreas.sandberg@arm.com * 1412813Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 1512813Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 1612813Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 1712813Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 1812813Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1912813Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 2012813Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 2112813Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 2212813Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 2312813Sandreas.sandberg@arm.com * this software without specific prior written permission. 2412813Sandreas.sandberg@arm.com * 2512813Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2612813Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2712813Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2812813Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2912813Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3012813Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3112813Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3212813Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3312813Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3412813Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3512813Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3612813Sandreas.sandberg@arm.com * 3712813Sandreas.sandberg@arm.com * Authors: Andreas Sandberg 3812813Sandreas.sandberg@arm.com */ 3912813Sandreas.sandberg@arm.com#include "cpu/testers/traffic_gen/pygen.hh" 4012813Sandreas.sandberg@arm.com 4112813Sandreas.sandberg@arm.com#include "config/have_protobuf.hh" 4212813Sandreas.sandberg@arm.com#include "debug/TrafficGen.hh" 4312813Sandreas.sandberg@arm.com#include "params/PyTrafficGen.hh" 4412813Sandreas.sandberg@arm.com#include "sim/init.hh" 4512813Sandreas.sandberg@arm.com 4612813Sandreas.sandberg@arm.comnamespace py = pybind11; 4712813Sandreas.sandberg@arm.com 4812813Sandreas.sandberg@arm.comPyTrafficGen::PyTrafficGen(const PyTrafficGenParams *p) 4912813Sandreas.sandberg@arm.com : BaseTrafficGen(p) 5012813Sandreas.sandberg@arm.com{ 5112813Sandreas.sandberg@arm.com} 5212813Sandreas.sandberg@arm.com 5312813Sandreas.sandberg@arm.comvoid 5412813Sandreas.sandberg@arm.comPyTrafficGen::start(pybind11::object meta_generator) 5512813Sandreas.sandberg@arm.com{ 5612813Sandreas.sandberg@arm.com metaGenerator = meta_generator.begin(); 5712813Sandreas.sandberg@arm.com BaseTrafficGen::start(); 5812813Sandreas.sandberg@arm.com} 5912813Sandreas.sandberg@arm.com 6012813Sandreas.sandberg@arm.comstd::shared_ptr<BaseGen> 6112813Sandreas.sandberg@arm.comPyTrafficGen::nextGenerator() 6212813Sandreas.sandberg@arm.com{ 6312813Sandreas.sandberg@arm.com if (!metaGenerator) 6412813Sandreas.sandberg@arm.com return std::shared_ptr<BaseGen>(); 6512813Sandreas.sandberg@arm.com 6612813Sandreas.sandberg@arm.com if (metaGenerator == py::iterator::sentinel()) { 6712813Sandreas.sandberg@arm.com DPRINTF(TrafficGen, "No more generators available.\n"); 6812813Sandreas.sandberg@arm.com return std::shared_ptr<BaseGen>(); 6912813Sandreas.sandberg@arm.com } 7012813Sandreas.sandberg@arm.com 7112813Sandreas.sandberg@arm.com try { 7212813Sandreas.sandberg@arm.com DPRINTF(TrafficGen, "Casting to C++ base class.\n"); 7312813Sandreas.sandberg@arm.com std::shared_ptr<BaseGen> gen = 7412813Sandreas.sandberg@arm.com metaGenerator->cast<std::shared_ptr<BaseGen>>(); 7512813Sandreas.sandberg@arm.com metaGenerator++; 7612813Sandreas.sandberg@arm.com return gen; 7712813Sandreas.sandberg@arm.com } catch (py::cast_error) { 7812813Sandreas.sandberg@arm.com fatal("Meta generator didn't return a valid trace generator\n"); 7912813Sandreas.sandberg@arm.com } 8012813Sandreas.sandberg@arm.com} 8112813Sandreas.sandberg@arm.com 8212813Sandreas.sandberg@arm.comvoid 8312813Sandreas.sandberg@arm.compybind_init_tracers(py::module &m_native) 8412813Sandreas.sandberg@arm.com{ 8512813Sandreas.sandberg@arm.com using namespace pybind11::literals; 8612813Sandreas.sandberg@arm.com 8712813Sandreas.sandberg@arm.com py::module m = m_native.def_submodule("trace"); 8812813Sandreas.sandberg@arm.com 8912813Sandreas.sandberg@arm.com py::class_<BaseGen, std::shared_ptr<BaseGen>> c_base(m, "BaseGen"); 9012813Sandreas.sandberg@arm.com} 9112813Sandreas.sandberg@arm.com 9212813Sandreas.sandberg@arm.comstatic EmbeddedPyBind _py_tracers("trace", pybind_init_tracers); 9312813Sandreas.sandberg@arm.com 9412813Sandreas.sandberg@arm.comPyTrafficGen* 9512813Sandreas.sandberg@arm.comPyTrafficGenParams::create() 9612813Sandreas.sandberg@arm.com{ 9712813Sandreas.sandberg@arm.com return new PyTrafficGen(this); 9812813Sandreas.sandberg@arm.com} 9912813Sandreas.sandberg@arm.com 100