systemc: Implement sc_semaphore.
authorGabe Black <gabeblack@google.com>
Tue, 11 Sep 2018 08:51:00 +0000 (01:51 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 9 Oct 2018 21:46:26 +0000 (21:46 +0000)
Change-Id: I778d41bd81880e76caa71dc92359a00127d8f987
Reviewed-on: https://gem5-review.googlesource.com/c/12617
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/channel/sc_semaphore.cc
src/systemc/ext/channel/sc_semaphore.hh

index cfae598048c4ea5ad8fb7a584d7a28d61dd3c552..ba52c199bbc90e859bd45b8eb7b445fe11e8d25b 100644 (file)
 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
index fb1e82547c757705612edbcfedf65ac44e30dee5..31af9c708db5bda3723481113ffb7c3bb780b5d3 100644 (file)
@@ -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