From 055b8df385393ebb995cac67f63ff63a858a3bc0 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 11 Sep 2018 01:51:00 -0700 Subject: [PATCH] systemc: Implement sc_semaphore. Change-Id: I778d41bd81880e76caa71dc92359a00127d8f987 Reviewed-on: https://gem5-review.googlesource.com/c/12617 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/channel/sc_semaphore.cc | 28 ++++++++++++------------- src/systemc/ext/channel/sc_semaphore.hh | 6 +++++- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/systemc/channel/sc_semaphore.cc b/src/systemc/channel/sc_semaphore.cc index cfae59804..ba52c199b 100644 --- a/src/systemc/channel/sc_semaphore.cc +++ b/src/systemc/channel/sc_semaphore.cc @@ -34,43 +34,41 @@ namespace sc_core { -sc_semaphore::sc_semaphore(int) : +sc_semaphore::sc_semaphore(int value) : sc_interface(), sc_semaphore_if(), - sc_object(sc_gen_unique_name("semaphore")) + sc_object(sc_gen_unique_name("semaphore")), _value(value) {} -sc_semaphore::sc_semaphore(const char *name, int) : - sc_interface(), sc_semaphore_if(), sc_object(name) +sc_semaphore::sc_semaphore(const char *name, int value) : + sc_interface(), sc_semaphore_if(), sc_object(name), _value(value) {} int sc_semaphore::wait() { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + while (trywait() == -1) + ::sc_core::wait(posted); return 0; } int sc_semaphore::trywait() { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); - return 0; -} + if (!_value) + return -1; -int -sc_semaphore::post() -{ - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + _value--; return 0; } int -sc_semaphore::get_value() const +sc_semaphore::post() { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + if (_value++ == 0) + posted.notify(); return 0; } -const char *sc_semaphore::kind() const { return "sc_semaphore"; } +int sc_semaphore::get_value() const { return _value; } } // namespace sc_core diff --git a/src/systemc/ext/channel/sc_semaphore.hh b/src/systemc/ext/channel/sc_semaphore.hh index fb1e82547..31af9c708 100644 --- a/src/systemc/ext/channel/sc_semaphore.hh +++ b/src/systemc/ext/channel/sc_semaphore.hh @@ -30,6 +30,7 @@ #ifndef __SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_HH__ #define __SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_HH__ +#include "../core/sc_event.hh" #include "../core/sc_object.hh" #include "sc_semaphore_if.hh" @@ -47,7 +48,7 @@ class sc_semaphore : public sc_semaphore_if, public sc_object virtual int post(); virtual int get_value() const; - virtual const char *kind() const; + virtual const char *kind() const { return "sc_semaphore"; } private: // Disabled @@ -56,6 +57,9 @@ class sc_semaphore : public sc_semaphore_if, public sc_object {} sc_semaphore &operator = (const sc_semaphore &) { return *this; } + + int _value; + sc_event posted; }; } // namespace sc_core -- 2.30.2